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)
关键修改说明
- 移除numpy数组操作:所有涉及Pyomo决策变量的计算改用Python原生列表和生成器表达式,避免numpy强制转换变量类型
- 直接构建求和表达式:合同成本通过
sum()直接生成Pyomo符号化表达式,无需先存储到数组再求和 - 简化MCP计算逻辑:用列表推导式生成每个时段的MCP电量,再通过求和得到总成本,全程保持符号化运算
内容的提问来源于stack exchange,提问作者cirogalvao
相关产品推荐
相关产品推荐

