我想在python3.7窗口版本中使用Gekko来解决以下优化问题.

Original Problem

Original

这里,x_s是连续变量,D和Epsilon是确定性的,它们也是参数.

然而,由于目标函数中存在最小化函数,我使用二元变量(Z1,Z2)将其go 掉,然后问题变成如下MINLP.

Modified problem

Modified

和盖科在一起,

(1)original problemmodified problem都能解决吗?

(2)如何对目标函数中的求和以及Gekko中的参数D&P;epsilon进行编码?

先谢谢你.

推荐答案

这两个问题对于Gekko来说都应该是可行的,但最初的问题似乎更容易解决.以下是针对原始问题的一些建议:

  • 使用m.Maximize()作为目标
  • 使用sum()表示目标函数的内部求和,使用m.sum()表示外部求和.当求和将创建超过15,000个字符的表达式时,我切换到m.sum().使用sum()会创建一个很长的表达式,而使用m.sum()会将求和分解为多个片段,但编译时间会更长.
  • 使用m.min3()表示min(dt,xs)项,或使用slack variables s表示x[i]+s[i]=D[i].DT(大小为30)似乎是一个上限,但它的维度与Xs(大小为slack variables)不同. slack 变量比使用二进制变量效率高得多.
D = np.array(100)
x = m.Array(m.Var,100,lb=0,ub=2000000)

改进后的问题有6000个二元变量和100个连续变量.这些变量有2^6000个可能的组合,因此可能需要一段时间才能解决,即使使用APOPT的有效分支定界法也是如此.以下是针对修改后的问题的一些建议:

  • 尽可能使用矩阵乘法.下面是一个使用Gekko进行矩阵运算的示例.
from gekko import GEKKO
import numpy as np
m = GEKKO(remote=False)
ni = 3; nj = 2; nk = 4
# solve AX=B
A = m.Array(m.Var,(ni,nj),lb=0)
X = m.Array(m.Var,(nj,nk),lb=0)
AX = np.dot(A,X)
B = m.Array(m.Var,(ni,nk),lb=0)
# equality constraints
m.Equations([AX[i,j]==B[i,j] for i in range(ni) \
                             for j in range(nk)])
m.Equation(5==m.sum([m.sum([A[i][j] for i in range(ni)]) \
                                    for j in range(nj)]))
m.Equation(2==m.sum([m.sum([X[i][j] for i in range(nj)]) \
                                    for j in range(nk)]))
# objective function
m.Minimize(m.sum([m.sum([B[i][j] for i in range(ni)]) \
                                 for j in range(nk)]))
m.solve()
print(A)
print(X)
print(B)
  • 使用integer=Truez1z2变量声明为整型.这是information on using the integer type多元.
  • m=GEKKO(remote=False)进行局部求解.处理时间会很长,公共服务器每天都会重置连接和删除作业(job).切换到本地模式以避免潜在的中断.

Python-3.x相关问答推荐

我想判断df_entry_log[AM_PM],并根据测试填充列

查找值始终为零的行 pandas

将自定义函数应用于 pandas 数据框的每一列

链接列未延伸到数据框的末尾

Django - ValueError:无法将字符串转换为浮点数:''

Python3:是否可以将变量用作函数调用的一部分

Pandas:从 Pandas 数据框中的 1 和 0 模式中获取值和 ID 的计数

Python.在循环中填充字典的问题

导入在不同目录中定义的函数

用于 BIG 数组计算的多处理池映射比预期的要慢

如何将虚拟变量列转换为多列?

每个数据行中每个数据帧值的总和

使用一周的特定第一天将每日日期转换为每周

Await Future 来自 Executor:Future 不能在await表达式中使用

Seaborn 热图 colored颜色 条标签作为百分比

如何模拟 Django 模型对象(及其方法)?

判断 dict.items() 中的成员资格的时间复杂度是多少?

使用 asyncio 的多个循环

将列表列表转换为Python中的字典字典

在 Visual Studio Code 中调试 Scrapy 项目