gpt4 book ai didi

python - GEKKO 返回非最优解

转载 作者:行者123 更新时间:2023-12-05 08:03:29 26 4
gpt4 key购买 nike

我想使用 GEKKO 解决以下优化问题:

Minimize x'Qx + 1e-10 * sum_{i=1}^n x_i^0.1
subject to 1' x = 1 and x >= 0

但是,以下代码返回 sol = [0., 0., 0. ,0. ,1.]Objective: 1.99419 作为解决方案。这远非最佳,我将在下面解释原因。

import numpy as np
from gekko import GEKKO
n = 5
m = GEKKO(remote=False)
m.options.SOLVER = 1
m.options.IMODE = 3

x = [m.Var(lb=0, ub=1) for _ in range(n)]

m.Equation(m.sum(x) == 1)
np.random.seed(0)
Q = np.random.uniform(-1, 1, size=(n, n))
Q = np.dot(Q.T, Q)

## Add h_i^p
c, p = 1e-10, 0.1
for i in range(n):
m.Obj(c * x[i] ** p)
for j in range(n):
m.Obj(x[i] * Q[i, j] * x[j])

m.solve(disp=True)
sol = np.array(x).flatten()

这显然是错误的,因为如果我们仅使用以下代码优化二次部分 (x'Qx),并将解决方案用于初始目标,我们将获得更小的目标值(目标:0.02489503). 1e-10 * sum_{i=1}^n x_i^p 基本上被忽略了,因为它非常小。

m1 = GEKKO(remote=False)
m1.options.SOLVER = 1
m1.options.OTOL = 1e-10
x1 = [m1.Var(lb=0, ub=1) for _ in range(n)]
m1.Equation(m1.sum(x1) == 1)
m1.qobj(b=np.zeros(n), A=2 * Q, x=x1, otype='min')
m1.solve(disp=True)
sol = np.array(x1).flatten()

有什么办法可以解决这个问题吗?谢谢!

最佳答案

Gekko 使用基于梯度的方法解决非线性规划优化问题:内点和事件集 SQP。看起来目标函数有问题。在 Numpy 中使用矩阵运算来简化目标定义。

## Create Objective
c, p = 1e-10, 0.1
obj = np.dot(np.dot(x,Q),x) + c*m.sum([xi**p for xi in x])
m.Minimize(obj)

这是使用 Gekko 求解的修改后的脚本。如果达到 250 的默认限制,请增加 MAX_ITER

import numpy as np
from gekko import GEKKO
n = 5
m = GEKKO(remote=False)
m.options.SOLVER = 3
m.options.IMODE = 3

x = m.Array(m.Var,n,value=0.1, lb=1e-6, ub=1)

m.Equation(m.sum(x) == 1)

np.random.seed(0)
Q = np.random.uniform(-1, 1, size=(n, n))
Q = np.dot(Q.T, Q)
print(Q)

## Create Objective
c, p = 1e-10, 0.1
obj = np.dot(np.dot(x,Q),x) + c*m.sum([xi**p for xi in x])
m.Minimize(obj)

# adjust solver tolerance
m.options.RTOL=1e-10
m.options.OTOL=1e-10
m.options.MAX_ITER = 1000

m.solve(disp=True)
sol = np.array(x).flatten()
print('x: ', sol)
print('obj: ', m.options.OBJFCNVAL)

这给出了一个也是全局的最优解,因为它是一个二次规划 (QP) 问题(凸优化)。对 QP 问题使用非线性规划 (SQP) 求解器给出了 IPOPT 求解器的解:

x:  [[0.36315827507] [0.081993130341] [1e-06] [0.086231281612] [0.46861632269]]
obj: 0.024895918696

关于python - GEKKO 返回非最优解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72695441/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com