Pyomo无约束简单优化程序运行报错:无可行解问题排查
问题原因与解决办法
核心问题:遗漏约束注册
你定义了energy_balance约束逻辑,但没有将这个约束添加到模型实例中。此时模型没有任何约束,而目标函数是最小化sum(Pgrid),由于Pgrid允许取任意实数,这个目标可以无限趋向负无穷,属于无界优化问题。部分求解器(比如GLPK)会将无界问题标记为“无可行解”,最终导致变量值返回None。
解决:在定义energy_balance函数后,添加约束注册代码:
model.energy_balance = Constraint(model.T, rule=energy_balance)
其他潜在排查点
- 时间索引类型校验:确认
df的索引是datetime类型,否则df[start_date:end_date]无法正确筛选数据,导致参数初始化失败。执行df.index = pd.to_datetime(df.index)可确保索引格式正确。 - 参数键匹配检查:检查
model.T中的时间元素与Pbuilding、Ppv初始化字典的键是否完全一致(比如时区、字符串格式),键不匹配会导致参数绑定异常。 - 查看求解器日志:
tee=True会输出求解器详细日志,GLPK会明确提示问题是无界还是不可行,可帮助快速定位根源。
修正后的完整代码
start_date = '2023-06-01 00:00:00' end_date = '2023-06-02 23:59:59' # 确保DataFrame索引为datetime类型 df.index = pd.to_datetime(df.index) model = ConcreteModel() # 时间步集合 T = df[start_date:end_date].index.tolist() model.T = Set(initialize=T) # 初始化参数 model.Pbuilding = Param(model.T, initialize=df.loc[start_date:end_date, 'Building load [kWh]'].to_dict()) model.Ppv = Param(model.T, initialize=df.loc[start_date:end_date, 'PV load [kWh]'].to_dict()) # 定义变量 model.Pgrid = Var(model.T, domain=Reals) # 注册能量平衡约束 def energy_balance(model, t): return model.Pgrid[t] == model.Pbuilding[t] - model.Ppv[t] model.energy_balance = Constraint(model.T, rule=energy_balance) # 定义目标函数 def objective_rule(model): return sum(model.Pgrid[t] for t in model.T) model.obj = Objective(rule=objective_rule, sense=minimize) # 求解模型 solver = SolverFactory('glpk') solver.solve(model, tee=True) # 提取结果 results = pd.DataFrame(index=T) results['Pgrid'] = [model.Pgrid[t].value for t in T] print(results)
内容的提问来源于stack exchange,提问作者b-roijers
相关产品推荐
相关产品推荐

