优化模型放入循环配合持久求解器重优化,函数封装是否可行?
优化模型循环重优化实现问题解答
你当前的代码无法正常运行,存在以下几处核心错误:
- 数据提取函数
extract_data定义不符合调用逻辑- 定义时未声明接收
file参数,但你调用时传入了文件参数,运行时会直接报参数数量不匹配错误 - 函数内部未使用传入的文件读取数据,如果你原本的
ID_Dayoff等变量是全局变量,循环读取不同文件时无法对应到当前文件的数据 - 末尾
return无返回值,你用data = extract_data(file)接收的结果会是None,后续构建模型无有效数据输入
- 定义时未声明接收
- 模型构建函数存在基础语法错误
- 未声明接收
data参数,构建模型所需的N/R/P等参数无合法输入来源 - 未先初始化Pyomo的
ConcreteModel实例,直接对model对象赋值属性会报变量未定义错误 - 末尾
return无返回值,你用model = construct_model(data)接收的结果会是None,无法调用solve方法
- 未声明接收
- 持久求解器逻辑缺失
你要使用持久求解器完成重优化,不能每次迭代都新建求解器实例,需要完成求解器和模型的绑定,修改模型参数后调用对应更新方法再重求解
可运行的修改参考
1. 修正数据提取函数
def extract_data(file_path): # 此处添加读取file_path对应文件的代码,替换原本的全局数据读取逻辑 Nurse_DayoffID_D = {} UDay_ID = [] ID_Dayoff = {} # 从传入的file_path读取生成该变量 for k,v in ID_Dayoff.items(): for x,d in enumerate(v): Nurse_DayoffID_D[(k,x+10)]=d UDay_ID.append(x+10) # 其余数据处理逻辑保持不变 # 最后将所有构建模型需要的参数打包为字典返回 return { "N": 护士集合, "S": 班次集合, "D": 日期集合, "R": 人力需求矩阵, "P": 班次对集合, "Penalty_Sigma": 惩罚系数1, "Penalty_Tau": 惩罚系数2 # 其余需要的参数全部在此处返回 }
2. 修正模型构建函数
from pyomo.environ import ConcreteModel, Set, Var, Objective, Constraint, minimize def construct_model(data): # 先初始化Pyomo实体模型实例 model = ConcreteModel() # 从传入的data参数中读取所有需要的参数 model.N = Set(initialize=data["N"]) model.S = Set(initialize=data["S"]) model.D = Set(initialize=data["D"]) R = data["R"] P = data["P"] Penalty_Sigma = data["Penalty_Sigma"] Penalty_Tau = data["Penalty_Tau"] # 此处添加你原本的变量定义逻辑 # model.w = Var(...) # model.r = Var(...) # model.x = Var(...) # 目标、约束逻辑保持不变 def obj_function(model): return sum(Penalty_Sigma * model.w[n,d1,d2] + Penalty_Tau * model.r[n,d1,d2] for (d1,d2) in P) model.ObjFunction = Objective(rule=obj_function, sense=minimize) def constraint_1(model, s, d): return sum(model.x[n, s, d] for n in model.N) == R[d,s] model.C1 = Constraint(model.S, model.D, rule=constraint_1) # 其余约束逻辑保持不变 # 最后返回构建完成的模型实例 return model
3. 修正循环调用逻辑(适配持久求解器)
from pyomo.environ import SolverFactory files = ["你的第一个数据文件路径", "你的第二个数据文件路径"] # 替换为你的文件列表 for file in files: data = extract_data(file) model = construct_model(data) # 实例化持久求解器,示例为gurobi,可替换为你使用的求解器对应持久版本 solver = SolverFactory("gurobi_persistent") # 绑定当前模型到求解器 solver.set_instance(model) # 首次求解 solver.solve() # 此处添加首次求解结果保存逻辑 for iter in range(你的迭代次数): # 此处添加修改模型参数/约束右值/变量上下界的逻辑 # 修改完成后调用持久求解器的更新方法同步修改到求解器内核 solver.update() # 重优化 solver.solve() # 此处添加当前迭代结果保存逻辑
内容的提问来源于stack exchange,提问作者Katsu
相关产品推荐
相关产品推荐

