基于神经网络的双决策变量优化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
相关产品推荐
相关产品推荐

