如何在 Gekko 中高效实现跨时间向量的整数约束优化

千明吖_5715

千明吖_5715

2026-04-14

350人浏览

原创

如何在 Gekko 中高效实现跨时间向量的整数约束优化

本文详解如何使用 Gekko 对长度为 42 的时间向量(如电价、基础负荷等)进行统一优化,正确声明变量数组、构建向量化中间表达式,并施加事件频次上限(如最多触发 5 次)等整数约束,避免 TypeError: x must be a python list of GEKKO parameters... 等常见错误。

本文详解如何使用 gekko 对长度为 42 的时间向量(如电价、基础负荷等)进行统一优化,正确声明变量数组、构建向量化中间表达式,并施加事件频次上限(如最多触发 5 次)等整数约束,避免 `typeerror: x must be a python list of gekko parameters...` 等常见错误。

在 Gekko 中对时间序列(如 42 个时段)进行联合优化时,核心挑战在于:变量需明确区分标量决策变量与向量级中间表达式,且所有 Gekko 运算必须作用于 Gekko 对象(而非原生 Python 列表或 NumPy 数组)。原始代码中直接对 x7 调用 m.sum(x7) 报错,正是因为 x7 是单个标量 m.Var(),而非含 42 个元素的 Gekko 变量列表;而 m.sum() 仅接受由 Gekko 变量/表达式构成的 Python 列表。

✅ 正确做法:使用 m.Array() + 列表推导式构建向量化模型

首先,明确决策变量维度:

  • x1, x2: 连续型标量(如价格系数),定义为 lb=3, ub=15 的 m.Var
  • x3–x7: 整数型标量(如开关状态、触发次数),其中 x7 表示总触发次数上限(≤5)
from gekko import GEKKO
import numpy as np

m = GEKKO(remote=False)
n = 42  # 时间向量长度

# ✅ 使用 m.Array 高效创建标量变量组(非向量!)
x1, x2 = m.Array(m.Var, 2, lb=3, ub=15, value=1)
x3, x4, x5, x6, x7 = m.Array(m.Var, 5, lb=0, ub=1, value=1, integer=True)

# 单独设置 x7 上限为 5(非方程约束,更高效)
x7.upper = 5

# ✅ 向量化中间变量:对每个时段 i 构建独立的 Gekko 表达式
sp   = np.random.rand(n)   # 示例数据:价格信号
base = np.random.rand(n)   # 示例数据:基础负荷
co_ln, co1, co2, co3 = 2.0, 5.0, 6.0, 7.0

neg_ln = [m.Intermediate(-m.log(x1 / sp[i])) for i in range(n)]
vol1   = [m.Intermediate(co1 + base[i] + neg_ln[i] * co_ln) for i in range(n)]
vol2   = [m.Intermediate(co2 + base[i] + neg_ln[i] * co_ln) for i in range(n)]
vol3   = [m.Intermediate(co3 + base[i] + neg_ln[i] * co_ln) for i in range(n)]
vol4   = [m.Intermediate(base[i] + neg_ln[i] * co_ln) for i in range(n)]

# ✅ 每时段 total_vol[i] 是 Gekko 表达式,依赖标量 x3–x7 和向量 base[i], volX[i]
total_vol = [
    m.Intermediate((
        m.max2(0, base[i] * (m.exp(vol1[i]) - 1)) * x3 +
        m.max2(0, base[i] * (m.exp(vol2[i]) - 1)) * x4 +
        m.max2(0, base[i] * (m.exp(vol3[i]) - 1)) * x5 +
        m.max2(0, base[i] * (m.exp(vol4[i]) - 1)) * x6
    ) + base[i]) * x7
    for i in range(n)
]

⚠️ 关键注意事项

  • 勿混用标量与向量逻辑:x3–x7 是单个整数变量(代表全局策略参数),而非 42×1 向量。若需每时段独立开关,则应定义 x3 = m.Array(m.Var, n, integer=True, lb=0, ub=1),并改写约束(如 m.Equation(m.sum(x3)
  • 约束书写规范:
    m.Equation(x3 + x4 + x5 + x6 == 1)  # 正确:标量方程
    m.Equation(x7 
  • 目标函数聚合:m.sum(total_vol) 正确——因 total_vol 是含 42 个 Gekko 表达式的 Python 列表,符合 m.sum() 输入要求。
  • 求解器选择:含整数变量时,必须启用混合整数非线性规划(MINLP)求解器,如 m.options.SOLVER = 1(APOPT)。

? 总结:三步构建可靠向量优化模型

  1. 变量声明分层:用 m.Array() 明确生成标量变量组;向量化中间量用列表推导式逐元素构建;
  2. 约束精准匹配:标量约束作用于标量变量(如 x7
  3. 避免冗余操作:删除无意义的 z 变量映射,直接在 m.Var() 中声明 integer=True 和边界;优先用 var.upper/var.lower 替代 m.Equation() 实现简单不等式。

运行后,Gekko 将返回全局最优的标量策略组合(如 x[1]=3.0, x[7]=1.0),确保在满足所有物理与逻辑约束下,最大化跨 42 时段的累计收益。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2023.07.20

1811

4

python能做什么
python能做什么

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

2023.07.25

4744

7

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

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

2023.07.31

1749

3

python教程
python教程

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

2023.08.03

28257

23

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

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

2023.08.04

3407

5

python eval
python eval

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

2023.08.04

3407

5

scratch和python区别
scratch和python区别

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

2023.08.11

1203

5

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

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

2023.08.10

616

4

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

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

2023.08.11

2643

5

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.9万人学习