首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CLP进行图形着色(FD)

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

Stack Overflow用户
提问于 2021-05-11 21:42:41
回答 1查看 62关注 0票数 0

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

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

但是当我运行查询时

create_output([1,2,3,4,5],[a,b,c,d],A).

它甚至让我错误地认为,对于这个图,可以只使用4种颜色(a,b,c,d)。当我添加另一种颜色时,似乎一组节点的大小应该与一组颜色的大小相同。但这不是地图着色应该做的事情。有人能帮我理解上面的谓词有什么问题吗?

EN

回答 1

Stack Overflow用户

发布于 2021-05-12 02:42:11

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

无论如何,从下面的代码中,你可以看到真正的问题是在different/2的头部,其中使用了一个列表而不是一个'tuple‘来匹配一个边……

代码语言:javascript
复制
:- 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, Edges),
    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, Colors, Output).

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

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

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

代码语言:javascript
复制
?- 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种颜色,有很多解决方案...

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67488026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档