优化求和函数 - GEKKO

Ant*_*one 5 optimization gekko

我刚刚开始学习优化,在寻找以下问题的最佳值时遇到一些问题。注意:这只是我想到的一个随机问题,没有实际应用。

问题:

其中x可以是列表 ([2,4,6]) 中的任何值,并且y介于 1 和 3 之间。

我的尝试:

from gekko import GEKKO
import numpy as np
import math

def prob(x,y,sel):
    z = np.sum(np.array(x)*np.array(sel))
    cst = 0
    i=0
    while i <= y.VALUE:
        fact = 1
        for num in range(2, i + 1): # find the factorial value
            fact *= num
        cst += (z**i)/fact
        i+=1
    return cst


m = GEKKO(remote=False)

sel = [2,4,6] # list of possible x values
x =  m.Array(m.Var, 3, **{'value':1,'lb':0,'ub':1, 'integer': True})
y = m.Var(value=1,lb=1,ub=3,integer=True)

# switch to APOPT
m.options.SOLVER = 1

m.Equation(m.sum(x) == 1) # restrict choice to one selection

m.Maximize(prob(x,y,sel))
m.solve(disp=True)


print('Results:')
print(f'x: {x}')
print(f'y : {y.value}')
print('Objective value: ' + str(m.options.objfcnval))
Run Code Online (Sandbox Code Playgroud)

结果:

----------------------------------------------------------------
 APMonitor, Version 0.9.2
 APMonitor Optimization Suite
 ----------------------------------------------------------------


 --------- APM Model Size ------------
 Each time step contains
   Objects      :  0
   Constants    :  0
   Variables    :  4
   Intermediates:  0
   Connections  :  0
   Equations    :  2
   Residuals    :  2

 Number of state variables:    4
 Number of total equations: -  1
 Number of slack variables: -  0
 ---------------------------------------
 Degrees of freedom       :    3

 ----------------------------------------------
 Steady State Optimization with APOPT Solver
 ----------------------------------------------
Iter:     1 I:  0 Tm:     -0.00 NLPi:    2 Dpth:    0 Lvs:    0 Obj: -7.00E+00 Gap:  0.00E+00
 Successful solution

 ---------------------------------------------------
 Solver         :  APOPT (v1.0)
 Solution time  :  0.024000000000000004 sec
 Objective      :  -7.
 Successful solution
 ---------------------------------------------------


Results:
x: [[0.0] [0.0] [1.0]]
y : [1.0]
Objective value: -7.0
Run Code Online (Sandbox Code Playgroud)

x应该是[0,0,1](即6)并且y应该是3以获得最大值(61)。x我得到的值是正确的,但由于某种原因y我得到的值是错误的。是什么导致了这个问题?我的配方有问题吗?另外,如果您能向我指出有关 APOPT 解算器输出中的各种符号(如 Tm、NLPi 等)的更多信息,也会非常有帮助。

Joh*_*ren 3

这是gekko中的解决方案:

x=6.0
y=3.0
Run Code Online (Sandbox Code Playgroud)

您需要使用 gekko 函数来构建函数并以某种方式提出问题,以便方程不会随着变量值的变化而变化。

x=6.0
y=3.0
Run Code Online (Sandbox Code Playgroud)

对于您的问题,我使用特殊有序集(类型 1)来获取 2、4 或 6 的选项。为了选择 1、2y或 3,我计算了所有可能的值,然后使用二进制选择器yb来选择一个。有一个限制,即只能使用其中一个m.sum(yb)==1。如果您需要其他资源,可以使用gekko示例、文档和短期课程。这是求解器的输出:

from gekko import GEKKO
import numpy as np
from scipy.special import factorial

m = GEKKO(remote=False)
x = m.sos1([2,4,6])
yb = m.Array(m.Var,3,lb=0,ub=1,integer=True)
m.Equation(m.sum(yb)==1)
y = m.sum([yb[i]*(i+1) for i in range(3)])
yf = factorial(np.linspace(0,3,4))
obj = x**0/yf[0]
for j in range(1,4):
    obj += x**j/yf[j]
    m.Maximize(yb[j-1]*obj)
m.solve()
print('x='+str(x.value[0]))
print('y='+str(y.value[0]))
print('Objective='+str(-m.options.objfcnval))
Run Code Online (Sandbox Code Playgroud)

以下是有关求解器 APPPT 选项的更多信息。迭代摘要描述了分支定界进度。=Iter迭代次数,Tm=求解 NLP 的时间,NLPi=NLP 迭代次数,Dpth=分支树的深度,Lvs=候选叶子的数量,Obj=NLP 解决方案目标,=Gap整数解与最佳非整数解之间的差距。

  • 谢谢。我现在知道了。尽管这确实为我提供了正确的“x”和“y”值,但目标值存在问题(它是 36 而不是 61)。它应该是“i”=0 到“y”的总和(根据相关问题描述)。但由于`yb`,只取`i`=`y`的值。为了解决这个问题,我在 for 循环之上添加了一个 for 循环。`ans = 1 for i in range(3): ans += m.sum([yb[j]*(x**(yi))/yf[j] for j in range(len(yb))]) yb = np.delete(yb,0)` 这似乎解决了它。但不确定是否有更好的方法。 (2认同)