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

基于神经网络的双决策变量优化predicted_Pel报错求助

多变量优化神经网络输出的解决方案

问题描述

单决策变量(Tco)优化时可正常最小化神经网络输出的predicted_Pel,但使用双决策变量(Tco和Tei)时触发错误:

ValueError: operands could not be broadcast together with shapes (3,) (2,)

错误原因

训练神经网络时,特征集包含3个变量:Tco、Tei、m_cond,但双变量优化时仅传入了2个决策变量,输入维度(2维)与模型期望的特征维度(3维)不匹配,导致广播运算失败。

解决方案

需保证优化时传入的特征数量与训练时一致:

  • 若m_cond是固定已知值,优化时将其作为常量传入模型;
  • 若m_cond也作为决策变量,将其定义为Gekko变量并加入输入列表。

以下是完整可运行代码,包含神经网络训练+双变量优化流程:

import pandas as pd
import numpy as np
from gekko.ML import Gekko_NN_SKlearn, CustomMinMaxGekkoScaler
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPRegressor
from gekko import GEKKO

# 1. 数据集准备
data = {
    'Tco': [303.9599915, 303.6700134, 303.5799866, 303.7799988, 303.8200073, 304.1000061, 304.0400085, 304.0,
            303.9500122, 304.25],
    'Tei': [287.8900146, 287.8399963, 287.7799988, 287.8099976, 287.8299866, 287.8200073, 287.8399963, 287.8900146,
            287.8399963, 287.8800049],
    'm_cond': [0.000259306, 0.000266121, 0.000265435, 0.000266299, 0.000266172, 0.000266147, 0.000266071, 0.000266147,
               0.000266757, 0.000267444],
    'Pel': [874.0000129, 873.0000257, 871.999979, 875.9999871, 878.000021, 885.9999776, 884.9999905, 883.0000162,
            882.0000291, 889.9999857]
}

df = pd.DataFrame(data)
X = df[['Tco','Tei', 'm_cond']].values
Y = df['Pel'].values

# 2. 训练神经网络
# 数据缩放
scaler_x = CustomMinMaxGekkoScaler()
X_scaled = scaler_x.fit_transform(X)
scaler_y = CustomMinMaxGekkoScaler()
Y_scaled = scaler_y.fit_transform(Y.reshape(-1,1))

# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, Y_scaled, test_size=0.2, random_state=42)

# 训练MLP模型
mlp = MLPRegressor(hidden_layer_sizes=(10,10), max_iter=1000, random_state=42)
mlp.fit(X_train, y_train.ravel())

# 准备Gekko缩放器(用于优化时的特征转换)
mma = {'x': scaler_x, 'y': scaler_y}

# 3. 双决策变量优化(Tco + Tei,m_cond设为固定值)
m = GEKKO()

# 定义决策变量
Tco = m.Var(value=303.5, lb=303, ub=304)
Tei = m.Var(value=287.8, lb=287, ub=288)
# 固定m_cond为数据集中的均值
m_cond_fixed = m.Const(np.mean(df['m_cond']))

# 传入全部3个特征(2个变量+1个常量)
predicted_Pel = Gekko_NN_SKlearn(mlp, mma, m).predict([Tco, Tei, m_cond_fixed])

# 最小化目标
m.Minimize(predicted_Pel)

# 求解
m.solve(disp=False)

# 输出结果
print('Optimized Tco:', Tco.value[0])
print('Optimized Tei:', Tei.value[0])
print('Optimized Predicted Pel:', predicted_Pel.value[0])
print('Gekko Solvetime:', m.options.SOLVETIME, 's')

扩展说明

  • 若需要三个决策变量(Tco+Tei+m_cond),只需将m_cond_fixed改为Gekko变量即可:
    m_cond = m.Var(value=np.mean(df['m_cond']), lb=0.00025, ub=0.00027)
    predicted_Pel = Gekko_NN_SKlearn(mlp, mma, m).predict([Tco, Tei, m_cond])
    
  • 决策变量的初始值建议设置在数据范围内(如均值),避免因初始值偏离太远导致求解困难。

内容的提问来源于stack exchange,提问作者Athar's Chem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:59:53