我有以下布尔变量和连续变量,其中只有一些"百分比"的状态为 1。
status[i] = m.Array(m.Var, p, lb=0, ub=1, integer=True)
percent[i] = m.Array(m.FV, p, value=1, lb=0.6, ub=1.1)
我使用了一些使用 min2 选项的中介,这些中介被输入到我的 contraint 方程中。
我的目标是状态、百分比和常数的线性求和。
我正在使用以下求解器选项:
m = GEKKO(remote=False)
# Options
m.options.SOLVER = 1
m.options.LINEAR = 0
# optional solver settings with APOPT
m.solver_options = ['minlp_maximum_iterations 10000',
'minlp_max_iter_with_int_sol 500',
'minlp_gap_tol 0.01',
'nlp_maximum_iterations 500',
'minlp_as_nlp 0',
'minlp_interger_leaves = 0',
'minlp_branch_method 1',
'minlp_integer_tol 0.01',
'minlp_print_level 2'
]
我返回的目标是:2140.05,没有违反任何约束,解决方案非常好。但是,通过将"nlp_maximum_iterations"减少到 10,我可以得到更好的解决方案2138.67。
我希望我的最小值会随着迭代次数的增加而提高。我的计划是在运行时和最佳成本之间找到平衡,期望长时间运行将产生接近全局最小值的解决方案,我可以将其用作基线。
在我对问题的测试中,似乎nlp_max_iterations是天气的控制因素,或者它是否找到了两种成本中的较低者。 minlp_maximum_iterations、minlp_max_iter_with_int_sol和minlp_gap_tol似乎对解决方案没有影响。
对这种行为的任何解释将不胜感激。
以下是一些可能会有所帮助的提示:
- 使用
min3
而不是min2
。这使用二进制变量形式而不是可能给出错误解决方案的 MPCC 形式。 - APOPT 应保留最佳整数解,并在达到最大迭代数时返回该解。具有目标
2138.67
解是整数解吗? - 如果这是一个最大化问题,那么
2140.05
将是一个更好的解决方案。你能确认你使用的是m.Minimize()
而不是m.Maximize()
吗?
APOPT 求解器使用分支和绑定方法求解非线性规划 (NLP( 问题,同时在整数约束处连续限定变量。以下是声明二进制、整数和特殊有序集合的方法。