python - 使用 Gekko 进行优化时,使用阶乘和范围函数的正确方法是什么?
问题描述
我一直在尝试使用 Gekko 解决混合整数非线性规划问题,但我在使用range
和factorial
函数时遇到了麻烦。
我的模型有一个变量,它的目标是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 不希望我将变量强制为整数,但我必须使用range
和factorial
函数才能使我的模型正常工作。我将不胜感激任何建议,谢谢。
解决方案
这对于混合整数编程来说不是一个好的应用程序,因为一些试验解决方案是非整数的。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
推荐阅读
- graphviz - Graphviz 子图布局
- xml - 如何遍历 xml 文件中的每个节点并在节点名称与字符串匹配时返回 true,否则使用 XQuery 和 XPath 返回 false?
- javascript - 我一直在尝试创建一个反应应用程序,但我一直收到这个错误:“npm ERR!cb() never call!”
- python-3.x - 计算不是从数据框 pandas 中获取的
- python - 关于二维数组的Python问题
- scala - 在 Travis 或 Github Actions 作业之间重用 SBT 编译的结果
- python - 类型错误:Pandas Dataframe 应用函数,参数传递
- corda - 如何将corda项目部署到服务器
- json - Powershell Core 将 JSON 中的数字反序列化为 Int64,而 Windows Powershell 将其反序列化为 Int32
- c - 如果输入 5 个或更多字符,如何打印错误消息