【问题标题】:How do I tell my graph coloring problem program to only assign color 1 one time?如何告诉我的图形着色问题程序只分配一次颜色 1?
【发布时间】:2019-10-17 21:57:55
【问题描述】:

基本上,我有一个图形着色程序,其中每个节点与另一个节点的边必须是不同的颜色。这是我的代码:

node(1..4).

edge(1,2).
edge(2,3).
edge(3,4).
edge(4,1).
edge(2,4).

color(1..3).

{ assign(N,C) : color(C) } = 1 :- node(N).

1 { assign(N,1) : color(1) } 1 :- node(N). %line in question

:- edge(N,M), assign(N,C), assign(M,C).

如何告诉程序只分配颜色 1 一次?标记为 %line 的行是给我带来问题的行。这是我尝试过的另一个不起作用的解决方案:

node(1..4).

edge(1,2).
edge(2,3).
edge(3,4).
edge(4,1).
edge(2,4).

color(1..3).

{ assign(N,C) : color(C) } = 1 :- node(N).

:- edge(N,M), assign(N,C), assign(M,C).

vtx(Node, Color) :- node(Node), color(Color).

1 { vtx(N, 1) : color(1) } 1 :- node(N).

#show vtx/2.

如果有人可以帮助我,将不胜感激。

【问题讨论】:

    标签: answer-set-programming clingo


    【解决方案1】:

    在这种限制单一颜色只能使用一次的简单情况下,您可以编写单一约束

    :- assign(N, 1), assign(M, 1), node(N), node(M), N!=M.
    

    【讨论】:

      【解决方案2】:

      实际上,您标记为有问题的行:

      1 { assign(N,1) : color(1) } 1 :- node(N). %line in question
      

      可以翻译成

      如果N 是一个节点,我们将(而且我们必须)将color(1) 分配给node(N),并且只分配一次,即如果node(i) 为真,我们将只有一个node(i, 1)

      因此,使用此规则和您的事实node(1..4),您将立即获得assign(1,1)assign(2,1)assign(3,1)assign(4,1)。这在颜色问题(带有最后一个约束)下绝对不能满足。

      回到你的要求:

      如何告诉程序只分配颜色 1 一次?

      这里的问题是您在该行中设置的约束:“color 1 is assigned only once”适用于每个node(i), i=1,2,3,4,而不是所有节点。

      为了更清楚,您不妨考虑将这一行实例化为:

      1 { assign(1,1) : color(1) } 1 :- node(1). 
      1 { assign(2,1) : color(1) } 1 :- node(2). 
      1 { assign(3,1) : color(1) } 1 :- node(3). 
      1 { assign(4,1) : color(1) } 1 :- node(4).
      

      如果node(1..4) 全部为真,我们将拥有assign(1,1)assign(2,1)assign(3,1)assign(4,1)

      您想要的是assign(N, 1) 在答案中出现一次且仅出现一次,因此在您的规则中,这应该是正确的,没有首映条件。

      因此,将问题行改为:

      { assign(N,1): node(N), color(1) } = 1. %problem line changed
      

      你会得到正确的分配:

      clingo version 5.4.0
      Reading from test.lp
      Solving...
      Answer: 1
      assign(2,2) assign(1,3) assign(3,3) assign(4,1)
      Answer: 2
      assign(1,2) assign(2,3) assign(3,2) assign(4,1)
      Answer: 3
      assign(2,1) assign(1,3) assign(3,3) assign(4,2)
      Answer: 4
      assign(2,1) assign(1,2) assign(3,2) assign(4,3)
      SATISFIABLE
      

      直观地说,这行意味着assign(N, 1) 在任何情况下都应该在答案集中,只要N 是一个节点。这将计算所有节点而不是每个节点。

      【讨论】:

        猜你喜欢
        • 2015-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-17
        • 1970-01-01
        • 2018-01-13
        相关资源
        最近更新 更多