You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化模型放入循环配合持久求解器重优化,函数封装是否可行?

优化模型循环重优化实现问题解答

你当前的代码无法正常运行,存在以下几处核心错误:

  • 数据提取函数extract_data定义不符合调用逻辑
    1. 定义时未声明接收file参数,但你调用时传入了文件参数,运行时会直接报参数数量不匹配错误
    2. 函数内部未使用传入的文件读取数据,如果你原本的ID_Dayoff等变量是全局变量,循环读取不同文件时无法对应到当前文件的数据
    3. 末尾return无返回值,你用data = extract_data(file)接收的结果会是None,后续构建模型无有效数据输入
  • 模型构建函数存在基础语法错误
    1. 未声明接收data参数,构建模型所需的N/R/P等参数无合法输入来源
    2. 未先初始化Pyomo的ConcreteModel实例,直接对model对象赋值属性会报变量未定义错误
    3. 末尾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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 12:06:04