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:预期可迭代错误的主要内容,如果未能解决你的问题,请参考以下文章