首页 > 解决方案 > ASP Clingo - 获取原子的确切数量

问题描述

我期待着为特定的班次分配特定的人数。例如,我有六个人和三个不同的班次。现在我必须为每个班次分配准确的两个人。我试过这样的东西,但是..
注意:不起作用,所以请尽快编辑以误导人们,我什至删除了“。” 在它之后没有人复制它:

person(a)
person(b)
person(c)
person(d)
person(e)
person(f)

shift("mor")
shift("aft")
shift("nig")

shiftCount(2).

{ assign(P,S) : shift(S)} = 1 :- person(P).

% DO NOT COPY THIS! SEE RIGHT ANSWER DOWN BELOW
:- #count{P : assign(P,"mor")} = K, shiftCount(K).
:- #count{P : assign(P,"aft")} = K, shiftCount(K).
:- #count{P : assign(P,"nig")} = K, shiftCount(K).


#show assign/2.

这是否可以计算分配班次的数量,所以我可以分配与给定人数一样多的人?

上面代码的输出(插入“.”时)是:

clingo version 5.5.0
Reading from stdin
Solving...
Answer: 1
assign(a,"nig") assign(b,"aft") assign(c,"mor") assign(d,"mor")
assign(e,"mor") assign(f,"mor")
SATISFIABLE

Models       : 1+
Calls        : 1
Time         : 0.021s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.000s

在这里,您可以清楚地看到,早班(“mor”)班次使用了两次以上,如shiftCount中所定义。我需要改变什么才能得到想要的结果?

标签: aggregateanswer-set-programmingclingogringo

解决方案


将您的 3 行约束替换为

{assign(P,S): person(P)} == K :- shift(S), shiftCount(K).

或者,如果您想使用约束写作:

:- {assign(P,S): person(P)} != K, shift(S), shiftCount(K).

第一行说明:对于给定的 shiftCountK和每个班次:这个班次S对所有人的分配数是。PSK
约束如下: shiftCount和 shift的情况不可能是所有人员分配给班次的数量不是。KSPSK

请不要大幅更改您的问题/示例代码,因为这可能会导致此答案不再有效。


推荐阅读