如何优化这个 MiniZinc 应用程序?
How to optimize this MiniZinc app?
我有一个 MiniZinc 应用程序,我想通过找到一些输入数据的低成本排列来最小化某些东西的 "cost"。所以我有:
array[1 .. n] of var 1 .. n: Seq;
...
constraint alldifferent( [ Seq[i] | i in 1 .. n ]);
然后我根据 Seq 计算成本。该应用程序开始工作,但运行时间太长,超过了 n 个非常小的数字。显然求解器尝试了所有 n!可能性。我该如何缩放?
如果 alldifferent(Seq) 是唯一的约束,那么求解器将尝试所有排列。
然而,排列中经常存在可能被打破的对称性,例如第一个元素为 1 或者第一个元素总是小于第二个元素等。这类对称性通常非常具体问题。
如果模型中还有其他约束,那么这些约束可能有助于减少搜索 space,可能是通过破坏对称性等
正常情况下n有多大?和往常一样,模型的更多细节有助于给出更具体的帮助。此外,尝试不同的求解器和搜索启发式可以加快速度。
我有一个 MiniZinc 应用程序,我想通过找到一些输入数据的低成本排列来最小化某些东西的 "cost"。所以我有:
array[1 .. n] of var 1 .. n: Seq;
...
constraint alldifferent( [ Seq[i] | i in 1 .. n ]);
然后我根据 Seq 计算成本。该应用程序开始工作,但运行时间太长,超过了 n 个非常小的数字。显然求解器尝试了所有 n!可能性。我该如何缩放?
如果 alldifferent(Seq) 是唯一的约束,那么求解器将尝试所有排列。
然而,排列中经常存在可能被打破的对称性,例如第一个元素为 1 或者第一个元素总是小于第二个元素等。这类对称性通常非常具体问题。
如果模型中还有其他约束,那么这些约束可能有助于减少搜索 space,可能是通过破坏对称性等
正常情况下n有多大?和往常一样,模型的更多细节有助于给出更具体的帮助。此外,尝试不同的求解器和搜索启发式可以加快速度。