def mycallback(s1, where = None): global feasible_solutions # 在函数中使用全局变量 x = s1._x # 获取变量x if where == GRB.Callback.MULTIOBJ: # 获取当前得到的解 x_sol = s1.cbGetSolution(x) feasible_solutions.append(x_sol) # 将解添加到列表中 elif where == GRB.Callback.MIPSOL: # 当找到下一个可行解时,也将其添加到列表中 obj_bound =s1.cbGet(GRB.Callback.MIPSOL_OBJBND) if obj_bound is not None and obj_bound < GRB.INFINITY: feasible_solutions.append(s1.cbGetSolution(x)) #子问题1没超时 def sp1(pi,perovertimecost,normal_mean,numpatient,patient_sequence): s1 = gp.Model("sp1") m=5 bnewplan1 = s1.addVars(range(m), range(numpatient),vtype=GRB.BINARY,name='bnewplan1') s1._x = bnewplan1 #设置目标函数、约束条件 sp1obj = gp.quicksum(pi[i]*bnewplan1[q,i] for q in range(m) for i in range(numpatient)) s1.setObjective(sp1obj,GRB.MAXIMIZE) s1.addConstrs(gp.quicksum(bnewplan1[q,i]*normal_mean[i] for i in range(numpatient)) +80-optime<=0 for q in range(m)) global feasible_solutions feasible_solutions = [] # 声明全局变量 # 设置回调函数 s1.setParam(GRB.Param.SolutionLimit, 1e3) s1.params.outputFlag = 0 # 关闭输出 s1.optimize(mycallback) s1.optimize() sp_obj=s1.objval print('子问题的最优解为',sp_obj) print('feasible_solutions',feasible_solutions) return sp_obj sp_obj = sp1(pi,perovertimecost,normal_mean,numpatient,patient_sequence)为什么输出feasible_solutions是空列表 呢?
时间: 2024-04-15 09:29:39 浏览: 154
在你的代码中,`feasible_solutions` 是一个全局变量,用于存储找到的可行解。然而,在每次调用 `mycallback` 函数时,你都将 `feasible_solutions` 重新初始化为空列表。
为了解决这个问题,你可以将 `feasible_solutions` 的初始化移动到 `sp1` 函数之外,并将其作为参数传递给 `mycallback` 函数。
以下是修改后的代码示例:
```python
def mycallback(s1, where, feasible_solutions):
x = s1._x # 获取变量x
if where == GRB.Callback.MULTIOBJ:
# 获取当前得到的解
x_sol = s1.cbGetSolution(x)
feasible_solutions.append(x_sol) # 将解添加到列表中
elif where == GRB.Callback.MIPSOL:
# 当找到下一个可行解时,也将其添加到列表中
obj_bound =s1.cbGet(GRB.Callback.MIPSOL_OBJBND)
if obj_bound is not None and obj_bound < GRB.INFINITY:
feasible_solutions.append(s1.cbGetSolution(x))
# 子问题1没超时
def sp1(pi, perovertimecost, normal_mean, numpatient, patient_sequence):
s1 = gp.Model("sp1")
m = 5
bnewplan1 = s1.addVars(range(m), range(numpatient), vtype=GRB.BINARY, name='bnewplan1')
s1._x = bnewplan1
# 设置目标函数、约束条件
sp1obj = gp.quicksum(pi[i] * bnewplan1[q, i] for q in range(m) for i in range(numpatient))
s1.setObjective(sp1obj, GRB.MAXIMIZE)
s1.addConstrs(gp.quicksum(bnewplan1[q, i] * normal_mean[i] for i in range(numpatient))
+ 80 - optime <= 0 for q in range(m))
feasible_solutions = [] # 初始化列表
# 设置回调函数并传递 feasible_solutions 列表作为参数
s1.setParam(GRB.Param.SolutionLimit, 1e3)
s1.params.outputFlag = 0 # 关闭输出
s1.optimize(lambda s1, where: mycallback(s1, where, feasible_solutions))
s1.optimize()
sp_obj = s1.objval
print('子问题的最优解为', sp_obj)
print('feasible_solutions', feasible_solutions)
return sp_obj
sp_obj = sp1(pi, perovertimecost, normal_mean, numpatient, patient_sequence)
```
在这个示例中,我们将 `feasible_solutions` 作为参数传递给 `mycallback` 函数,并在回调函数中使用它来存储找到的可行解。这样,在每次调用 `mycallback` 函数时,`feasible_solutions` 都会保持为先前存储的值,而不会被重新初始化为空列表。
请注意,在调用 `s1.optimize()` 时,我们使用了一个匿名函数(lambda 函数)来传递 `feasible_solutions` 列表给回调函数。这样,我们可以在匿名函数中调用 `mycallback` 函数,并传递正确的参数。
这样修改后,你应该能够正确地将找到的解存储在 `feasible_solutions` 列表中并进行打印。
阅读全文