aggregate - 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中所定义。我需要改变什么才能得到想要的结果?
解决方案
将您的 3 行约束替换为
{assign(P,S): person(P)} == K :- shift(S), shiftCount(K).
或者,如果您想使用约束写作:
:- {assign(P,S): person(P)} != K, shift(S), shiftCount(K).
第一行说明:对于给定的 shiftCountK
和每个班次:这个班次S
对所有人的分配数是。P
S
K
约束如下: shiftCount和 shift的情况不可能是所有人员分配给班次的数量不是。K
S
P
S
K
请不要大幅更改您的问题/示例代码,因为这可能会导致此答案不再有效。
推荐阅读
- sql - 视图的顺序是否有保证?
- spring - 从 org.springframework.web.reactive.function.BodyInserter 获取请求正文
- mule - Mule Quartz - 除每月第一天外的所有工作日的 Cron
- php - 使用php的文件完整路径位置
- d3.js - 使用 D3 和 Angular 6 明智地绘制美国地图区域
- python - TensorFlow 多 GPU 损失
- xamarin - 绑定 FontSize 无法使用 Xamarin 表单?
- java - 如何将 java 数组转换为 prolog 列表并使用它进行 jpl 查询?
- angular - 如何使用材料表在angular2中使用$key
- linux - 链接两个不同版本的库