跳转到主要内容

创建二进制变量子集的具体指标nodepairs(边缘)

回答

评论

6个评论

  • JaromiłNajman
    Gurobi员工Gurobi员工

    你好,索菲娅,

    你可以以不同的方式构造边缘变量。一种方法是使用\ (\ texttt的{}\)循环和addVar方法,例如,

    进口gurobipy全科医生

    m = gp.Model(“测试”)
    E = [[0, 1], [1,2], [2、3]]
    e = {}
    艾凡:我的
    e[(我[0],[1]))= m。addVar (vtype = B, name = ' e % d % d %(我[0],[1]))

    m.update ()
    #访问变量通过e [0, 1], e [1、2], e (2、3)
    打印(e [0,1])

    或通过使用addVars方法

    进口gurobipy全科医生

    m = gp.Model(“测试”)
    E = [(0, 1), (1、2), (2, 3)]
    e = m。addVars (E, vtype = B, name = ' E ')

    m.update ()
    打印(e [0,1])
    打印(e [1,2])

    注意,在后一种情况下,条目\ (\ texttt {E} \)元组而不是列表的长度2。如果你不能改变你当前的代码来生成元组而不是列表的长度,你可以执行

    E = [[0, 1], [1,2], [2、3]]
    E =(元组(我)我的E)

    这将把每个列表\ (\ texttt{[0, 1],…} \)为元组\ (\ texttt {(0, 1),…} \)

    最好的问候,
    Jaromił

    0
  • 索菲娅贝克曼
    Gurobi-versary
    第一个评论
    第一个问题

    嗨Jaromił,

    谢谢你帮我解决一下这个问题。我构造变量首先建议使用for循环和它将正常工作。

    现在我struggeling与另一个问题关于我的一个约束:

    我创建了另一个变量v:

    v = {}
    因为我在边缘:
    v((我[0],[1]))=模型。addVar (vtype =“我”、名称=“v”+ str(我0)+“_”+ str(我1)))

    Model.addConstr (gp。边quicksum (e [[ij]] * d (ij) / v(边缘[ij]]的ij范围(len(边缘)))< = W * m - T) name = '约束5 ')

    由于v(边缘[ij]]是一个决策变量不是一个常数我得到以下Gurobi错误:

    “GurobiError:除数必须一个常数”

    你能给我一个提示就如何处理/解决这个问题吗?再次感谢你的helpt

    最好的问候,

    索菲娅

    0
  • JaromiłNajman
    Gurobi员工Gurobi员工

    你好,索菲娅,

    知识库文章我怎么在Gurobi除以一个变量?你寻求的答案。

    最好的问候,
    Jaromił

    0
  • 索菲娅贝克曼
    Gurobi-versary
    第一个评论
    第一个问题

    嗨Jaromił,

    是的,谢谢你,这正是我在寻找的。我试图效仿你的推荐文章,但仍然犯了一些错误我自己似乎无法解决。

    v = {}
    因为我在边缘:
    v((我[0],[1]))=模型。addVar (vtype =“我”、名称=“v”+ str(我0)+“_”+ str(我1)))

    #介绍连续变量z
    z =模型。addVar (vtype = ' C ' name = ' z ')

    #添加约束v * z = 1
    在ij范围(len(边缘)):
    模型。addConstr (z * v(边缘[ij]] = = 1)

    Model.addConstr (gp。边quicksum (e [[ij]] * d (ij) / z ij范围(len(边缘)))< = W * m - T))

    我仍然得到相同的Gurobi错误因子必须是常数(这是有道理的,因为z是一个决策变量,就像v) ?我误解了这篇文章了吗?

    再次很抱歉打扰. .

    最好的问候,

    索菲娅

    0
  • JaromiłNajman
    Gurobi员工Gurobi员工

    你好,索菲娅,

    注意,通过引入约束\ (z \ cdot v_ {ij} = 1 \)它认为\ (z = \压裂{1}{v_ {ij}} \)。因此,你的约束应该阅读

    Model.addConstr (gp。边quicksum (e [[ij]] * d (ij) * zij范围(len(边缘)))< = W * m - T))

    请注意,目前你介绍1辅助变量\ z(\)来代表所有部门由每个\ (v_ {ij} \)。然而,您应该引入一个辅助变量为每个变量\ \ (z \) (v_ {ij} \)

    v = {}
    z = {}
    边缘:
    v (((0),我1])]=模型。addVar (vtype =“我”、名称=“v”+ str(我0)+“_”+ str(我1)))
    z[(我[0),我1])]=模型。addVar (vtype =“我”、名称=“z”+ str(我0)+“_”+ str(我1)))

    #添加约束v * z = 1

    ij范围(len(边缘)):
    模型。边addConstr (z [[ij]] * v(边缘[ij]] = =1)

    Model.addConstr (gp。边quicksum (e [[ij]] * d (ij) * z (ij)ij范围(len(边缘)))< = W * m - T))

    如果变量\ \ texttt {e} \)和\ (\ texttt {d} \)都是优化变量,那么你将会引入额外的辅助变量处理三线性项,cf。我怎么模型在Gurobi多重线性方式?如果只有一个变量\ \ texttt {e} \)和\ (\ texttt {d} \)是一种优化变量,那么你很可能需要设置参数非凸= 2,因为你的模型是凸的。

    Model.setParam(“凸”,2)

    最好的问候,
    Jaromił

    0
  • 索菲娅贝克曼
    Gurobi-versary
    第一个评论
    第一个问题

    嗨Jaromił,

    非常感谢你的帮助!我按你的建议实施必要的辅助变量,设置参数凸= 2。我现在工作很好!

    谢谢你的时间!

    最好的祝福,索菲娅

    0

登录留下你的评论。