Dopo un anno di duro lavoro il giovane ingegner Piero si appresta a partire per le ferie insieme alla sua dolce metà, con cui si è da poco accasato. La vita matrimoniale, si sa, è piena di cambiamenti e l’ingenuo Piero, che pure aveva previsto un certo aumento di bagagli, aveva clamorosamente sottostimato l’entità del fenomeno.
I due sono così davanti agli ultimi pacchetti, chiedendosi se riusciranno a farli entrare nell’ultima valigia (un gioiello high-tech, con due scomparti, ciascuno dei quali organizzabile in due strati).
Si sappia che:
Si modelli il problema di impacchettamento dei bagagli mediante programmazione a vincoli e si specifichi se è risolvibile. Suggerimento: si consiglia di costruire il modello incrementalmente, adattandolo e ristrutturandolo via via in modo da tenere conto delle caratteristiche del problema.
Nota:
La soluzione:
Se fosse possibile trascurare il punto 4, superficie e strati potrebbero essere considerati come due modi diversi di misurare un unico tipo di risorsa (spazio). Sotto questa ipotesi, sarebbe possibile modellare il problema introducendo una variabile per ogni pacchetto per indicare a quale scomparto è assegnato:
V1,V2,A,S∈{0,1}
I vincoli sulle limitazioni di spazio sarebbero modellabili con un singolo un cumulative:
CUMULATIVE([V1,V2,A,S],[1,1,1,1],[1,1,2,2],4)
Il problema è risolvibile, anche tenendo conto del punto 4, cosa che è possibile in diversi modi.
Un primo metodo consiste nell'osservare che un pacchetto alto può essere tranquillamente messo nello stesso scomparto con due pacchetti stretti (bassi), ma non con un pacchetto largo. Si può modellare questa restrizione aggiungendo il vincolo:
A≠S
In alternativa, si può modellare la superficie di ciascuno scomparto come “tempo” in un cumulative. I domini diventano del tipo {0,1,2,3}, dove le posizioni 0/1 fanno riferimento al primo scomparto, mentre 2/3 al secondo scomparto. Un pacchetto stretto avrà un “durata” 1, un pacchetto largo avrà durata 2. Un pacchetto alto utilizzerà due unità di risorsa, mentre un pacchetto basso una sola. Il cumulative diventa:
CUMULATIVE([V1,V2,A,S],[1,1,2,1],[1,1,1,2],2)
Si noti che la capacità è ora 2, anziché 4. Per prevenire che un pacchetto largo sia posizionato a cavallo di due scomparti, è necessario ridurre il dominio di A:
A∈{0,2}
Si consideri il seguente CSP:
0x0+x1=31x1+x2=3
con: x0∈{0..1},x1∈{2..4},x2∈{1..2}
Ipotesi:
+
=
Si consideri il seguente CSP:
0x0+x1=31x1+x2=3
con: x0∈{0..1},x1∈{2..4},x2∈{1..2}
Sequenza di attivazione e domini per AC1:
0
, {0..1}+{2..4}=3
x0∈{0..1},x1∈{2..3},x2∈{1..2}
1
, {2..3}+{1..2}=3
x0∈{0..1},x1∈{2},x2∈{1}
0
, {0..1}+{2}=3
x0∈{1},x1∈{2},x2∈{1}
1
, {2}+{1}=3
x0∈{1},x1∈{2},x2∈{1}
0
, {1}+{2}=3
x0∈{1},x1∈{2},x2∈{1}
1
, {2}+{1}=3
x0∈{1},x1∈{2},x2∈{1}
Sequenza di attivazione e domini per AC3 (1/2):
Initial queue: Q:[(c0,∗),(c1,∗)]
0
, {0..1}+{2..4}=3
x0∈{0..1},x1∈{2..3},x2∈{1..2}
Q:[(c1,∗),(c0,∗)]
1
,{2..3}+{1..2}=3
x0∈{0..1},x1∈{2},x2∈{1}
Q:[(c0,∗),(c1,∗)]
0
, {0..1}+{2}=3
x0∈{1},x1∈{2},x2∈{1}
Q:[(c1,∗),(c0,∗)]
Sequenza di attivazione e domini per AC3 (2/2):
Domains from the previous step: x0∈{1},x1∈{2},x2∈{1}
1
, {2}+{1}=3
x0∈{1},x1∈{2},x2∈{1}
Q:[(c1,∗)]
0
, {1}+{2}=3
x0∈{1},x1∈{2},x2∈{1}
Q:[]
Sia dato questo grafo dei valori per il propagatore basato sul flusso del vincolo ALLDIFF. Gli archi non tratteggiati sono attraversati da una unità di flusso.
Si esegua il propagatore per determinare se il vincolo è ammissibile e per eliminare eventuali valori dai domini delle variabili
Per prima cosa, otteniamo il grafo residuale
Quindi individuiamo un percorso aumentante
Aggiorniamo il grafo residuale
Individuiamo quindi i componenti fortemente connessi
Eliminiamo gli archi con flusso nullo che connettono SCC diversi
x0∈{1,2},x1∈{0},x2∈{3},x3∈{1,2}
Tre squadre ('0', '1 e '2') di calcio partecipano ad un mini-campionato. Ogni squadra deve scontrarsi con le altre in due partite (una "in casa" e l'altra "fuori casa"). Le 6 partite da giocare sono dunque:
(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)
Occorre stabilire in quale sequenza effettuare le partite.
Il problema viene modellato utilizzando due serie di variabili principali:
xk∈{0..2},∀k=0..5
per indicare la squadra di casayk∈{0..2},∀k=0..5
per indicare la squadra ospiteSi definiscano vincoli (ed eventualmente variabili aggiuntive) per garantire che le variabili x
e y
rappresentino correttamente il problema. Si discutano brevemente le scelte fatte.
Una prima soluzione
xk≠yk,∀k=0..5
GCC(x,[0,1,2],[2,2,2],[2,2,2])
GCC(y,[0,1,2],[2,2,2],[2,2,2])
Una prima soluzione
Così facendo, può ancora accedere che una stessa coppia (i,j)
compaia più volte nella sequenza.
È possibile eliminare il problema aggingendo i vincoli seguenti:
xh=xk⇒yh≠yk,∀h,k=0..5,h<k
Seguono due soluzioni più generali.
Una seconda soluzione
Una seconda soluzione consiste nel richiede che ognuna delle coppie (i,j)
sia presente. È utile assegnare un indice numerico alle coppie:
0↔(0,1)1↔(0,2)2↔(1,0)3↔(1,2)4↔(2,0)5↔(2,1)
Usiamo quindi la notazione hi,gi
per riferirci rispettivamente alla squadra di casa ed alla squadra ospite per la coppia di indice i.
A questo punto basta utilizzare i vincoli:
5∑k=0(xk=hi∧yk=gi)=1∀i=0..5
Una terza soluzione
Più complessa, ma migliore in termini di propagazione
i
per riferirci ad ognuna delle 6 coppiezk∈{0..5},∀k=0..5
zk=i
sse la partita di indice i
si svolge in posizione k
ALLDIFF(z)
x
, y
e z
usiamo una serie di vincoli:TABLE([xk,yk,zk],T),∀k=0..5
xk | yk | zk |
---|---|---|
0 | 1 | 0 |
0 | 2 | 1 |
1 | 0 | 2 |
1 | 2 | 3 |
2 | 0 | 4 |
2 | 1 | 5 |
L'esame conterrà una domanda di teoria. Alcuni esempi:
1) Che cosa è un vincolo globale in CP? Per quali ragioni i vincoli globali sono utili? Argomentare indicando alcuni vincoli come esempio.
2) Come si definisce un problema di soddisfacimento di vincoli? Come si definisce un vincolo?
3) Si definiscano la Generalized Arc Consistency e la Bound Consistency. Si discutano le due nozioni di consistenza, evidenziandone vantaggi e svantaggi