微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 CLP(FD) 进行图形着色

如何解决使用 CLP(FD) 进行图形着色

我正在尝试使用 Prolog 中的 CLP(FD) 解决地图/图形着色问题。我从论文中取出谓词 “CLP(FD) 和 ASP 解决方案对 NP 完全问题的比较”,我正在尝试以下示例:

coloring(K,Output) :- graph(Nodes,Edges),create_output(Nodes,Colors,Output),domain(Colors,1,K),different(Output,labeling([ff],Colors).
create_output([],[],[]).
create_output([N | Nodes],[C|Colors],[N-C|Output]) :-
    create_output(Nodes,Output).
different(_,[]).
different(Output,[[A,B]|R]) :- member(A-CA,member(B-CB,CA #\= CB,R).
graph([1,2,3,4,5],[(1,2),(1,3),(2,4),5),(3,5)]).

但是当我运行查询

create_output([1,[a,b,c,d],A).

即使对于这个图表,它只能使用 4 种颜色(a、b、c、d),这也给我带来了错误。当我添加另一种颜色时,它工作正常,似乎节点集应该与颜色集大小相同。但这不是地图着色应该做的。 任何人都能够帮助我理解上述谓词的问题是什么?

解决方法

我认为 create_output/3 应该只在节点实例化的情况下调用。它将使用域变量(即颜色索引)以及节点和颜色之间的关联创建另外 2 个列表。

无论如何,从下面的代码中,你可以看到真正的问题是在 different/2 的头部,其中使用了列表而不是“元组”来匹配边...


:- module(mapcolor,[coloring/2]).

:- use_module(library(clpfd)).

coloring(K,Output) :-
    graph(Nodes,Edges),create_output(Nodes,Colors,Output),domain(Colors,1,K),different(Output,labeling([ff],Colors).

domain(Colors,Low,High) :- Colors ins Low .. High.

create_output([],[],[]).
create_output([N | Nodes],[C|Colors],[N-C|Output]) :-
    create_output(Nodes,Output).

different(_,[]).
different(Output,[(A,B)|R]) :-  % note: was [[A,B]|R]
    member(A-CA,member(B-CB,CA #\= CB,R).

graph([1,2,3,4,5],[(1,2),(1,3),(2,4),5),(3,5)]).

请注意,图形可以仅使用 2 种颜色进行着色:

?- coloring(2,C).
C = [1-1,2-2,3-2,4-1,5-1] ;
C = [1-2,2-1,3-1,4-2,5-2] ;
false.

有4种颜色,有很多解决方案...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。