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

APOPT is finding a better local minimum to a MINLP problem when I use fewer nlp iterations. I was expecting the opposite result, what am I missing?

我有以下布尔值和连续变量,其中只有一些 'percents' 的状态为 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 选项的中介,这些选项被输入到我的约束方程中。

我的 objective 是状态、百分比和常数的线性求和。

我正在使用以下求解器选项:

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'
                    ]

我返回的objective是:2140.05,违反了none的约束,很好解决。但是,通过将 '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 应保留最佳整数解,return 如果它达到最大迭代次数。 objective2138.67的解是整数解吗?
  • 如果这是一个最大化问题,那么 2140.05 将是更好的解决方案。您能否确认您使用的是 m.Minimize() 而不是 m.Maximize()

APOPT 求解器使用 branch and bound method that solves Nonlinear Programming (NLP) problems while successively bounding variables at integer constraints. Here are methods for declaring binary, integer, and special ordered sets