我必须尝试从非基于类的编码风格转变为基于类的编码风格,但面临一个问题。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 开发人员会做出回应。