我必须尝试从非基于类的编码方式转换为基于类的编码方式,但是遇到了问题。optimize() 函数接受一个回调函数 mycallback()。 在非基于类的方法中,代码可以完美运行,但是当我将其移植到基于类的方法时,我收到了错误消息“mycallback()需要3个参数,但只提供了1个”。
在基于类的方法中传递回调函数的正确方式是什么?
(A) 非基于类的方法:
def mycallback(model, where):
pass
model = Model()
model.optimize(mycallback)
(B) 基于类的方法:
class A:
def __init__(self):
self.model = Model()
def solve(self):
# Try method 1:
self.model.optimize(self.mycallback()) <--- Error: mycallback() takes exactly 3 arguments (1 given)
# Try method 2:
# self.model.optimize(self.mycallback) <--- Error: Callback argument must be a function
def mycallback(self, model, where):
pass
虽然这是一个关于将回调函数传递给Gurobi(一种优化求解器)内置函数的问题,但我认为它更是一个关于如何将类中定义的回调函数传递给Python中的另一个函数的更一般性问题。
方法2的错误:
self.model.optimize(self.mycallback)
File "model.pxi", line 458, in gurobipy.Model.optimize (../../src/python/gurobipy.c:34263)
gurobipy.GurobiError: Callback argument must be a function
看起来可能是Gurobi API的问题。不知道是否会有任何Gurobi开发人员回复。
self.mycallback()
,将其作为参数传递给self.model.optimize(self.mycallback)
。 - bereal