【发布时间】:2020-06-21 18:37:45
【问题描述】:
我已经创建了一个模型来解决 MiniZinc 中的图形着色问题:
include "globals.mzn";
int: n_nodes; % Number of nodes
int: n_edges; % Number of edges
int: domain_ub; % Number of colors
array[int] of int: edges; % All edges of graph as a 1D array
array[1..n_edges, 1..2] of int: edges2d = array2d(1..n_edges, 1..2, edges);
array[1..n_nodes] of var 1..domain_ub: colors;
constraint forall (i in 1..n_edges) (colors[edges2d[i,1]] != colors[edges2d[i,2]]);
solve :: int_search(colors, dom_w_deg, indomain_random)
satisfy;
为了解决大问题(大约 400-500 个节点),我从颜色数量的上限开始,并解决连续的满意度问题,将数字减一直到它变得无法满足或超时。这种方法给了我不错的结果。
为了改进我的结果,我在上面的模型中添加了对称破坏约束:
constraint colors[1] = 1;
constraint forall (i in 2..n_nodes) ( colors[i] in 1..max(colors[1..i-1])+1 );
然而,这降低了我在速度和质量方面的结果。
为什么我的模型在添加额外约束后表现不佳?我应该如何添加对称破坏约束?
【问题讨论】:
-
您可以测试不同的搜索策略,哪种方法效果更好(
indomain_random在对称性破坏方面可能不太好)。另外,颜色的上限是多少(domain_ub)?如果是平面图,4色就够了。 -
@hakank 这不是平面图。我用不同的搜索策略进行了测试,尽管
input_order和indomain_min的结果稍好一些,但仍然无法与我没有添加额外约束时相比。 -
@hakank 我正在使用
minizincPython 包来运行模型。对于domain_ub,我从图形的最大度数开始运行一个循环,然后将其递减,直到达到不可满足或超时。 -
好的,那么如果您可以添加一个(小)数据集来显示此行为,那将会有所帮助。
-
@hakank 不幸的是,我在大型数据集上遇到了这个问题。我正在尝试在一个小数据集中重新创建问题,但到目前为止没有运气。
标签: optimization constraint-programming minizinc