跳转到主要内容

与决策变量”的循环发生:错误代码0:约束没有bool值(你尝试“磅< = expr < =乌兰巴托”?)

回答

评论

14日的评论

  • JaromiłNajman
    Gurobi员工Gurobi员工

    变量对象没有价值,因此,不能用于\ (\ texttt{如果}\)条款或任何类似的检查。这意味着检查\ (\ texttt {x} \ [f] < = t)构建模型时无法评估。你必须制定通过额外的二进制变量和约束条件语句。请您看一看我怎么在Gurobi模型条件语句?为更多的细节。

    一旦你制定了条件语句,您可以使用GurobiaddGenConstrAnd方法制定”和“条件第一\ (\ texttt{如果}\)条款。

    你第二个\ \ texttt{如果}\)条款实际上读取\ (\ texttt{如果x [f] = t)然后添加约束}\)。制定一个平等检查\ (x \)是一个连续变量是很棘手的。的课件发布在一个整数程序中,我怎么能强迫一个二进制变量等于1如果某些条件?描述了一个好方法。

    最好的问候,
    Jaromił

    0
  • Jingyue张
    Gurobi-versary
    合作者
    好奇的

    谢谢!然而,第二条件子句有打字错误,代码是:

    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
  • Jingyue张
    Gurobi-versary
    合作者
    好奇的

    嗨了!我修改了代码压缩是这样的:

    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
  • JaromiłNajman
    Gurobi员工Gurobi员工

    我想它可以使用相同的方法解决第一个条件子句?

    是的,没错。

    然而,错误仍然发生:

    错误代码0:约束没有bool值(你尝试“磅< = expr < =乌兰巴托”?)

    我没有得到什么?

    如前所述在我的第一个消息,是不可能使用Var对象比较。因此,\ (\ texttt{如果}\)条款\ (\ texttt{如果x2 = = 1} \)和\ (\ texttt{如果y2 = = 1} \)导致一个错误。你必须制定这些\ (\ texttt{如果}\)语句的帮助下二进制变量和等式约束。幸运的是,在你的情况下你可以使用Gurobi指标约束制定你的\ \ texttt{如果}\)语句。

    我不明白的是,为什么你循环\ (\ texttt {t} \),当你只有一个变量\ (\ texttt {x2} \)和\ (\ texttt {y2} \)。

    最好的问候,
    Jaromił

    0
  • Jingyue张
    Gurobi-versary
    合作者
    好奇的

    我得到了它。我需要设置不同的变量,它会与循环时间t。谢谢你的帮助! ! ! !

    0
  • Jingyue张
    Gurobi-versary
    合作者
    好奇的

    嗨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
  • JaromiłNajman
    Gurobi员工Gurobi员工

    嗨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
  • Jingyue张
    Gurobi-versary
    合作者
    好奇的

    嗨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łNajman
    Gurobi员工Gurobi员工

    你需要模型变量指数作为优化变量。这是可能的但相当昂贵。这是讨论的社区使用一个决策变量作为索引

    最好的问候,
    Jaromił

    0
  • Jingyue张
    Gurobi-versary
    合作者
    好奇的

    嗨Jaromił,

    我想我几乎从邮局你共享。它表达了一种指数x [t]安迪Andconstraints [t]。

    然而,我仍然很不会如何表达大胆的一部分”对于任何时间t,如果大M约束对决策变量x [f]和z [f]感到满意(s、h、h2, x2, y2, z2是任何时候的二进制变量t),然后andconstrs发生”。

    很抱歉打扰你,如果我的问题是愚蠢的:)

    0
  • JaromiłNajman
    Gurobi员工Gurobi员工

    这就是它变得棘手。你会介绍288 \ \ * \)tof.keys () t变量和模型的大m约束特定t[我f]。然后,您可以使用t[我f] andconstr作为索引。

    0
  • Jingyue张
    Gurobi-versary
    合作者
    好奇的

    嗨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
  • JaromiłNajman
    Gurobi员工Gurobi员工

    错误不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
  • Jingyue张
    Gurobi-versary
    合作者
    好奇的

    非常感谢! ! ! !

    我试着和它的工作原理!

    0

登录留下你的评论。