与决策变量”的循环发生:错误代码0:约束没有bool值(你尝试“磅< = expr < =乌兰巴托”?)
回答你好,
我一直在做一个MIP Gurobi在Python编程。9.1.2 Gurobi优化器版本构建v9.1.2rc0 (win64)。
错误代码的错误代码0:约束没有bool值(你尝试“磅< = expr < =乌兰巴托”?)发生当我在写一个约束如下所示:
试一试:
m =模型()
x = m.addVars (tof.keys (), vtype =伽马线暴。连续的,name = ' x ')
z = m.addVars (tdf.keys (), vtype =伽马线暴。连续的,name = ' z ')
t = 0
t的范围(288):
在tof.keys f ():
如果x [f] < = t, t < = x [f] + 6:
m.addConstr (y。总和(‘*’、‘*’)< = qk c2)
其他:
t + = 1
如果x [f] < = t < = x [f]:
在fleetType: p
m.addConstr (y。总和(‘*’,p) < = xp, c8)
其他:
t + = 1
在上面的约束中,变量x z [f]和[f]不参与约束,然而他们之间的时期是先决条件。如果方便,请帮我如何写正确。非常感谢! !
顺便说一下,x和z是辅助变量与其他两个约束条件:
f的航班:
m。addConstr (x [f] = = Deptime_base [f] + v (f),“auxiliary1”)
m。addConstr (z [f] = = x [f] +摩根富林明[f] +延迟+ u [f],“auxiliary2”)
-
变量对象没有价值,因此,不能用于\ (\ texttt{如果}\)条款或任何类似的检查。这意味着检查\ (\ texttt {x} \ [f] < = t)构建模型时无法评估。你必须制定通过额外的二进制变量和约束条件语句。请您看一看我怎么在Gurobi模型条件语句?为更多的细节。
一旦你制定了条件语句,您可以使用GurobiaddGenConstrAnd方法制定”和“条件第一\ (\ texttt{如果}\)条款。
你第二个\ \ texttt{如果}\)条款实际上读取\ (\ texttt{如果x [f] = t)然后添加约束}\)。制定一个平等检查\ (x \)是一个连续变量是很棘手的。的课件发布在一个整数程序中,我怎么能强迫一个二进制变量等于1如果某些条件?描述了一个好方法。
最好的问候,
Jaromił0 -
谢谢!然而,第二条件子句有打字错误,代码是:
t = 0
t的范围(288):
在tof.keys f ():
如果x [f] < = t, t < = x [f] + 6:
m.addConstr (y。总和(‘*’、‘*’)< = qk c2)
其他:
t + = 1
如果x [f] < = t < =z [f]:
在fleetType: p
m.addConstr (y。总和(‘*’,p) < = xp, c8)
其他:
t + = 1我想它可以使用相同的方法解决第一个条件子句?
0 -
嗨了!我修改了代码压缩是这样的:
s = m.addVar (vtype =伽马线暴。二进制、名称=“s”)
h = m.addVar (vtype =伽马射线爆发。二进制,name = " h ")
h2 = m.addVar (vtype =伽马线暴。二进制,name = " h2 ")
x2 = m.addVar (vtype =伽马线暴。二进制名称=“x2”)
y2 = m.addVar (vtype =伽马线暴。二进制名称= y2)t的范围(288):
在tof.keys f ():
m。addConstr (t > = x [f] - M * (1)、“BigM1-1”)
m。addConstr (t < = x [f] + M *年代,“BigM1-2”)
m。addConstr (x [f] + 6 > = t - M *(1小时),“BigM2-1”)
m。addConstr (x [f] + 6 < = t + M * h, BigM2-2)
m。addConstr (z [f] > = t - M * (1-h2),“BigM3-1”)
m。addConstr (z [f] < = t + M * h2, BigM3-2)
m。addGenConstrAnd (x2, [s h],“andConstr1”)
m。addGenConstrAnd (y2,年代,h2, andConstr2)
t = 0
t的范围(288):
如果x2 = = 1:
m.addConstr (y。总和(‘*’、‘*’)< = qk c2)
其他:
t + = 1
如果y2 = = 1:
在fleetType: p
m.addConstr (y。总和(‘*’,p) < = xp, c8)
其他:
t + = 1然而,错误仍然发生:
错误代码0:约束没有bool值(你尝试“磅< = expr < =乌兰巴托”?)
我没有得到什么?
0 -
我想它可以使用相同的方法解决第一个条件子句?
是的,没错。
然而,错误仍然发生:
错误代码0:约束没有bool值(你尝试“磅< = expr < =乌兰巴托”?)
我没有得到什么?
如前所述在我的第一个消息,是不可能使用Var对象比较。因此,\ (\ texttt{如果}\)条款\ (\ texttt{如果x2 = = 1} \)和\ (\ texttt{如果y2 = = 1} \)导致一个错误。你必须制定这些\ (\ texttt{如果}\)语句的帮助下二进制变量和等式约束。幸运的是,在你的情况下你可以使用Gurobi指标约束制定你的\ \ texttt{如果}\)语句。
我不明白的是,为什么你循环\ (\ texttt {t} \),当你只有一个变量\ (\ texttt {x2} \)和\ (\ texttt {y2} \)。
最好的问候,
Jaromił0 -
我得到了它。我需要设置不同的变量,它会与循环时间t。谢谢你的帮助! ! ! !
0 -
嗨Jaromił,
我再次尝试使用下面这样的代码:
试一试:
m =模型()x = m.addVars (tof.keys(),磅= 0,乌兰巴托= 287,vtype =伽马线暴。连续的,name = ' x ')
z = m.addVars (tdf.keys(),磅= 0,乌兰巴托= 287,vtype =伽马线暴。连续的,name = ' z ')
s = m。addVars(288年,vtype =伽马线暴。二进制、名称=“s”)
h = m。addVars(288年,vtype =伽马线暴。二进制,name = " h ")
h2 = m。addVars(288年,vtype =伽马线暴。二进制,name = " h2 ")
x2 = m。addVars(288年,vtype =伽马线暴。二进制名称=“x2”)
y2 = m。addVars(288年,vtype =伽马线暴。二进制名称= y2)t的范围(288):
在tof.keys f ():
m。addConstr (t > = x [f] - M * (1 s [t]),“BigM1-1”)
m。addConstr (t < = x [f] + M * s [t],“BigM1-2”)
m。addConstr (x [f] + 6 > = t - M *(1小时[t]),“BigM2-1”)
m。addConstr (x [f] + 6 < = t + M * h [t],“BigM2-2”)
m。addConstr (z [f] > = t - M * (1-h2 [t]),“BigM3-1”)
m。addConstr (z [f] < = t + M * h2 [t],“BigM3-2”)t的范围(288):
m。addGenConstrAnd (x2 [t], [[t], h [t]],“andConstr1”)
m。addGenConstrAnd (y2 [t], [[t], h2 [t]],“andConstr2”)t的范围(288):
m。addGenConstrIndicator (x2 [t],真的,y。总和(‘*’、‘*’)< = qk c2)
m。addGenConstrIndicator (y2 [t],真的,y。总和(‘*’,p) < = xp, c8)然而,错误:错误代码10003:额外的论点提供了通用约束指标类型的发生。
也许通过addGenConstrIndicator x2 [t]和y2 [t]不能决策变量?
这样的话,我想知道如何形成代码的逻辑状态,如果如果x2 [t] = = 1(这是由约束决定“andConstr1”和“andConstr2”)必须满足约束。
谢谢你!
最好的问候,
Jingyue
0 -
嗨Jingyue,
的addGenConstrIndicator方法有参数\ (\ texttt {(binvar binval, lh, = None, rhs = None, name = " ")} \)。(\ \ texttt {lh} \)参数可以是一个浮动,Var, LinExpr或TempConstr对象。如果你提供一个TempConstr对象\ \ texttt {lh} \)参数,你不会提供\ (\ texttt{感觉}\)和\ (\ texttt {rhs} \)参数。在这种情况下,您必须显式地指定,您定义\ (\ texttt{名称}\)参数。
t的范围(288):
m。addGenConstrIndicator (x2 [t],真的,y。总和(‘*’、‘*’)< = qk name = ' c2 ')
m。addGenConstrIndicator (y2 [t],真的,y。总和(‘*’,p) < = xp, name = ' c8 ')最好的问候,
Jaromił0 -
嗨Jaromił,
你的建议是非常有用的。我试着和消失的错误。
今天我回顾了我的代码,发现的逻辑可能是错的。
我想要表达的逻辑是:
“t”代表离散时间,和有288个时间窗口。对于任何时间t,如果大M约束对决策变量x [f]和z [f]感到满意(s、h、h2, x2, y2, z2是任何时候的二进制变量t),然后andconstrs发生,然而现在我的代码看起来像t是一个整数,它循环从0到287。
试一试:
m =模型()
打印(“建筑模型”)x = m.addVars (tof.keys(),磅= 0,乌兰巴托= 287,
vtype =伽马线暴。连续的,name = ' x ')
z = m.addVars (tdf.keys(),磅= 0,乌兰巴托= 287,vtype =伽马线暴。连续的,name = ' z ')
s = m。addVars(288年,vtype =伽马线暴。二进制、名称=“s”)
h = m。addVars(288年,vtype =伽马线暴。二进制,name = " h ")
h2 = m。addVars(288年,vtype =伽马线暴。二进制,name = " h2 ")x2 = m。addVars(288年,vtype =伽马线暴。二进制名称=“x2”)
y2 = m。addVars(288年,vtype =伽马线暴。二进制名称= y2)t的范围(288):
在tof.keys f ():
m。addConstr (t [f] > = x [f] - M * (1 s [t]),“BigM1-1”)
m。addConstr (t [f] < = x [f] + M * s [t],“BigM1-2”)
m。addConstr (x [f] + 6 > = t [f] - M *(1小时[t]),“BigM2-1”)
m。addConstr (x [f] + 6 < = t [f] + M * h [t],“BigM2-2”)
m。addConstr (z [f] > = t [f] - M * (1-h2 [t]),“BigM3-1”)
m。addConstr (z [f] < = t [f] + M * h2 [t],“BigM3-2”)
t的范围(288):
m。addGenConstrAnd (x2 [t], [[t], h [t]],“andConstr1”)
m。addGenConstrAnd (y2 [t], [[t], h2 [t]],“andConstr2”)t的范围(288):
m。addGenConstrIndicator (x2 [t],真的,y。总和(‘*’,‘*’),伽马线暴。qk LESS_EQUAL, c2)
m。addGenConstrIndicator (y2 [t],真的,y。总和(‘*’,p),伽马线暴。LESS_EQUAL、xp、c8)我想知道有什么方法来表达逻辑对吧?
再次感谢你的帮助! ! ! ! !
你的,
Jingyue
0 -
你需要模型变量指数作为优化变量。这是可能的但相当昂贵。这是讨论的社区使用一个决策变量作为索引。
最好的问候,
Jaromił0 -
嗨Jaromił,
我想我几乎从邮局你共享。它表达了一种指数x [t]安迪Andconstraints [t]。
然而,我仍然很不会如何表达大胆的一部分”对于任何时间t,如果大M约束对决策变量x [f]和z [f]感到满意(s、h、h2, x2, y2, z2是任何时候的二进制变量t),然后andconstrs发生”。
很抱歉打扰你,如果我的问题是愚蠢的:)
0 -
这就是它变得棘手。你会介绍288 \ \ * \)tof.keys () t变量和模型的大m约束特定t[我f]。然后,您可以使用t[我f] andconstr作为索引。
0 -
嗨Jaromił,
再次谢谢你的建议。很有用! ! ! !
我定义了t[我f],是这样的:
因为我在范围(288):
f的航班:
tindex[我f] = 0试一试:
m =模型()x = m.addVars (tof.keys(),磅= 0,乌兰巴托= 287,vtype =伽马线暴。连续的,name = ' x ')
z = m.addVars (tdf.keys(),磅= 0,乌兰巴托= 287,vtype =伽马线暴。连续的,name = ' z ')
s = m。addVars(288年,vtype =伽马线暴。二进制、名称=“s”)
h = m。addVars(288年,vtype =伽马线暴。二进制,name = " h ")
h2 = m。addVars(288年,vtype =伽马线暴。二进制,name = " h2 ")
x2 = m。addVars(288年,vtype =伽马线暴。二进制名称=“x2”)
y2 = m。addVars(288年,vtype =伽马线暴。二进制名称= y2)
ui = m.addVars(288年,vtype =伽马线暴。二进制,name = ' ui ')
t = m.addVars (tindex.keys (), vtype =伽马线暴。二进制,name = ' t ')m.addConstr (ui.sum (“*”) = = 1,“index2”)
因为我在范围(288):
在tof.keys f ():
m。addConstr(我* ui[我]= = t[我f],“index1”)
m。addConstr (t(我f) > = x [f] - M * (1 s [f]),“BigM1-1”)
m。addConstr (t(我f) < = x [f] + M * s [f],“BigM1-2”)
m。addConstr (x [f] + 6 > = t [f]我- M *(1小时[f]),“BigM2-1”)
m。addConstr (x [f] + 6 < = t[我f] + M * h [f],“BigM2-2”)
m。addConstr (z [f] > = t [f]我- M * (1-h2 [f]),“BigM3-1”)
m。addConstr (z [f] < = t[我f] + M * h2 [f],“BigM3-2”)
m。addGenConstrAnd (x2 [f], [[f], h [f]],“andConstr1”)
m。addGenConstrAnd (y2 [f], [[f], h2 [f]],“andConstr2”)t的范围(288):
m。addGenConstrIndicator (x2 [t],真的,y。总和(‘*’,‘*’),伽马线暴。qk LESS_EQUAL, c2)
m。addGenConstrIndicator (y2 [t],真的,y。总和(‘*’,p),伽马线暴。LESS_EQUAL、xp、c8)发生错误:KeyError:“3848669”
“3848669”是一个关键tof.keys ()
同样,如果我试着用这个约束:
因为我在范围(288):
在tof.keys f ():
m。addConstr(和(我* ui[我])= = t)和(‘*’,f),“index1”)
“TypeError:‘gurobipy。LinExpr' object is not iterable" occurs.我糊涂了,不知道哪里出问题了。
0 -
错误不iterable对象是因为\ (\ texttt{我* ui[我]}\)是一个LinExpr对象不是一个iterable对象例如列表。如果你想所有指数\ (\ texttt{我}\),你应该试一试
在tof.keys f ():
m。addConstr (quicksum(我* ui[我]范围(288))= = t.sum (‘*’, f),“index1”)我不知道KeyError。它指向一个“out-of-array”访问。我猜这是一些不匹配\ \ texttt{航班}\)和\ (\ texttt {tof.keys ()} \)。
注意,您定义\ (\ texttt {t} \)作为优化变量,所以你绝对不应该使用它在你\ (\ texttt的{}\)循环。
因为我在范围(288):
m。addGenConstrIndicator (x2[我],真的,y。总和(‘*’,‘*’),伽马线暴。qk LESS_EQUAL, c2)
m。addGenConstrIndicator (y2[我],真的,y。总和(‘*’,p),伽马线暴。LESS_EQUAL、xp、c8)希望这个有帮助。
0 -
非常感谢! ! ! !
我试着和它的工作原理!
0
请登录留下你的评论。
评论
14日的评论