运行这个代码出来的值都是一样的是为什么def sp2(pi,perovertimecost,normal_mean,numpatient,patient_sequence): s2 = gp.Model("sp2") n = 5 bnewplan2 = s2.addVars(range(n), range(numpatient), vtype=GRB.BINARY, name='bnewplan2') s2.setObjective(np.sum(bnewplan2[q,i](pi[i]-perovertimecostnormal_mean[i]) for q in range(n) for i in range(numpatient)),GRB.MAXIMIZE) s2.addConstrs(np.sum(bnewplan2[q,i]*normal_mean[i] for i in range(numpatient)) +80-optime<=optime+fixedcost/perovertimecost for q in range(n)) s2.setParam(GRB.Param.PoolSearchMode, 2) # 设置解集池搜索模式为完全搜索 s2.setParam(GRB.Param.PoolSolutions, 10) # 设置解集池最大存储解的数量 # 求解模型 s2.optimize() # 输出最优解 print('最优解:', s2.objVal) # 输出解集池中的解 for i in range(s2.SolCount): s2.setParam(GRB.Param.SolutionNumber, i) # 设置当前输出的解编号 print('解', i+1, ':', s2.objVal) return objVal objVal = sp2(pi,perovertimecost,normal_mean,numpatient,patient_sequence)
时间: 2024-04-18 08:28:34 浏览: 97
这段代码中,每次运行时都会生成一个新的模型s2,然后对这个模型进行优化求解。由于代码中没有给出变量的具体值,我无法判断为什么每次运行都得到相同的结果。可能是因为给定的输入参数是相同的,或者代码中没有使用随机化的部分。如果你希望每次运行得到不同的结果,你可以尝试给输入参数提供不同的值,或者在代码中加入一些随机化的部分。
相关问题
这个代码def sp1(pi,perovertimecost,normal_mean,numpatient,patient_sequence): s1 = gp.Model("sp1") m=5 # 定义变量 bnewplan1 = [] for q in range(m): bnewplan1.append([]) for i in range(numpatient): bnewplan1[q].append(s1.addVar(vtype='B', name='bnewplan1')) s1._x = bnewplan1 #设置约束条件 s1.setObjective(np.sum(pi[i]*bnewplan1[q][i] for i in range(numpatient) for q in range(m)),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 = [] def mycallback(s1, where = None): bnewplan1= s1._x if where == GRB.Callback.MIPSOL: x_sol = s1.cbGetSolution(bnewplan1) feasible_solutions.append(x_sol) # 设置回调函数 s1.optimize(mycallback) # 打印所有可行解 for sol in feasible_solutions: # m = len(feasible_solutions) print('sol',sol) return sol sol = sp1(pi,perovertimecost,normal_mean,numpatient,patient_sequence)中报错UnboundLocalError: local variable 'sol' referenced before assignment该怎么解决
在你的代码中,`sol` 是在 `for sol in feasible_solutions` 循环中进行赋值的,但是如果 `feasible_solutions` 是空的,循环将不会执行,因此 `sol` 没有被赋值就被引用了,导致报错。
为了解决这个问题,你可以在定义 `sol` 之前初始化它,并在循环结束后检查是否有可行解被找到,然后再返回 `sol`。参考下面的代码修改:
```python
def sp1(pi, perovertimecost, normal_mean, numpatient, patient_sequence):
s1 = gp.Model("sp1")
m = 5
# 定义变量
bnewplan1 = []
for q in range(m):
bnewplan1.append([])
for i in range(numpatient):
bnewplan1[q].append(s1.addVar(vtype='B', name='bnewplan1'))
s1._x = bnewplan1
# 设置约束条件
s1.setObjective(np.sum(pi[i] * bnewplan1[q][i] for i in range(numpatient) for q in range(m)), 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 = []
def mycallback(s1, where=None):
bnewplan1 = s1._x
if where == GRB.Callback.MIPSOL:
x_sol = s1.cbGetSolution(bnewplan1)
feasible_solutions.append(x_sol)
# 设置回调函数
s1.optimize(mycallback)
# 检查是否有可行解被找到
if len(feasible_solutions) > 0:
sol = feasible_solutions[-1] # 最后一个可行解
print('sol', sol)
return sol
else:
print('No feasible solutions found.')
return None
sol = sp1(pi, perovertimecost, normal_mean, numpatient, patient_sequence)
```
在这个修改后的代码中,我在循环之前初始化了 `sol`,并在循环结束后检查了 `feasible_solutions` 的长度,如果大于0,则将最后一个可行解赋值给 `sol`。如果没有找到可行解,将返回 `None`。
请根据你的具体需求进行适当的修改,并确保在调用 `sp1` 函数时,至少能找到一个可行解。
def mycallback(s, where = None): global feasible_solutions # 在函数中使用全局变量 x = s._x # 获取变量x if where == GRB.Callback.MULTIOBJ: # 获取当前得到的解 x_sol = s.cbGetSolution(x) feasible_solutions.append(x_sol) # 将解添加到列表中 elif where == GRB.Callback.MIPSOL: # 当找到下一个可行解时,也将其添加到列表中 obj_bound =s.cbGet(GRB.Callback.MIPSOL_OBJBND) if obj_bound is not None and obj_bound < GRB.INFINITY: feasible_solutions.append(s.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是空列表 呢?
在你的代码中,`feasible_solutions` 是一个全局变量,用于存储找到的可行解。然而,它在 `mycallback` 函数中被初始化为一个空列表 `[]`,并在每次调用 `sp1` 函数时都会被重新初始化。
这意味着在每次调用 `mycallback` 函数时,`feasible_solutions` 都会被重置为空列表。因此,在 `sp1` 函数中打印 `feasible_solutions` 的时候,它会是一个空列表。
要解决这个问题,你可以将 `feasible_solutions` 的初始化移到 `sp1` 函数之外,这样它就不会被重新初始化了。以下是修改后的代码示例:
```python
def mycallback(s, where = None):
global feasible_solutions # 在函数中使用全局变量
x = s._x # 获取变量x
if where == GRB.Callback.MULTIOBJ:
# 获取当前得到的解
x_sol = s.cbGetSolution(x)
feasible_solutions.append(x_sol) # 将解添加到列表中
elif where == GRB.Callback.MIPSOL:
# 当找到下一个可行解时,也将其添加到列表中
obj_bound =s.cbGet(GRB.Callback.MIPSOL_OBJBND)
if obj_bound is not None and obj_bound < GRB.INFINITY:
feasible_solutions.append(s.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
feasible_solutions = [] # 初始化全局变量
sp_obj = sp1(pi,perovertimecost,normal_mean,numpatient,patient_sequence)
```
在这个示例中,我将 `feasible_solutions` 的初始化移到 `sp1` 函数之外,并将其设置为空列表。这样,在每次调用 `sp1` 函数时,`feasible_solutions` 不会被重新初始化,并且可以正确地存储找到的可行解。
请注意,在修改后的代码中,你需要在调用 `sp1` 函数之前初始化 `feasible_solutions` 列表。这样,`feasible_solutions` 就会在整个程序中被共享,并且可以正确地存储和访问其中的解。
阅读全文