在Gekko中实现二进制优化:如何处理黑箱目标函数(如排水模型L2范数最小化)

梦瑶同学_4408

梦瑶同学_4408

2026-11-08

323人浏览

原创

在Gekko中实现二进制优化:如何处理黑箱目标函数(如排水模型L2范数最小化)

gekko不支持直接调用含外部仿真、文件读写或python函数调用的黑箱目标函数;需通过代理模型(如线性回归)或穷举法替代,以满足其对符号表达式和梯度计算的要求。

gekko不支持直接调用含外部仿真、文件读写或python函数调用的黑箱目标函数;需通过代理模型(如线性回归)或穷举法替代,以满足其对符号表达式和梯度计算的要求。

Gekko 是一个基于自动微分与符号运算的高级优化建模工具,其核心优势在于能为连续/整数混合问题生成精确梯度并高效求解。但这也意味着它无法接纳“黑箱”(black-box)目标函数——即任何包含 os.system()、文件I/O、第三方仿真调用(如SWMM)、或普通Python函数嵌套的逻辑。你遇到的错误:

*** Error in syntax of function string: Invalid element: <function func at></function>

正是由于 m.Minimize(Func) 尝试将一个纯Python函数对象(而非Gekko变量构成的表达式)注入模型表达式树,而Gekko在编译阶段仅接受由 m.Var、m.Param、算术运算符及内置函数(如 m.sqrt())组成的符号表达式。

✅ 正确路径一:构建可微代理模型(推荐用于高维或昂贵仿真)

当你的 Func(x) 调用外部水力模型(如EPANET/SWMM)并耗时较长时,可采样输入-输出数据,拟合轻量级代理模型,再将其导入Gekko进行精确优化。以下是完整流程:

1. 数据采样(控制成本)

import numpy as np
from itertools import product

def Func(x):
    Mod_File('Example1.inp', x)
    mod_name = Mod_File_Name('Example1.inp')
    return Norm_Peak_Flows(mod_name, Dict_Links('Example1.inp'))

# 生成100个随机二进制向量(长度8),满足sum(x)==4可选(更高效)
X_data, y_data = [], []
np.random.seed(42)
for _ in range(100):
    x_sample = np.random.choice([0, 1], size=8).tolist()
    if sum(x_sample) != 4:  # 可跳过不满足约束的样本,后续代理模型中硬约束
        continue
    y_data.append(Func(x_sample))
    X_data.append(x_sample)

X_data = np.array(X_data)
y_data = np.array(y_data)

2. 训练代理模型(以线性回归为例)

from sklearn.linear_model import LinearRegression
model = LinearRegression().fit(X_data, y_data)
print(f"R² = {model.score(X_data, y_data):.3f}")  # 验证拟合质量

3. 在Gekko中构建并优化代理目标

from gekko import GEKKO

m = GEKKO(remote=False)
x = m.Array(m.Var, 8, lb=0, ub=1, integer=True)

# 构建线性代理:yp = β₀ + Σ βᵢ·xᵢ
yp = model.intercept_ + sum(model.coef_[i] * x[i] for i in range(8))

m.Minimize(yp)
m.Equation(sum(x) == 4)
m.options.SOLVER = 1
m.solve(disp=True)

solution = [int(xi.value[0]) for xi in x]
print("Gekko最优解:", solution)
print("代理模型预测值:", yp.value[0])

⚠️ 注意事项:

炫酷的jQuery二进制数字时钟
炫酷的jQuery二进制数字时钟

炫酷的jQuery二进制数字时钟,它的时分秒都是用二进制来表示,绿色表示该位值是1,灰色则表示0,原理是将时钟的时分秒分别实时转换成二进制,然后随着本地时间的更新而实时刷新

下载
  • 若 R² ,建议改用非线性代理(如GaussianProcessRegressor或MLPRegressor),Gekko支持直接导入scikit-learn模型;
  • 所有训练样本应覆盖约束区域(如sum(x)==4),否则代理在可行域外可能外推失真;
  • 可在优化后用原始Func()验证解的真实目标值,评估代理误差。

✅ 正确路径二:全枚举法(推荐用于小规模问题)

对于仅8个二进制变量且约束为“恰好4个1”,组合总数仅为 C(8,4) = 70 —— 完全可在秒级内遍历:

from itertools import combinations

best_x, best_obj = None, float('inf')
for ones_idx in combinations(range(8), 4):
    x_test = [1 if i in ones_idx else 0 for i in range(8)]
    obj_val = Func(x_test)
    if obj_val <p>该方法<strong>零建模误差、无需拟合、结果可靠</strong>,是小规模二进制优化的黄金标准。</p><h3>总结</h3>
方法 适用场景 优点 缺点
代理模型 变量 >10 或单次仿真 >1秒 可扩展、支持Gekko高级求解器 依赖拟合精度,需验证
全枚举 变量 ≤15 且约束强(如固定汉明权重) 结果绝对最优、无近似误差 组合爆炸,不可扩展

无论选择哪条路径,请始终牢记:Gekko的目标函数必须是Gekko变量的显式数学表达式。将外部仿真逻辑移出模型定义,转为数据生成或后处理步骤,是成功应用的关键前提。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1891

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

5204

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1829

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

31437

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3727

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3727

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1263

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2883

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 新特性与架构变化
Conan 2 新特性与架构变化

共0课时 | 0人学习

Conan DevOps 文档
Conan DevOps 文档

共0课时 | 0人学习

Conan Center 使用指南
Conan Center 使用指南

共0课时 | 0人学习