使用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,lb=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

最新更新