第一个整数可行点回调
正在进行的嘿,
我想第一个整数可行点快(或更准确地说,其目标价值),然后终止优化过程和思考这样做通过一个回调。
不幸的编译器告诉我以下几点:
gurobipy.gurobipy。GurobiError:回调参数必须是一个函数
这是我的回调,我如何开始优化:
defcb(自我,模型,的地方):
如果= = GRB.Callback.MIPSOL:
自我.ub = model.cbGet (GRB.Callback.MIPSOL_OBJ)
model.terminate ()
自我.m.optimize (自我.cb)
自我。m是我处理的MILP模型(基于类中设置)。任何建议,为什么回调函数是不被认为是一个函数?
最好的,
卢卡斯
0
-
你好卢卡斯,
一个更简单的方法可能是使用SolutionLimit参数作为终止条件。通过设置SolutionLimit参数1,优化将终止一旦找到一个可行的解决方案。
回答你的问题关于回调,因为发生错误
self.cb
不是一个函数。它是一个对象的一个实例方法。在Python中是有区别的方法和函数。方法调用一个对象,它就不能生存没有一个对象调用它。然而,调用一个函数是独立的,通过它的名称。为了解决这个问题有两种选择:
- 第一个选项是让
self.cb
方法静态方法如下所示:
类方法:
@staticmethod
def cb(模型):
如果在哪里= = GRB.Callback.MIPSOL:
model._ub= model.cbGet(GRB.Callback.MIPSOL_OBJ)
model.terminate ()- 第二个选项是定义回调函数外的类,并将它作为参数传递给方法调用
优化()
方法。
将数据传递给回调函数,你应该做的模型对象。你应该定义语句
model._ub= float("inf")
在优化开始之前,那么你的回调函数的值可以查询model._ub
。注意,用户数据字段的名称必须与下划线开始。你会发现下面的代码片段有用至少你感兴趣的工作的例子。
进口gurobipy
从gurobipy进口伽马线暴
类模型:
def__init__(自我):
自我。模型= gurobipy.read(“例子/数据/ glass4.mps”)
#初始化上界
self.model。_ub =浮动(正)
@staticmethod
def cb(模型):
如果在哪里= = GRB.Callback.MIPSOL:
model._ub= model.cbGet(GRB.Callback.MIPSOL_OBJ)
model.terminate ()
def get_first_solution(自我):
self.model.optimize (Model.cb)
打印(f“乌兰巴托:{self.model._ub}”)
if __name__ = =“__main__”:
模型= ()
model.get_first_solution ()最好的问候,
Maliheh
0 - 第一个选项是让
-
嗨Maliheh,
谢谢你的快速回答,SolutionLimit设置为1的解决方案方法对我的用例是完全可行的。也谢谢你解释回调的问题!
最好的,卢卡斯
0 -
如下的方式使用嵌套函数一个合理的方法?我有很多实例属性,我需要通过回调。
我很好奇如果有任何延迟可能出现回调访问实例数据(例如,大型数据矩阵)从一个嵌套的函数。
进口gurobipy
从gurobipy进口伽马线暴
类模型:
def __init__(自我):
自我。模型= gurobipy.read(“例子/数据/ glass4.mps”)
#初始化上界
# self.model。_ub =浮动(正)
self.ub =浮动(正)
def get_first_solution(自我):
def cb(模型):
如果在哪里= = GRB.Callback.MIPSOL:
自我。乌兰巴托= model.cbGet (GRB.Callback.MIPSOL_OBJ) #请注意自我的使用
model.terminate ()
self.model.optimize (cb)
打印(f“乌兰巴托:{self.ub}”)0
请登录留下你的评论。
评论
3评论