【问题标题】:create subset and use each atom only once创建子集并仅使用每个原子一次
【发布时间】:2018-04-26 19:30:29
【问题描述】:

我是asp的新手。我需要创建一组团队。每组必须由 3 个随机选择的团队组成。一个团队只能在一个组中。

提前致谢。这是我的代码

team(fener;galata;besik;van;adana;mardin).

neq(X,Y) :- X!=Y,team(X),team(Y).

count(C) :- C = #count{ T : team(T)}.

C/3 {group(X,Y,Z):team(X),team(Y),team(Z), neq(X,Y),neq(X,Z),neq(Z,Y) } C/3 :- count(C).

#show group/3.

可能的输出可能是

group(fener;besik;van) group(galata;mardin;adana)

【问题讨论】:

    标签: answer-set-programming clingo


    【解决方案1】:

    你想要的输出是不可能的:

    group(a;b;c).
    

    暗示:

    group(a). group(b). group(c).
    

    可能的输出是:

    group(a,b,c).
    

    但是 ASP 对可变参数原子或列表元素作为参数并不友好。一个更简单的管理输出是:

    group(1,a). group(1,b). group(1,c).
    

    而且这很容易生成,并且可以让我们避免代价高昂的#count

    % Data
    #const nb_group=2.
    group(1..nb_group).
    team(fener;galata;besik;van;adana;mardin).
    
    % Assign 3 teams to each group
    3{ group(G,T): team(T) }3 :- group(G).
    
    % Two (almost) equilavent constraints:
    1{ group(G,T): group(G) }1:- team(T).  % a team is in only one group
    OR
    :- team(T) ; not group(_,T).  % a team has no group
    

    【讨论】:

    • 你确定 group(a;b;c) 输出是不可能的,请试试我的回答看看是不是。我可能有一些逻辑错误,但就是这样。
    • 因为你想要两个不同的组,你会丢失信息。尝试在group(a;b;c). group(d;e;f). 上运行 cligo。你能确定哪个字母属于哪个组吗?
    • 另一方面,您的答案使用group(a,b,c)。引用我自己的回答:ASP 对可变参数原子或列表元素作为参数并不友好。这就是我提出另一种方式的原因。
    【解决方案2】:

    我想,已经找到解决办法了。

    team(fener;galata;besik;van;adana;mardin).
    
    neq(X,Y) :- X!=Y,team(X),team(Y).
    
    count(C) :- C = #count{ T : team(T)}.
    
    C/3 {group(X,Y,Z):team(X),team(Y),team(Z), neq(X,Y),neq(X,Z),neq(Z,Y) } C/3 :- count(C).
    
    exist_in_group(T) :- group(T,_,_).
    exist_in_group(T) :- group(_,T,_).
    exist_in_group(T) :- group(_,_,T).
    
    :- team(T), not exist_in_group(T).
    
    #show group/3.
    

    输出:

    clingo version 5.0.0
    Solving...
    Answer: 1
    group(besik,fener,adana) group(galata,mardin,van)
    SATISFIABLE
    
    Models       : 1+
    Calls        : 1
    Time         : 0.011s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
    CPU Time     : 0.000s
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 2021-12-27
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      相关资源
      最近更新 更多