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

Python新手求助:神经网络+Gekko优化热泵功耗完整代码

热泵功耗预测与优化完整实现方案

核心问题解答

拟合后的神经网络模型完全可以用于Gekko优化问题,但需将训练好的模型转换为Gekko支持的计算形式(避免依赖TensorFlow/Keras的原生计算图,可通过导出模型权重,在Gekko中手动构建网络计算逻辑实现)。

完整代码实现

以下是针对12输入1输出(功耗)的全流程代码,包含数据预处理、神经网络训练、模型导入Gekko、功耗优化全步骤,注释清晰适配新手:

1. 环境准备

先在命令行执行以下命令安装依赖库:

pip install numpy pandas tensorflow gekko matplotlib

2. 完整运行代码

import numpy as np
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, InputLayer
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
from gekko import GEKKO

# --------------------------
# 步骤1:加载与预处理热泵数据
# --------------------------
# 替换为你的实际数据文件路径,确保前12列为输入变量,最后一列为功耗输出
data = pd.read_csv('heat_pump_data.csv')

# 分离输入(X)和输出(y)
X = data.iloc[:, :-1].values  # 提取前12个输入变量
y = data.iloc[:, -1].values   # 提取最后一列功耗数据

# 数据归一化(提升神经网络训练稳定性与优化精度)
scaler_X = MinMaxScaler(feature_range=(0, 1))
scaler_y = MinMaxScaler(feature_range=(0, 1))
X_scaled = scaler_X.fit_transform(X)
y_scaled = scaler_y.fit_transform(y.reshape(-1, 1))

# --------------------------
# 步骤2:训练神经网络模型
# --------------------------
# 构建全连接神经网络(可根据拟合效果调整层数/神经元数量)
model = Sequential()
model.add(InputLayer(input_shape=(12,)))  # 输入层:适配12个变量
model.add(Dense(16, activation='relu'))  # 隐藏层1:16个神经元,ReLU激活
model.add(Dense(8, activation='relu'))   # 隐藏层2:8个神经元,ReLU激活
model.add(Dense(1, activation='linear')) # 输出层:线性激活,输出功耗值

# 编译模型
model.compile(optimizer='adam', loss='mse')

# 训练模型,预留20%数据做验证
history = model.fit(X_scaled, y_scaled, epochs=100, batch_size=8, validation_split=0.2)

# 绘制训练损失曲线(可选,验证模型拟合效果)
plt.plot(history.history['loss'], label='训练损失')
plt.plot(history.history['val_loss'], label='验证损失')
plt.xlabel('迭代次数')
plt.ylabel('均方误差')
plt.legend()
plt.show()

# --------------------------
# 步骤3:将神经网络导入Gekko
# --------------------------
# 导出模型权重与偏置
weights = []
biases = []
for layer in model.layers:
    if 'dense' in layer.name:
        w, b = layer.get_weights()
        weights.append(w)
        biases.append(b)

# 初始化Gekko本地模型
m = GEKKO(remote=False)

# 创建12个输入变量,根据实际工况调整上下限
x = [m.Var(lb=0, ub=100) for _ in range(12)]

# 对输入变量做归一化(与训练阶段逻辑一致)
x_scaled = []
for i in range(12):
    x_min = scaler_X.data_min_[i]
    x_max = scaler_X.data_max_[i]
    x_scaled.append((x[i] - x_min)/(x_max - x_min))

# 在Gekko中重建神经网络计算逻辑
# 第一层隐藏层计算
h1 = [m.Intermediate(m.sum([x_scaled[j]*weights[0][j][i] for j in range(12)]) + biases[0][i]) for i in range(16)]
h1_relu = [m.Intermediate(m.max2(h1[i], 0)) for i in range(16)]

# 第二层隐藏层计算
h2 = [m.Intermediate(m.sum([h1_relu[j]*weights[1][j][i] for j in range(16)]) + biases[1][i]) for i in range(8)]
h2_relu = [m.Intermediate(m.max2(h2[i], 0)) for i in range(8)]

# 输出层计算(归一化后的功耗)
y_scaled_gekko = m.Intermediate(m.sum([h2_relu[j]*weights[2][j][0] for j in range(8)]) + biases[2][0])

# 将归一化功耗转换回原始刻度
y_min = scaler_y.data_min_[0]
y_max = scaler_y.data_max_[0]
power_consumption = m.Intermediate(y_scaled_gekko*(y_max - y_min) + y_min)

# --------------------------
# 步骤4:设置优化目标与约束
# --------------------------
# 优化目标:最小化功耗
m.Obj(power_consumption)

# 添加自定义约束(示例:输入变量1≥20,输入变量5≤80,替换为你的实际工况约束)
m.Equation(x[0] >= 20)
m.Equation(x[4] <= 80)

# --------------------------
# 步骤5:求解优化问题
# --------------------------
m.solve(disp=True)

# --------------------------
# 步骤6:输出优化结果
# --------------------------
print("\n优化结果:")
print(f"最小功耗值: {power_consumption.value[0]:.2f}")
print("最优输入变量组合:")
for i in range(12):
    print(f"输入变量{i+1}: {x[i].value[0]:.2f}")

新手适配说明

  • 数据替换:将heat_pump_data.csv替换为你的实际数据文件,确保列顺序正确。
  • 模型调整:若拟合效果不佳,可修改神经网络的隐藏层神经元数量(如16→32)、增加层数,或调整epochs(迭代次数)。
  • 约束修改:根据热泵实际运行限制,调整m.Equation中的约束条件,如温度、压力范围等。
  • 单输入单输出适配:只需将代码中输入变量数量改为1,神经网络输入层设为input_shape=(1,),同时调整Gekko变量数量即可,核心逻辑通用。

内容的提问来源于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 19:47:42