DOcplexException:预期可迭代错误

Posted

技术标签:

【中文标题】DOcplexException:预期可迭代错误【英文标题】:DOcplexException: Expecting iterable Error 【发布时间】:2021-11-13 00:58:51 【问题描述】:

我正在处理一个需要多个工作日的车辆路线问题。我想添加约束条件,如果工作日是 6 天或其乘数,则工人必须只工作 240 分钟。因此,我为工作日 (k) 和工人 (w) 放置了两个循环,每个 k 和 w,我想确保总旅行和服务时间不超过预定时间 (S)。正如你在我的代码中看到的那样,我每天使用 if else 结构 240 和 480 分钟。但是,我得到了“DOcplexException: Expecting iterable Error”并看到了这个:

OcplexException:期待可迭代,得到:480x_0_1_1_1 + 100x_0_2_1_1 + 480x_0_3_1_1 + 20x_0_4_1_1 + 300x_0_5_1_1 + 100x_0_6_1_1 + 200x_0_7_1_1 + 480x_0_8_1_1 + 80x_0_9_1_1 + 200x_0_10_1_1 + 120x_0_11_1_1 + 260x_0_12_1_1 + 280x_0_13_1_1 + 340x_0_14_1_1 + 400x_0_15_1_1 + 120x_0_16_1_1 + 80x_0_17_1_1 + 50x_0_18_1_1 + 20x_0_19_1_1 + 320x_0_20_1_1 + 180x_0_21_1_1+50x_0_22_1_1+100x_0_23_1_1+80x_0_24_1_1+140 ...

约束如下:

# for w in W:
#     for k in D:
#         if k%6==0:
#             mdl.add_constraints(mdl.sum((distanceList[i][j]*6/7000)*x[i, j, w, k] for i in N for j in N if j != i) + mdl.sum(serviceTime[j-1]*x[i, j, w, k] for i in V for j in N if j != i) <= S*0.5) 
#         else:
#             mdl.add_constraints(mdl.sum((distanceList[i][j]*6/7000)*x[i, j, w, k] for i in N for j in N if j != i) + mdl.sum(serviceTime[j-1]*x[i, j, w, k] for i in V for j in N if j != i) <= S)

非常感谢您的帮助!谢谢。

【问题讨论】:

【参考方案1】:

Model.add_constraints() 需要一个列表或一个理解(两者都有效),换句话说,是可以迭代的东西。根据您发布的(不可执行的)代码 sn-p,我的印象是 add_constraints 的参数是一个约束:

Model.add_constraints( mdl.sum(a[i,w,k]) + mdl.sum(b[i,w,k]) <= S)

这是不被接受的。 您应该将 add_constraints 的参数转换为 Python 理解,例如:

Model.add_constraints( mdl.sum(a[i,w,k]+mdl.sum(b[i,w,k]

因此,add_constraints 收到了预期的理解。如果部分约束取决于索引 w,k 在理解中使用辅助函数。让我举一个 rhs 的例子:

  def my_rhs(wk,k): # rhs of the constraint as a function of w,k
     ... return w+k % 42 # silly example

  Model.add_constraints( mdl.sum(a[i,w,k]+mdl.sum(b[i,w,k] <= my_rhs(w,k) for w in W for k in K)

【讨论】:

Philippe Couronne,非常感谢您的帮助!老实说,我试图找到一种仅根据天数和工人数更改服务时间的方法,但是,我没有考虑定义一个相应地返回服务时间的函数。这是一个聪明的解决方案。再次非常感谢你,它工作得很好!! Python 是一门很棒的语言!

以上是关于DOcplexException:预期可迭代错误的主要内容,如果未能解决你的问题,请参考以下文章

预期可迭代,但没有找到一个字段

Django 迁移错误:错误:“选择”必须是可迭代的(例如,列表或元组)

迭代器未按预期运行

可迭代扩展不区分大小写排序

可过滤在 Recyclerview 中无法按预期工作

无法解压缩不可迭代的numpy.float64对象python3 opencv