ASP Clingo - 获取准确的原子数
ASP Clingo - getting the exact count of atoms
我期待将特定人数分配给特定班次。例如,我有六个人和三个不同的班次。现在我必须为每个班次分配确切的两个人。我试过这样的东西但是..
注意:这个不起作用,所以请尽快编辑以误导人们,我什至删除了“。”在它之后所以没有人复制它:
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
在这里您可以明确地看到,如 shiftCount 中所定义,早班(“mor”)使用了两次以上。我需要更改什么才能获得想要的结果?
将您的 3 行约束替换为
{assign(P,S): person(P)} == K :- shift(S), shiftCount(K).
或者如果你想使用约束写作:
:- {assign(P,S): person(P)} != K, shift(S), shiftCount(K).
第一行说明:对于给定的 shiftCount K
和每个班次 S
:此班次 P
所有人的分配数量 S
是 K
.
约束为:对于 shiftCount K
和班次 S
来说,所有人的分配数量 P
不可能是班次 [=13] =] 不是 K
.
请不要大幅更改您的问题/示例代码,因为这可能会导致此答案不再有效。
我期待将特定人数分配给特定班次。例如,我有六个人和三个不同的班次。现在我必须为每个班次分配确切的两个人。我试过这样的东西但是..
注意:这个不起作用,所以请尽快编辑以误导人们,我什至删除了“。”在它之后所以没有人复制它:
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
在这里您可以明确地看到,如 shiftCount 中所定义,早班(“mor”)使用了两次以上。我需要更改什么才能获得想要的结果?
将您的 3 行约束替换为
{assign(P,S): person(P)} == K :- shift(S), shiftCount(K).
或者如果你想使用约束写作:
:- {assign(P,S): person(P)} != K, shift(S), shiftCount(K).
第一行说明:对于给定的 shiftCount K
和每个班次 S
:此班次 P
所有人的分配数量 S
是 K
.
约束为:对于 shiftCount K
和班次 S
来说,所有人的分配数量 P
不可能是班次 [=13] =] 不是 K
.
请不要大幅更改您的问题/示例代码,因为这可能会导致此答案不再有效。