使用Pyomo求解家庭用电碳排放最小化线性优化问题的异常排查
问题根因分析
- 核心错误1:功率平衡约束(lastdeckung)中多余使用了
sum()函数:你的需求是每个时间步独立满足功率平衡,即t时刻的光伏出力 + t时刻电网购电量 = t时刻用电需求,你加了sum()后会把全周期8个时间步的供电侧数值全部累加,导致同一个求和结果需要同时匹配8个不同的负荷值,模型必然不可行。 - 次要写法问题:目标函数定义传入了多余的形参
t:全局优化目标是全周期碳排放总和,不需要按时间步迭代构造,传入t属于无用参数,且和内部sum循环的变量名重名,属于不规范写法。
修复后的代码
import pandas as pd from pyomo.environ import ConcreteModel, RangeSet, Param, Var, NonNegativeReals, Objective, Constraint, minimize # 读取数据部分保持不变 data = pd.read_excel(Stromsimulation, skiprows = 1, usecols=('A:E'), index_col = 0) df = pd.DataFrame(data) daten = df.to_dict() model = ConcreteModel() model.n = RangeSet(1, 8) model.verbrauch = Param(model.n, initialize = daten['Verbrauch']) model.eigenproduktion = Param(model.n, initialize = daten['Eigenproduktion']) model.stromimport = Param(model.n, initialize = daten['Import']) model.emissionen = Param(model.n, initialize = daten['CO2-Emissionen']) model.x = Var(model.n, within = NonNegativeReals) # 目标函数去掉多余的形参t def emissionsreduzierung(model): return sum(((model.x[t] * model.stromimport[t]) * model.emissionen[t] for t in model.n)) model.emissionsreduzierung = Objective(rule = emissionsreduzierung, sense = minimize) # 功率平衡约束去掉sum,只保留当前时间步t的计算 def lastdeckung(model, t): return model.eigenproduktion[t] + (model.stromimport[t] * model.x[t]) == model.verbrauch[t] model.lastdeckung = Constraint(model.n, rule = lastdeckung)
修复效果说明
修改后每个时间步的约束会独立对应本时刻的供需平衡,不会出现全周期求和的问题,模型即可正常求解。
内容的提问来源于stack exchange,提问作者saschav
相关产品推荐
相关产品推荐

