solveror-toolsanswer-set-programmingclingo

Solver: OR-Tools or clingo(ASP) model for "simple" logical problem


I try to solve a "simple" logical problem with OR-Tools or clingo(ASP). It goes like this: I have a set of Persons like Person(Tony, Bob, Ann, Carl, Amber, Peter) I also have groups like Group1(Bob, Ann, Carl, Amber, Peter), Group2(Bob, Amber), and Group3(Amber). Now I want to select two persons from Group1, one person from Group2 and one person from Group3 - so in total four persons with all constraints fulfilled. Possible solutions would be Carl, Ann, Bob, Amber or Peter, Ann, Bob, Amber or Carl, Peter, Bob, Amber. How can I achieve that?

Edit: I tried this in ASP clingo:

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.

But I only get:

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

Thanks and regards


Solution

  • You formulated your described problem perfectly in ASP and it shows the correct results. What you forgot to state is that you do not want to select the same person from two different groups.

    I modified your ASP program to the following:

    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).
    

    This gives your expected answers.