Pyomo优化电厂规模时遇TypeError错误的解决方法
电厂负荷优化问题的Pyomo代码修正
问题背景
我正在求解一个双电厂满足多时段负荷需求的优化问题,核心是选择最优电厂规模以最小化成本。已知数据:
- 电厂单位规模发电量(分时段):
power_prod1 = [2, 0, 1] # 时段0/1/2的电厂1单位规模发电量 power_prod2 = [0, 1, 1] # 时段0/1/2的电厂2单位规模发电量
- 各时段负荷需求:
load_demand = [4, 4, 4]
- 电厂单位规模成本:
Costs = {'power1': 60, 'power2': 120}
原代码错误分析
运行原代码时抛出TypeError: unsupported operand type(s) for *: 'float' and 'IndexedVar',原因有两点:
- 约束中直接使用整个索引变量集合(如
model.PowerPlant1Size)与数值相乘,Pyomo不支持这种操作,必须引用具体索引的变量; - 电厂规模变量无需按时段索引——电厂规模是固定参数,不会随时段变化,原变量定义逻辑冗余。
修正后的完整代码
import pyomo.environ as pyo # 数据定义 power_prod1 = [2, 0, 1] power_prod2 = [0, 1, 1] load_demand = [4, 4, 4] Costs = {'power1': 60, 'power2': 120} # 初始化模型 model = pyo.ConcreteModel() # 定义集合:电厂、时段 model.plants = pyo.Set(initialize=['power1', 'power2']) model.periods = pyo.Set(initialize=range(len(load_demand))) # 定义决策变量:电厂规模(每个电厂一个变量,无时段索引) model.plant_size = pyo.Var(model.plants, bounds=(0, None)) # 负荷平衡约束:每个时段的发电量之和等于负荷需求 def load_balance_rule(model, j): prod1 = model.plant_size['power1'] * power_prod1[j] prod2 = model.plant_size['power2'] * power_prod2[j] return prod1 + prod2 == load_demand[j] model.load_balance = pyo.Constraint(model.periods, rule=load_balance_rule) # 目标函数:最小化总投资成本 def objective_rule(model): return sum(model.plant_size[p] * Costs[p] for p in model.plants) model.obj = pyo.Objective(rule=objective_rule, sense=pyo.minimize) # 求解模型 solver = pyo.SolverFactory('glpk') # 可替换为cplex/gurobi等商业求解器 result = solver.solve(model) # 输出结果 print("求解状态:", result.solver.status) print("最优电厂规模:") for p in model.plants: print(f"{p}: {pyo.value(model.plant_size[p])}") print("最小总成本:", pyo.value(model.obj))
关键修改点
- 变量定义优化:将原按
(plants, periods)索引的变量改为仅按plants索引,符合电厂规模固定的实际逻辑 - 约束修正:在约束规则中引用具体索引的变量(如
model.plant_size['power1']),而非整个变量集合,解决类型错误 - 补充完整逻辑:添加了目标函数定义、求解器调用及结果输出,形成可直接运行的完整代码
内容的提问来源于stack exchange,提问作者Erlend G H
相关产品推荐
相关产品推荐

