跳转到主要内容

使用gurobi变量指数在二维数组中

回答

评论

10评论

  • JaromiłNajman
    Gurobi员工Gurobi员工

    我不确定我理解正确你的意图。

    你想访问给定矩阵的值通过\ \ (L \) (\ texttt {L[[我]][E [j]]} \) ?这是不可能的,因为\ (E \)是一个优化变量,而不是一个索引。你能澄清你想什么模型?你看看我们吗gurobipy介绍视频吗?您可能还想要看一看我们的矩阵的例子和我们的网络研讨会矩阵的API

    1
  • 拉梅什辛格
    好奇的
    健谈的人

    谢谢你的快速回复,是的E是一个优化变量,初始值,例如,E数组包含E [1] = 2, E [2] = 5。第一个问题是如何初始化优化变量和第二我可以用E [j]作为矩阵L。在这个例子中矩阵的指数L。实际上,我想最大化t[我]通过寻找最优值E[1]和[2]。我是新手用户,请帮助谢谢。

    0
  • JaromiłNajman
    Gurobi员工Gurobi员工

    初始化变量,我认为你应该更好的使用addVars方法,而不是addMVar方法。

    使用优化变量作为其他条目的指标是不容易的,讨论的文章使用一个决策变量作为索引。一般来说,我不建议使用优化变量作为索引,而是试图用模型来避免它。然而,这并不总是可能的和/或容易。

    1
  • 拉梅什辛格
    好奇的
    健谈的人

    谢谢你宝贵的建议,我改变数组从addMVar E addVars和初始化的值E [1] = 2, E [2] = 5。然后下面的代码是不给eror。它是优化E E [1] = 1, E [2] = 1。所以在这种情况下使用优化变量E指数不给错误。请检查我是否有interepreted正确与否。谢谢你!

    进口gurobipy全科医生
    从gurobipy进口伽马线暴
    进口numpy nmp1
    进口numpy。随机nmp
    A = nmp1.array([0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 3、4、3、4、3、4]) # 1到16日指数0是未使用的
    PN = nmp1.array ([[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 2, 3, 4, 5, 6, 7, 8], [0、9、10、11、12、13、14、15、16]]) # PN [1], PN [2], PN[0]未使用
    L = nmp.uniform(2、5、大小= (6,6))# L [1] [1], [1] [2],…L [5] [5]
    我的范围(1,6):#对角线元素是零
    j的范围(1,6):
    如果(i = = j):
    L[我][j] = 0
    打印(L[我][j])
    print (“\ n”)

    E_initial = nmp1.array ([0、2、5])

    #创建一个新的模型
    m = gp.Model (“mip1”)

    E = m。addVars(3磅= 1,乌兰巴托= 5,vtype = GRB.INTEGER name = " E ") # E[1],[2],[0]未使用
    t = m。vtype = GRB.CONTINUOUS addMVar(17日,name = " t ") # E[1],[2],[0]未使用
    rt = m.addVar (vtype = GRB.CONTINUOUS name = rt)

    我的范围(1、3):
    E[我]= E_initial[我]

    m。GRB.MINIMIZE setObjective (rt)
    m.addConstr (rt = = gp。max_ (t[我]我的范围(1、16)),name = " c2 ")

    j的范围(1、3):
    因我在PN [j]。
    如果我! = 0:
    m.addConstr ((t[我]= = L[[我]][E [j]]), name = " c1 ") m.optimize ()

    在m.getVars v ():
    打印(' % s % g ' % (v。VarName, v.X))
    打印(“Obj: % g”% m.ObjVal)
    0
  • JaromiłNajman
    Gurobi员工Gurobi员工

    请检查我是否有interepreted正确与否。

    你优化的模型不是你期待的。你是第一个定义\ (\ texttt {E} \)是一个tupledict优化变量。

    E = m。addVars(3磅= 1,乌兰巴托= 5,vtype = GRB.INTEGER name = " E ") # E[1],[2],[0]未使用

    但是,你覆盖每个条目这本字典的常量值

    我的范围(1、3):
    E[我]= E_initial[我]

    从这里,条目\ (\ texttt {E E[1],[2]} \)不再是优化变量只是不断的整数值。也请注意,您不使用\ (\ texttt {E[0]} \)因为你循环\ (\ texttt{范围(1、3)}\)代替\ (\ texttt{范围(0,3)}\)。

    如果你想提供一个优化变量的初始值(也称为MIP开始,cf。我怎么用MIP开始吗?),您必须设置Start属性的变量

    我的范围(1、3):
    E[我]。开始= E_initial[我]

    与上面的变化,你会得到一个预期的错误从numpy说明你不能访问索引通过使用一个优化变量。这就是这个职位使用一个决策变量作为索引是必要的。

    也许你可以试着用模型,将每个条目\ (L \) \ (E_j \)与相应的变量。也许通过引入一些辅助二进制变量,你可以达到你想要的。

    1
  • 拉梅什辛格
    好奇的
    健谈的人

    谢谢你宝贵的建议,我试图从数组索引删除优化变量E。我添加了新的决策变量E_decision (E_decision [1] [1], E_decision [1] [2], .... E_decision [1] [5]

    E_decision E_decision [2] [1], [2] [2], .... E_decision [2] [5])。之后我改变了约束“m.addConstr ((t[我]= = L[[我]][E [j]]), name = " c1 ") m.optimize ()”

    “m。addConstr (t[我]= =总和(L[[我]][k] * E_decision [j] [k] k范围内(1,6)),name =“c1”)”

    在更新约束我希望右手边优化值k(即。L[[我]][k])分配给t[我],所以我应该使用什么函数?,使用金额是否正确。Earliear E [j]被k的原地,和E [j]可能值从1到5。现在我给k, k值从1到5。如何从rhs优化值和assigne lh的约束。此外,一个新的contraint补充道

    j的范围(1、3):
    m。addConstr(总和(E_decision [j] [k] k范围内(1,6))= = 1)

    这个约束是用来确保只有一个k是j默认值是决定

    0 1 0,0,0 #和只能1

    0,0,0,0,1 #和只能1

    请回答我怀疑我做了修改后的正确与否。

    进口gurobipy全科医生
    从gurobipy进口伽马线暴
    进口numpy nmp1
    进口numpy。随机nmp
    M = 5
    A = nmp1.array([0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 5, 3, 4, 5, 3、4]) # 1到16日指数0是未使用的
    PN = nmp1.array ([[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 2, 3, 4, 5, 6, 7, 8], [0、9、10、11、12、13、14、15、16]]) # PN [1], PN [2], PN[0]未使用

    L_initial = nmp.uniform(2、5、大小= (6,6))# L [1] [1], [1] [2],……L[5][5]我的范围(1,6):#对角线元素是零

    E = nmp1.array ([0、2、5])

    #创建一个新的模型
    m = gp.Model (“mip1”)

    t = m。vtype = GRB.CONTINUOUS addMVar(17日,name = " t ") # E[1],[2],[0]未使用
    rt = m.addVar (vtype = GRB.CONTINUOUS name = rt)
    E_decision = m.addMVar((3、6)磅= 0,乌兰巴托= 1,vtype =伽马线暴。二进制,name = " E_decision ")
    L = m.addMVar ((6,6), vtype = GRB.CONTINUOUS name = " latency_mec_host ")

    #初始化优化变量
    j的范围(1、3):
    k范围内(1,6):
    E_decision [j] [k] .Start = 0
    j的范围(1、3):
    E_decision [j] [E [j]] .Start = 1

    m。GRB.MINIMIZE setObjective (rt)
    m.addConstr (rt = = gp。max_ (t[我]我的范围(1、16)),name = " c2 ")

    我的范围(1,6):
    j的范围(1,6):
    m.addConstr (L[我][j] = = L_initial[我][j], name = " l1 ")

    j的范围(1、3):
    因我在PN [j]。
    如果我! = 0:
    m。addConstr (t[我]= =总和(L[[我]][k] * E_decision [j] [k] k范围内(1,6)),name = " c1 ")
    #新的约束
    j的范围(1、3):
    m。addConstr(总和(E_decision [j] [k] k范围内(1,6))= = 1)#优化模型
    m.optimize ()


    在m.getVars v ():
    打印(' % s % g ' % (v。VarName, v.X))
    打印(“Obj: % g”% m.ObjVal)

    0
  • JaromiłNajman
    Gurobi员工Gurobi员工

    嗨,拉梅什,

    你的想法绝对是正确的,你的代码看起来像它应该。

    可以肯定的是,你应该仔细检查的正确性最优解点和最优的客观价值。

    一边注意。你总是开始循环指数1。然而,你所有的变量定义索引0开始,所有这些变量定义但从未使用过。这不是一个问题一般来说只要你保持一致,但可能导致潜在问题当你试图扩展代码或一些变量索引0陷入一些约束。您目前正在使用addMVar定义矩阵变量。这是没有必要你不使用矩阵API。既然你想开始与1的索引,您可以使用addVars方法和提供各自的范围。

    t = m.addVars(范围(17),vtype = GRB.CONTINUOUS name = " t ") # E[1],[2],[0]未使用
    rt = m.addVar (vtype = GRB.CONTINUOUS name = rt)
    E_decision = m.addVars(范围(1,3),范围(1,6)磅= 0,乌兰巴托= 1,vtype =伽马线暴。二进制,name = " E_decision ")
    L = m.addVars(范围(1,6),范围(1,6),vtype = GRB.CONTINUOUS name = " latency_mec_host ")

    请注意,addVars方法返回一个tupledict而不是一个兆乏对象。因此,您必须访问不同的条目,例如,\ (\ texttt {E_decision [j, k]} \)代替\ (\ texttt {E_decision [j] [k]} \)。调整代码应该类似

    进口gurobipy全科医生
    从gurobipy进口伽马线暴
    进口numpy nmp1
    进口numpy。随机nmp

    M = 5
    A = nmp1.array([0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 5, 3, 4, 5, 3、4]) # 1到16日指数0是未使用的
    PN = nmp1.array ([[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 2, 3, 4, 5, 6, 7, 8], [0、9、10、11、12、13、14、15、16]]) # PN [1], PN [2], PN[0]未使用

    L_initial = nmp.uniform(2、5、大小= (6,6))# L [1] [1], [1] [2],……L[5][5]我的范围(1,6):#对角线元素是零

    E = nmp1.array ([0、2、5])

    #创建一个新的模型
    m = gp.Model (“mip1”)

    t = m.addVars(范围(17),vtype = GRB.CONTINUOUS name = " t ") # E[1],[2],[0]未使用
    rt = m.addVar (vtype = GRB.CONTINUOUS name = rt)
    E_decision = m.addVars(范围(1,3),范围(1,6)磅= 0,乌兰巴托= 1,vtype =伽马线暴。二进制,name = " E_decision ")
    L = m.addVars(范围(1,6),范围(1,6),vtype = GRB.CONTINUOUS name = " latency_mec_host ")

    #初始化优化变量
    j的范围(1、3):
    k范围内(1,6):
    E_decision [j, k] .Start = 0
    j的范围(1、3):
    E_decision [j, E [j]] .Start = 1

    m。GRB.MINIMIZE setObjective (rt)
    m.addConstr (rt = = gp。max_ (t[我]我的范围(1、16)),name = " c2 ")

    我的范围(1,6):
    j的范围(1,6):
    m.addConstr (L (i, j) = = L_initial[我][j], name = " l1 ")

    j的范围(1、3):
    因我在PN [j]。
    如果我! = 0:
    m。addConstr (t[我]= =总和(L[[我],k] * E_decision (j, k) k范围(1,6)),name = " c1 ")
    #新的约束
    j的范围(1、3):
    m。addConstr(总和(E_decision (j, k) k范围(1,6))= = 1)#优化模型
    m.optimize ()
    m.write (“myLP.lp”)

    在m.getVars v ():
    打印(' % s % g ' % (v。VarName, v.X))
    打印(“Obj: % g”% m.ObjVal)

    注意,我添加了方法调用将生成一个人类可读的LP文件名为\ (\ texttt {myLP.lp} \)。你可以在任何文本编辑器中打开这个文件和分析模型看起来是否你希望它是什么。这是有用的在分析模型的正确性。

    最好的问候,
    Jaromił

    1
  • 拉梅什辛格
    好奇的
    健谈的人

    非常感谢你的帮助和有价值的建议和修正。现在工作正常。一个疑问,当我打印E_decision优化二进制变量,它是打印0,而定义二进制和磅= 0,乌兰巴托= 1,为什么,会有问题。谢谢你!

    E_decision [1] 1
    E_decision [1, 2] 0
    E_decision [1,3] 0
    E_decision [1,4] 0
    E_decision [1,5] 0
    E_decision (2, 1) 0
    E_decision (2, 2) 0
    E_decision [2、3] 0
    E_decision (2、4) 0
    E_decision (2、5) 1

    1
  • JaromiłNajman
    Gurobi员工Gurobi员工

    Gurobi内部处理二进制文件作为双值和公差等工作IntFeasTol。因此,有可能是一个二进制变量不是真正0或1,但只有“几乎”0或1。

    请参阅stackoverflow职位双精度值负0为更多的细节。

    0
  • 拉梅什辛格
    好奇的
    健谈的人

    好,非常感谢。

    0

登录留下你的评论。