首页 > 解决方案 > 求解器:用于“简单”逻辑问题的 OR-Tools 或 cligo(ASP) 模型

问题描述

我尝试用 OR-Tools 或 cligo(ASP) 解决一个“简单”的逻辑问题。它是这样的:我有一组像Person(Tony, Bob, Ann, Carl, Amber, Peter)这样的人 我也有像Group1(Bob, Ann, Carl, Amber, Peter) , Group2(Bob, Amber)这样的组, 和Group3(Amber)。现在我想从 Group1 中选择两个人,从 Group2 中选择一个人,从 Group3 中选择一个人 - 所以总共有四个人满足所有约束。可能的解决方案是Carl, Ann, Bob, AmberPeter, Ann, Bob, AmberCarl, Peter, Bob, Amber。我怎样才能做到这一点?

编辑:我在 ASP cligo 中试过这个:

person(tony; bob; ann; carl; amber; peter).
group1(bob; ann; carl; amber; peter).
group2(bob; amber).
group3(amber).

% rules
{select(X): person(X), group1(X)} = 2.
{select(X): person(X), group2(X)} = 1.
{select(X): person(X), group3(X)} = 1.

#show select/1.

但我只得到:

clingo version 5.5.0
Reading from stdin
Solving...
Answer: 1
select(amber) select(carl)
Answer: 2
select(amber) select(peter)
Answer: 3
select(amber) select(ann)
SATISFIABLE

Models       : 3
Calls        : 1
Time         : 0.004s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.000s

谢谢并恭祝安康

标签: prologsolveror-toolsanswer-set-programmingclingo

解决方案


您在 ASP 中完美地阐述了您描述的问题,它显示了正确的结果。您忘记说明的是您不想从两个不同的组中选择同一个人。

我将您的 ASP 程序修改为以下内容:

person(tony; bob; ann; carl; amber; peter).
group1(bob; ann; carl; amber; peter).
group2(bob; amber).
group3(amber).

% select the amount for each group individually
{select(1,X): group1(X)} = 2.
{select(2,X): group2(X)} = 1.
{select(3,X): group3(X)} = 1.

% you are not allowed to select a person in two groups
:- select(G,X), select(G',X), G < G'.

#show .
#show select(X) : select(G,X).

这给出了您预期的答案。


推荐阅读