当我使用较少的 nlp 迭代时,APOPT 正在为 MINLP 问题找到更好的局部最小值.我期待相反的结果,我错过了什么



我有以下布尔变量和连续变量,其中只有一些"百分比"的状态为 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( 问题,同时在整数约束处连续限定变量。以下是声明二进制、整数和特殊有序集合的方法。

相关内容

  • 没有找到相关文章

最新更新