Salta ai contenuti. | Salta alla navigazione

Strumenti personali

CLP 22 giugno 2011

Applicazioni di Intelligenza Artificiale - CLP

Prof. Marco Gavanelli

22 giugno 2011

Esercizio (8 punti)

Un gruppo di adolescenti va a mangiare in un fast-food e ciascuno di loro decide di acquistare alcuni prodotti fra quelli disponibili (ad esempio, uno potrebbe volere un MaxiBurger, una porzione piccola di patatine e un'aranciata grande).

Nel fast-food, oltre ai singoli prodotti, si possono acquistare delle combinazioni, dette `menù', che sono più convenienti rispetto al costo dei singoli prodotti. Ad esempio, un MaxiBurger + patatine medie + aranciata media + dessert costa meno della somma dei singoli prodotti. I menù disponibili sono riportati nel file menu.pl; esso contiene dei fatti

menu(ListaProdotti,Costo).

dove ListaProdotti è una lista di lunghezza pari ai prodotti disponibili nel fast-food; contiene valori 0 o 1 che rappresentano se il corrispondente prodotto è contenuto nel menù. Costo è il costo del menù.

Gli amici decidono di mettere insieme tutte le loro richieste e di acquistare combinazioni di menù in modo da minimizzare la spesa totale.

Si scriva un programma CLP che risolve il problema; il predicato principale dovrà prendere in ingresso una lista di richieste, che si suppone abbia lunghezza pari al numero di prodotti in vendita nel fast-food, e dovrà fornire la combinazione ottima.


 

 

 

Soluzione

 


:- lib(matrix_util).
:- lib(fd_global).
:- lib(fd).
:- [menu].

panini(Lrich,Sol):-
    findall(L,menu(L,_),Matrix),
    findall(C,menu(_,C),Costi),
    length(Matrix,NumMenu),
    sumlist(Lrich,Max),
    length(Sol,NumMenu),
    Sol :: 0..Max,
    transpose(Matrix,Trasposta),
    prodotto(Trasposta,Sol,Lrich),
    prod_scal(Sol,Costi,TermineCosto),
    CostoTot #= TermineCosto,
    minimize(labeling(Sol),CostoTot).

prod_scal([A],[B],A*B).
prod_scal([A|La],[B|Lb],A*B+C):-
    prod_scal(La,Lb,C).

prodotto([],_,[]).
prodotto([A|La],B,[C|Lc]):-
    prod_scal(A,B,TermC),
    TermC #= C,
    prodotto(La,B,Lc).