python - Gekko 整数优化问题

标签 python numpy optimization integer gekko

我尝试使用此代码,结果是 (2,2) .显然这不是真的,因为 (0,4)是最好的解决方案。你能告诉我问题出在哪里吗?

import numpy as np
from gekko import GEKKO
m = GEKKO()

x=[m.Var(lb=0,ub=4,integer=True) for i in range(2)]

m.options.SOLVER = 1

#Equations

m.Equation(m.sum(x)>=4)

#Objective

m.Obj(x[0]*x[1])
m.solve(disp=False)
print(x[0].value)
print(x[1].value)

最佳答案

所有求解器( m.options.SOLVER1=APOPT2=BPOPT3=IPOPT )找到局部最大值点 (2,2)初步猜测 (0,0)以及其他初步猜测。 (0,4)处有两个局部最优和 (4,0) .这是一个非凸优化问题。求解器是非线性凸优化求解器,因此它们“应该”找到局部解之一。这个问题让我想起了saddle point problem如果您旋转图形以使用 x0=x1线。如果不检查不确定的 Hessian,优化器可能会遇到鞍点问题。
3d plot
更好的初始猜测有助于求解器找到最优解,例如 x0=1x1=3 .此外,上限 <1.999在变量之一或 >2.001 的下限上也找到了最优值。约束限制了搜索区域,使其成为凸优化问题并避开鞍点。

from gekko import GEKKO
m = GEKKO()

x = m.Array(m.Var,2,value=1,lb=0,ub=4,integer=True)
x[0].value = 1; x[1].value = 3 # initial guesses
#x[0].UPPER=1
m.Equation(m.sum(x)>=4)
m.Minimize(x[0]*x[1])

m.options.SOLVER = 1
m.solve(disp=True)
print(x[0].value)
print(x[1].value)
我创建了优化问题的等高线和 3D 图。由于问题是非凸的,您可能希望切换到多开始方法或使用非凸优化求解器。
contour plot
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm

# Design variables at mesh points
x0 = np.arange(0.0, 4.01, 0.1)
x1 = np.arange(0.0, 4.01, 0.1)
x0,x1 = np.meshgrid(x0,x1)

# Equation sum(x)>4
xsum = x0+x1

# Objective Minimize(x0*x1)
xobj = x0*x1

# Create a contour plot
plt.figure()
CS = plt.contour(x0, x1, xobj)
plt.clabel(CS, inline=1, fontsize=10)
CS = plt.contour(x0, x1, xsum,[3.6,3.8,4.0],\
                 colors='k',linewidths=[0.5,1,4])
plt.clabel(CS, inline=1, fontsize=10)
plt.xlabel('x0')
plt.ylabel('x1')
plt.savefig('contour.png')

# Create 3D plot
fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(x0, x1, xobj, \
            rstride=1, cstride=1, cmap=cm.coolwarm, \
            vmin = 0, vmax = 10, linewidth=0, \
            antialiased=False)
plt.show()

关于python - Gekko 整数优化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65542898/

相关文章:

c++ - 除以一应该得到一个特例吗?

python - VSCode 找不到 pipenv : spawn pipenv ENOENT

python - 将 Pandas DataFrame 行与两个阈值进行比较

python - 使用 python 扩展、转置和解聚合数据集

python - 绘制 sum(matrix,axis=0) 并用求和所需的非零元素的行索引标记该图

python - Pandas:如何移动所有数据框

Haskell 优化 : how to stop list from performing allocations?

python - 为什么 time.sleep() 会破坏 Python 中的 syslog-ng

python - 使用 exec() 执行的代码中定义的函数范围

php - 我的基本PHP Socket Server是否需要优化?