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

Pyomo隐式转换错误咨询:数值转float失败的解决方案

解决Pyomo隐式转换错误问题

问题原因

错误核心是:Pyomo的符号化决策变量不能被numpy隐式转换为浮点数。你在代码中用np.zeros创建数组,并将Vol_CT1 * Horas[i]这类带Pyomo变量的表达式赋值给数组元素,numpy会尝试将这些符号化表达式强制转为float,触发了Pyomo的禁用隐式转换机制。

修复后的完整代码

!pip install -q pyomo
!apt-get install -y -qq glpk-utils

import pyomo.environ as pyo
from pyomo.environ import *
from pyomo.opt import SolverFactory


# 输入数据
Consumo_MWm = [3.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000,
               1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000]

PLD = [100.00, 100.00, 100.00, 100.00, 100.00, 100.00, 100.00, 100.00, 100.00, 100.00, 100.00, 100.00, 
       100.00, 100.00, 100.00, 100.00, 100.00, 100.00, 100.00, 100.00, 100.00, 100.00, 100.00, 100.00]

Horas = [730., 730., 730., 730., 730., 730., 730., 730., 730., 730., 730., 730., 
         730., 730., 730., 730., 730., 730., 730., 730., 730., 730., 730., 730.]

# 合同参数
# 合同1
Inic_vig_CT1 = 1
Fim_vig_CT1 = 12
Preço_CT1 = 200.00

# 合同2
Inic_vig_CT2 = 13
Fim_vig_CT2 = 24
Preço_CT2 = 200.00

# 合同3
Inic_vig_CT3 = 1
Fim_vig_CT3 = 24
Preço_CT3 = 200.00

# 预计算固定值
Consumo_MWh = [c * h for c, h in zip(Consumo_MWm, Horas)]

# 创建模型
model = pyo.ConcreteModel()

# 声明决策变量
model.Vol_CT1 = pyo.Var(domain=NonNegativeReals) # 合同1的容量(MWm)
model.Vol_CT2 = pyo.Var(domain=NonNegativeReals) # 合同2的容量(MWm)
model.Vol_CT3 = pyo.Var(domain=NonNegativeReals) # 合同3的容量(MWm)

Vol_CT1 = model.Vol_CT1
Vol_CT2 = model.Vol_CT2
Vol_CT3 = model.Vol_CT3

# 计算各合同成本与MCP成本
Custo_CT1 = sum(Vol_CT1 * Horas[i] * PLD[i] for i in range(24) if Inic_vig_CT1 <= i+1 <= Fim_vig_CT1)
Custo_CT2 = sum(Vol_CT2 * Horas[i] * PLD[i] for i in range(24) if Inic_vig_CT2 <= i+1 <= Fim_vig_CT2)
Custo_CT3 = sum(Vol_CT3 * Horas[i] * PLD[i] for i in range(24) if Inic_vig_CT3 <= i+1 <= Fim_vig_CT3)

Custo_CT_ALL = Custo_CT1 + Custo_CT2 + Custo_CT3

# 计算MCP部分成本
Volume_MCP_MWh = [Consumo_MWh[i] - 
                  (Vol_CT1 * Horas[i] if Inic_vig_CT1 <= i+1 <= Fim_vig_CT1 else 0) -
                  (Vol_CT2 * Horas[i] if Inic_vig_CT2 <= i+1 <= Fim_vig_CT2 else 0) -
                  (Vol_CT3 * Horas[i] if Inic_vig_CT3 <= i+1 <= Fim_vig_CT3 else 0) 
                  for i in range(24)]
Custo_MCP = sum(v * p for v, p in zip(Volume_MCP_MWh, PLD))

# 定义目标函数
model.obj = pyo.Objective(expr=Custo_CT_ALL + Custo_MCP, sense=minimize)
model.pprint()
print('=======================================================')

# 求解模型
opt = SolverFactory('glpk', executable='/usr/bin/glpsol')
opt.solve(model).write()

# 输出结果
Vol_CT1_value = pyo.value(Vol_CT1)
Vol_CT2_value = pyo.value(Vol_CT2)
Vol_CT3_value = pyo.value(Vol_CT3)

print('=======================================================')
print('合同1容量 = ', Vol_CT1_value)
print('合同2容量 = ', Vol_CT2_value)
print('合同3容量 = ', Vol_CT3_value)

关键修改说明

  1. 移除numpy数组操作:所有涉及Pyomo决策变量的计算改用Python原生列表和生成器表达式,避免numpy强制转换变量类型
  2. 直接构建求和表达式:合同成本通过sum()直接生成Pyomo符号化表达式,无需先存储到数组再求和
  3. 简化MCP计算逻辑:用列表推导式生成每个时段的MCP电量,再通过求和得到总成本,全程保持符号化运算

内容的提问来源于stack exchange,提问作者cirogalvao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:45:04