MiniZinc约束中如何正确遍历二维数组解决图着色报错问题
问题根因
报错并非是Adjacency数组的遍历逻辑错误,核心问题是顶点编号与coloring数组的索引范围不匹配:
你定义的coloring数组下标范围为1..N_Vertices(即1~4),但Adjacency中存储的顶点编号为0、1、2、3,当读取到第一个边的顶点0时,尝试访问coloring[0]会触发数组越界,越界操作在布尔约束中会被判定为假,最终导致模型不可满足。
修正方案
有两种可选的修正方式,二选一即可:
方案1:调整coloring数组索引适配0开头的顶点编号
直接修改coloring的下标范围,和你设定的0起始顶点编号对齐,修正后完整代码如下:
int: N_Vertices=4; int: N_Edges=3; array[1..N_Edges, 1..2] of int: Adjacency; Adjacency = [| 0, 1 | 1, 2 | 1, 3|]; % 索引范围修改为0~N_Vertices-1,适配顶点编号 array [0..N_Vertices-1] of var int: coloring; constraint forall(e in 1..N_Edges)(coloring[Adjacency[e, 1]] != coloring[Adjacency[e, 2]]); constraint forall(c in coloring)(c >= 0); solve minimize (max(coloring));
方案2:调整顶点编号为1开头适配原有coloring定义
把Adjacency中的顶点编号全部加1,改为1~4的范围,和原有1开头的coloring索引对齐,仅需修改Adjacency赋值部分即可:
Adjacency = [| 1, 2 | 2, 3 | 2, 4|];
运行结果
修正后模型可正常求解,你提供的4顶点测试图最少需要2种颜色,可输出合法的染色结果。
内容的提问来源于stack exchange,提问作者Nourless
相关产品推荐
相关产品推荐

