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

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',原因有两点:

  1. 约束中直接使用整个索引变量集合(如model.PowerPlant1Size)与数值相乘,Pyomo不支持这种操作,必须引用具体索引的变量;
  2. 电厂规模变量无需按时段索引——电厂规模是固定参数,不会随时段变化,原变量定义逻辑冗余。

修正后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:25:21