- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 GEKKO
来解决非线性规划问题。我的目标是将 GEKKO
性能与替代方案进行比较,因此我想确保我从 GEKKO
中获得其所能提供的最佳性能。
有n个二元变量,每个变量都分配有一个权重,每个权重都是区间[0, 1]中的一个数字(即有理数w满足0<= w <= 1)。每个约束都是线性的。目标函数是非线性的:它是非零变量权重的乘积,目标是最大化乘积。
我首先将目标函数指定为
m.Obj(-np.prod([1 - variables[i] + weights[i] * variables[i] for i in range(len(variables))]))
但随后我会遇到 APM 模型错误:字符串 > 15000 个字符
。所以我使用 if3
函数切换到辅助变量
aux_variables = [m.if3(variables[i], weights[i], 1) for i in range(len(variables))]
m.Obj(-np.prod(aux_variables))
我手动设置的唯一全局参数位于以下代码中。
# initialize model
m = GEKKO(remote=False)
# set global variables
m.options.SOLVER = 1 # APOPT solver
# "APOPT is an MINLP solver"
# "APOPT is also the only solver that handles Mixed Integer problems."
m.options.IMODE = 3 # steady state optimization
m.solver_options = ['minlp_maximum_iterations 500', \
# minlp iterations with integer solution
'minlp_max_iter_with_int_sol 10', \
# treat minlp as nlp
'minlp_as_nlp 0', \
# nlp sub-problem max iterations
'nlp_maximum_iterations 50', \
# 1 = depth first, 2 = breadth first
'minlp_branch_method 1', \
# maximum deviation from whole number
'minlp_integer_tol 0.05', \
# covergence tolerance
'minlp_gap_tol 0.01']
# initialize variables
variables = m.Array(m.Var, (number_of_vars), lb=0, ub=1, integer=True)
# set initial values
for var in variables:
var.value = 1
问题:
在全局参数和目标函数的制定方面,我还能做些什么(如果有的话)来优化 GEKKO
对于这个特定问题的性能?
同时,我希望 GEKKO
能够产生不错的结果。
最佳答案
重新表述问题以提高速度的一种方法是使用中间变量。
原始(0.0325 秒,# Var=5)
m.Obj(-np.prod([1 - variables[i] + weights[i] * variables[i] \
for i in range(len(variables))]))
修改(0.0156 秒,# Var=5)
ival = [m.Intermediate(1 - variables[i] + weights[i] * variables[i]) \
for i in range(len(variables))]
m.Obj(-np.prod(ival))
这也应该可以帮助您避免字符串长度的问题,除非您有 number_of_vars
那是非常大的。看来最优解永远是variables[i]=1
当weights[i]=1
和variables[i]=0
当weights[i]=0
。与np.prod
这意味着如果任何一项乘积项为零,则整个目标函数为零。将单个产品值设置为 1
是否有帮助?而不是使用目标函数来查找值?帮助 APOPT 找到正确解决方案的一件事是使用类似 1.1
的东西。在你的中间声明中而不是 1.0
。因此,当您最大化时,它会尝试避免 0.1
有利于找到给出 1.1
的解决方案的值.
from gekko import GEKKO
import numpy as np
m = GEKKO(remote=False)
number_of_vars = 5
weights = [0,1,0,1,0]
m.options.IMODE = 3
variables = m.Array(m.Var, (number_of_vars), lb=0, ub=1, integer=True)
for var in variables:
var.value = 1
ival = [m.Intermediate(1.1 - variables[i] + weights[i] * variables[i]) \
for i in range(len(variables))]
# objective function
m.Obj(-np.prod(ival))
# integer solution with APOPT
m.options.SOLVER = 1
m.solver_options = ['minlp_maximum_iterations 500', \
# minlp iterations with integer solution
'minlp_max_iter_with_int_sol 10', \
# treat minlp as nlp
'minlp_as_nlp 0', \
# nlp sub-problem max iterations
'nlp_maximum_iterations 50', \
# 1 = depth first, 2 = breadth first
'minlp_branch_method 1', \
# maximum deviation from whole number
'minlp_integer_tol 0.05', \
# covergence tolerance
'minlp_gap_tol 0.01']
m.solve()
print(variables)
求解器也更容易找到诸如m.sum()
这样的求和的解。它给出了相同的 variables
解决方案为 np.prod()
选项。
# objective function
m.Obj(-m.sum(ival))
您可以添加后处理线来恢复产品目标函数,该函数将是 0
或1
.
if3
函数对于您的应用来说不是一个好的选择,因为切换条件为 0,轻微的数值变化将导致不可靠的结果。求解器考虑 0
至0.05
和0.95
至1
根据选项 minlp_integer_tol=0.05
得到整数解。该选项允许在足够接近整数值时接受整数解。如果variables[i]
值为 0.01
然后if3
函数将选择True
选项时应选择 False
选项。您仍然可以使用 if3
如果您在二进制值之间设置了切换点,例如m.if3(variables[i]-0.5, weights[i], 1)
,则函数。但是,有比使用 if3
更简单的方法来解决您的问题。功能。
关于 python 壁虎 : optimizing performance of nonlinear optimization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58378909/
我需要解决一维飞机飞行最优控制问题。我有一架 1000 米高的飞机。我需要它沿 x 轴向前行驶一定距离 (x),同时最大限度地减少油耗。当它达到那个距离 x 时,我需要程序停止。这个函数控制它:m.E
我正在使用 GEKKO 来解决非线性规划问题。我的目标是将 GEKKO 性能与替代方案进行比较,因此我想确保我从 GEKKO 中获得其所能提供的最佳性能。 有n个二元变量,每个变量都分配有一个权
private fun setupGeckoView() { val runtime = GeckoRuntime.create(this) // crashes on this li
我正在尝试使用 GEKKO 优化指数目标函数,但我不知道所选求解器是否是解决此类问题的最佳解决方案。 所选的是有效的选择吗?? import numpy as np 'GEKKO MODELING'
我正在模拟中求解一组方程(IMODE = 1,SOLVER = 3)。 IPOPT 求解器求解到可接受的水平并退出,但 gekko 为此返回错误并返回我的解决方案。根据 IPOPT 文档,可接受级别的
我正在查看以下网站:www.example.com 我正在使用 GeckoWebBrowser 对象导航到该站点,并每秒对该对象的 HTML 进行快照。然后我导航 DOM 以获取我想要的表 (div
尝试让 selenium 工作,但没有成功,并向我显示以下错误。 Libs:junit4.12, selenium-java-3.4, selenium-server-standalone-3.5 有
我是一名优秀的程序员,十分优秀!