微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Gekko 进行优化时,使用阶乘和范围函数的正确方法是什么?

如何解决使用 Gekko 进行优化时,使用阶乘和范围函数的正确方法是什么?

我一直在尝试使用 Gekko 解决混合整数非线性规划问题,但在使用 rangefactorial 函数时遇到问题。

我的模型有一个变量,它旨在最小化 c,同时将 Wq 保持在某个限制。当我执行下面的代码时;

m = GEKKO() 
m.options.soLVER=1 
def ineq1(c):
    arr_rate = 60
    ser_rate = 25
    p = arr_rate/(ser_rate)
    eps = 0
    for m in range(c):
        eps += P**m/factorial(m)
    Po = 1/(eps+P**c/(factorial(c)*(1-p/(c))))
    Lq = Po*P**(c+1)/(c*factorial(c)*(1-p/c)**2)
    Wq = Lq/arr_rate
    return Wq
x1 = m.Var(value=2,lb=1,ub=10,integer=True)
m.Equation(ineq1(x1)<=0.005)
m.Obj(x1) 
m.solve(disp=False)

我收到以下错误

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-427-6b79ae34d974> in <module>
     16 x1 = m.Var(value=1,ub=5,integer=True)
     17 # Equations
---> 18 m.Equation(ineq1(x1)<=0.5)
     19 m.Obj(x1) # Objective
     20 m.solve(disp=False) # Solve

<ipython-input-427-6b79ae34d974> in ineq1(c1)
      8     p = arr_rate/(ser_rate)
      9     eps = 0
---> 10     for m in range(c):
     11         eps += P**m/factorial(m)
     12     Po = 1/(eps+P**c/(factorial(c)*(1-p/(c))))

TypeError: 'GKVariable' object cannot be interpreted as an integer

显然,Gekko 不希望我强制变量为整数,但我必须使用 rangefactorial 函数才能使我的模型正常工作。我希望得到任何建议,谢谢。

解决方法

这不是混合整数规划的好应用,因为一些试验解决方案是非整数。只用更高的数字评估 x1 直到满足约束如何:

from math import factorial

def ineq1(c):
    arr_rate = 60
    ser_rate = 25
    p = arr_rate/(ser_rate)
    eps = 0
    for m in range(c):
        eps += p**m/factorial(m)
    Po = 1/(eps+p**c/(factorial(c)*(1-p/(c))))
    Lq = Po*p**(c+1)/(c*factorial(c)*(1-p/c)**2)
    Wq = Lq/arr_rate
    return Wq

for x1 in range(1,15):
    if ineq1(x1)<=0.005:
        print('Constraint ineq1(x1)<0.005: ' + '{0:10.5f}'.format(ineq1(x1)) \
              + ' satisfied with minimum x1=' + str(x1))
        break

在满足约束的第一个值处停止并将其报告为最优解。

Constraint ineq1(x1)<0.005:   -0.06857 satisfied with minimum x1=1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。