跳转到主要内容

从函数返回模型在python中gurobi接口

回答

评论

6个评论

  • 伊莱陶尔康
    Gurobi员工Gurobi员工

    你好,

    问题在于\ (\ texttt {x} \)变量只有在当地范围内定义的\ (\ texttt {createmodel()} \)功能。这意味着您将无法访问它之外的这个函数。

    相反,你可以返回模型Var对象:

    def createmodel ():
    m =模型()
    x = m.addVar (vtype = GRB.BINARY)
    返回m x

    m x = createmodel ()
    m.setObjective (x)

    或者,您可以定义一个单独的函数将变量添加到您的模型中,然后返回新创建的变量。

    def addMyVar(米):
    返回m.addVar (vtype = GRB.BINARY)

    模型= createmodel ()
    x = addMyVar(模型)
    model.setObjective (x)

    请注意,您可以随时使用Model.getVars ()获得您的模型变量的完整列表。当然,更方便的为每个组有个人Python变量模型变量。

    谢谢,

    伊莱

    0
  • Amogh Bhosekar
    Gurobi-versary
    健谈的人
    好奇的

    谢谢伊莱,

    我能够运行模型,然而我得到的解决方案是不同的。例如,我每次迭代只改变一个参数模型,在目标函数。这是我使用的两个方法。

    1)创建新模型在每个迭代中,新变量和参数更新

    2)设定新的目标使用setObjective()如上你解释在我创建的模型。只使用新参数,当我更新目标。

    我从这些方法获得不同的解决方案。有什么我错过吗?

    Amogh

    0
  • 伊莱陶尔康
    Gurobi员工Gurobi员工

    嗨Amogh,

    你能发布一个小的,独立的代码示例显示了这两种方法产生不同的解决方案?这将使它更容易告诉发生了什么。谢谢!

    伊莱

    0
  • Amogh Bhosekar
    Gurobi-versary
    健谈的人
    好奇的

    很难贴小例子。我跑6测试,100次迭代最大在每个方法给我上下界限。的,该模型能够获得相同的上界和下界在终止前4次。然而,它只能够获得正确下界100年之后在其他两个迭代。我的问题是,是否解决Gurobi做出不同的选择,如果我使用setObjective创建新变量和()。

    如果这是你不知道,我将试着看看能不能小的代码示例。然而看看代码,应该帮助。

    方法1


    def createmodel(参数):
    m =模型()
    x = m.addVar (vtype = GRB.BINARY)
    返回m x

    m x = createmodel(参数)

    因为我在范围(100):
    m。setObjective (f (x和参数)
    m.optimize ()
    y =复制(x) #我复制使用for循环
    obj_value = m.ObjVal
    更新参数

    方法2

    def createmodel(参数):
    m =模型()
    x = m.addVar (vtype = GRB.BINARY)
    m。setObjective (f (x和参数)
    m.optimize ()
    obj_value = m.ObjVal
    返回obj_value x


    因为我在范围(100):
    obj, x = createmodel(参数)
    y =复制(x) #我复制使用for循环
    更新参数
    0
  • 伊莱陶尔康
    Gurobi员工Gurobi员工

    嗨Amogh,

    谢谢你上传的代码片段。的目的是什么\ (\ texttt {y =复制(x)} \)在这些循环?你永远不要使用\ (\ texttt {y} \)在这些片段。无论如何,这并不向模型中添加一个新的变量,并复制Var对象不受支持。

    虽然你的两种方法非常相似,他们的行为当然可以使解算器有所不同。手机万博登录

    • 使用方法1,您创建一个模型和变量一次,然后在每次迭代简单地更新目标函数。在这种情况下,Gurobi可能热启动的解决与存储解决方案信息之前解决。这可能改变Gurobi解决问题时所采用的路径。
    • 使用方法2,您创建一个全新的模型和变量在每个迭代。这里,Gurobi解决问题完全从头开始在每个迭代。

    如果你只做些改变解决之间的模型,我建议使用方法1。说,如果这两种方法更新\ (\ texttt {param} \)相同的值在每个迭代中,你没有其他的变化模型,每种方法的最佳目标值应该在每个迭代匹配。

    这有帮助吗?谢谢!

    伊莱

    1
  • Amogh Bhosekar
    Gurobi-versary
    健谈的人
    好奇的

    谢谢伊莱。我的意思通过复制变量是为了保持变量的拷贝,我使用更新的“参数”。我不实际使用复制功能。方法1的工作对我来说很好。谢谢你!

    0

登录留下你的评论。