Optimization 如何优化这个迷你锌应用程序?

Optimization 如何优化这个迷你锌应用程序?,optimization,minizinc,Optimization,Minizinc,我有一个Minizing应用程序,我想通过寻找一些输入数据的低成本排列来最小化某些东西的“成本”。因此,我: array[1 .. n] of var 1 .. n: Seq; ... constraint alldifferent( [ Seq[i] | i in 1 .. n ]); 然后我根据Seq计算成本。该应用程序正在开始工作,但运行时间太长,超过了n个非常小的数字。显然,解算器尝试所有n!可能性。如何进行缩放?如果alldifferent(Seq)是唯一的约束,则解算器将尝试所有置

我有一个Minizing应用程序,我想通过寻找一些输入数据的低成本排列来最小化某些东西的“成本”。因此,我:

array[1 .. n] of var 1 .. n: Seq;
...
constraint alldifferent( [ Seq[i] | i in 1 .. n ]);
然后我根据Seq计算成本。该应用程序正在开始工作,但运行时间太长,超过了n个非常小的数字。显然,解算器尝试所有n!可能性。如何进行缩放?

如果alldifferent(Seq)是唯一的约束,则解算器将尝试所有置换

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

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


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

嗨,吉姆。高复杂度是不可避免的,需要一些启发式方法,如LNS。我也在探索QCSP领域(量化约束求解),感谢GeCodeThank。还有其他限制,但从您的答复中,我开始理解其他限制主要与成本计算有关,因此它们不限制排列搜索。然而,我希望Minizing能用模拟退火的方法找到一个“好”的排列。n大概是50人。这是一个调度问题。有什么方法可以满足我的要求吗?Minizing的默认解算器中没有内置模拟退火或局部搜索。一些“高级”解算器可以更快,例如使用基于约束的局部搜索()的实验性OscaR CBLS解算器。在最新的Gecode版本中,它支持“从Flatzing访问的简单形式的LN”,但我还没有测试过它,我不知道它对您的情况是否有帮助。请看,因为这是一个调度问题,也许您可以使用其他约束,例如累积等?如前所述,仅使用alldifferent将使搜索树变得非常大。Jim,如果您向我发送完整的模型(包括数据),我可以快速查看,看看是否有任何“明显”的改进。