首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果没有一个已知的目标函数(假设是一些随机函数),以及已知的变量和约束,如何使用gekko优化器?

如果没有一个已知的目标函数(假设是一些随机函数),以及已知的变量和约束,如何使用gekko优化器?
EN

Stack Overflow用户
提问于 2020-01-20 07:21:48
回答 2查看 97关注 0票数 4

我试着用连接到A的gekko最小化和最大化一个随机的“测试函数”。A由4个参数组成,范围在(0- 10000 )和A<100之间。但是我总是得到奇怪的结果,因为测试函数的最小值应该是2500,最大值是100。我的代码是below.Can,谁能告诉我问题出在哪里?提前感谢

代码语言:javascript
复制
    import numpy as np
    from gekko import GEKKO 


    def test_function(x):
        return np.dot(x, x)


    A = m.Array(m.Var, (4))
    # initial guess
    ig = [1, 5, 5, 1]
    # lower bounds
    i = 0
    for Ai in A:
        Ai.value = ig[i]
        Ai.lower = 0
        Ai.upper = 100
        i += 1
    m.Equation(np.sum(A) < 100)
    m.Obj(test_function(A))
    m.solve()
    print(test_function(A))
    print (A)

结果

代码语言:javascript
复制
Solver         :  IPOPT (v3.12)
 Solution time  :   1.379999999971915E-002 sec
 Objective      :   4.141037033873033E-007
 Successful solution
 ---------------------------------------------------

(((((v1)*(v1))+((v2)*(v2)))+((v3)*(v3)))+((v4)*(v4)))
[[0.00042734466188] [0.00015629584657] [0.00015629584657]
 [0.00042734466188]]

Process finished with exit code 0
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-23 11:59:09

我修改了问题以符合你的陈述。还有一个列表理解,它简化了定义具有上下限的新变量的过程。下面的脚本展示了两种访问test_function(x)的方法:(1)使用符号表达式的Gekko变量,或者(2)使用数值来计算约束和目标函数。

代码语言:javascript
复制
import numpy as np
from gekko import GEKKO 
m = GEKKO(remote=False)
def test_function(x):
    return np.dot(x, x)
ig = [1, 5, 5, 1] # initial guess
A = np.array([m.Var(value=ig[i],lb=0,ub=10000,name='a'+str(i)) \
              for i in range(4)])
m.Equation(test_function(A)>2500)
m.Equation(test_function(A)<10000)
m.Minimize(test_function(A))
m.solve()
# extract values to get a numerical solution of test_function
A_sol = [A[i].value[0] for i in range(4)]
print(test_function(A_sol))
# get the objective function value from the solver
print(m.options.OBJFCNVAL)
# print variables
print (A)

脚本的结果如下所示。如果你使用print(test_function(A_sol)),它会输出Gekko用来寻找解决方案的符号表达式。在您的情况下,您可能对数值解决方案感兴趣,而不是符号形式。

代码语言:javascript
复制
# results
2499.999999993099
2500.0
[[14.90599615] [32.059495922] [32.059495922] [14.90599615]]

m.options.OBJFCNVAL和计算表达式的结果相同,但由于机器精度的不同而略有不同。

票数 1
EN

Stack Overflow用户

发布于 2020-01-21 02:46:21

按照定义下界和目标函数的方式,gekko选择的小数仅略高于0。仅略高于零的小数满足您给出的所有界限,这就是目标如此之低的原因。同样,如果你把目标函数设为负值,它会将其最大化到5000。我不确定你是从哪里得到你期望的最小和最大值的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59815318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档