【问题标题】:How to optimize this MiniZinc app?如何优化这个 MiniZinc 应用程序?
【发布时间】:2015-02-10 09:26:02
【问题描述】:

我有一个 MiniZinc 应用程序,我想通过找到一些输入数据的低成本排列来最小化某事的“成本”。所以我有:

array[1 .. n] of var 1 .. n: Seq;
...
constraint alldifferent( [ Seq[i] | i in 1 .. n ]);

然后我根据 Seq 计算成本。该应用程序开始工作,但运行时间过长,超过了一个非常小的数字。显然求解器尝试了所有 n!可能性。如何扩展?

【问题讨论】:

  • 嗨,吉姆。高复杂度是不可避免的,需要一些启发式算法,如 LNS。我也在探索 QCSP 领域(量化约束求解),使用 Gecode

标签: optimization minizinc


【解决方案1】:

如果 alldifferent(Seq) 是唯一的约束,那么求解器将尝试所有排列。

然而,排列中经常存在可能被破坏的对称性,例如第一个元素是 1 或者第一个元素总是小于第二个元素等。这些对称性通常是非常特定于问题的.

如果模型中有其他约束,那么这些可以帮助减少搜索空间,可能是通过破坏对称性等。

在正常情况下,n 有多大?像往常一样,模型的更多细节有助于提供更具体的帮助。此外,尝试不同的求解器和启发式搜索可以加快速度。

【讨论】:

  • 谢谢。还有其他限制,但从您的回复中,我开始了解到其他限制主要与成本的计算有关,因此它们不会限制排列搜索。但是我希望 MiniZinc 会做一些类似模拟退火的方法来找到一个“好的”排列。 n 将在 50 左右。这是一个调度问题。
  • 有什么方法可以做我想做的事吗?
  • MiniZinc 的默认求解器中没有内置模拟退火或局部搜索。一些“高级”求解器可能更快,例如使用基于约束的本地搜索 (bitbucket.org/oscarlib/oscar/wiki/Home) 的实验性 OscaR CBLS 求解器。在最新的 Gecode 版本中,支持“可从 FlatZinc 访问的 LNS 的简单形式”,但我尚未对此进行测试,我不知道它是否对您的情况有所帮助。见gecode.org/doc-latest/reference/…
  • 由于这是一个调度问题,也许您可​​以使用其他约束,例如累积等?如前所述,仅使用 alldifferent 会使搜索树变得非常大。
  • 吉姆,如果你把完整的模型(包括数据)发给我,我可以快速浏览一下,看看我是否能看到任何“明显”的改进。
猜你喜欢
  • 2017-04-10
  • 1970-01-01
  • 2019-09-14
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
相关资源
最近更新 更多