Il cuoco Arturo Pellegnisi della nazionale Italiana di Bocce si trova alle prese con un difficile compito: decidere il menu per il ritiro primaverile dei campioni d'Europa 2009; l'evento, sponsorizzato da “Suprema™ – Campioni in ogni campo”, durerà ben 4 giorni.
Arturo è in special modo preoccupato di cosa servire nei 4 pranzi, ciascuno dei quali consisterà di 3 portate. Come ogni cuoco che si rispetti, egli non servirà mai uno stesso piatto per due giorni di fila; oltre a ciò, la dieta di un campione deve essere equilibrata, così che nel corso del ritiro gli atleti dovranno assumere la medesima quantità di carboidrati, proteine, latticini e fibre.
Arturo sceglierà i piatti da servire dalla seguente lista:
Si modelli la scelta del menu come un problema di soddisfacimento di vincoli, e si mostri una possibile soluzione.
i
-ma del pranzo j
-mo:Pi,j∈{Ps,Ca,Uo,Fo,Pa,Ve,Fr,In,Yo,Nu}
ALLDIFF([P0,0,P1,0,P2,0,P0,1,P1,1,P2,1])ALLDIFF([P0,1,P1,1,P2,1,P0,2,P1,2,P2,2])ALLDIFF([P0,2,P1,2,P2,2,P0,3,P1,3,P2,3])
Ti,j∈{Car,Pro,Lat,Fib}
(Ti,j=Car)=max
\text{GCC}(T, [Car, Pro, Lat, Fib], [3, 3, 3, 3], [3, 3, 3, 3])
Una possibile soluzione:
Giorno 0 | Giorno 1 | Giorno 2 | Giorno 3 |
---|---|---|---|
Pasta [car] | Formaggio [lat] | Patate [car] | Formaggio [lat] |
Carne [pro] | Uova [pro] | Carne [pro] | Verdure [fib] |
Yogurt [lat] | Frutta [fib] | Insalata [fib] | Pane e Nutella [car] |
Si consideri questo grafo dei valori per il vincolo {\rm\scriptsize GCC}
Si consideri questo grafo dei valori per il vincolo {\rm\scriptsize GCC}
flusso [req, cap]
X [0, 1]
Si consideri questo grafo dei valori per il vincolo {\rm\scriptsize GCC}
Innanzitutto occorre ottenere il grafo residuale:
(i,j)
del grafo originale(i,j)
sse f(i,j) < cap(i,j)
(i,j)
ha capacità cap(i,j) - f(i,j)
(j,i)
sse f(i,j) > req(i,j)
(j,i)
ha capacità f(i,j) - req(i,j)
Alcune conseguenze:
(i,j)
o un arco (j,i)
s
e le variabili posso avere requisiti e capacità diverseInnanzitutto occorre ottenere il grafo residuale:
s
e 0
Poi cerchiamo un percorso aumentante:
Se tra due nodi ci sono due archi (e.g. s
e 0
), solo uno di essi sarà utilizzato, perché non si può visitare lo stesso nodo più di una volta
Modifichiamo il flusso ed otteniamo un nuovo grafo residuale:
Cerchiamo i componenti fortemente connessi:
Regola: nodi che fanno parte di un ciclo compaiono nello stesso componente fortemente connesso
Cerchiamo i componenti fortemente connessi:
Ecco il risultato finale:
x_0 \in \{0\}, x_1 \in \{1\}, x_2 \in \{1\}, x_3 \in \{2\}
Si consideri il seguente CSP:
\begin{align}
\fbox{0}\quad & x_0 + x_1 = x_2\\
\fbox{1}\quad & x_1 = (x_0 \leq 2) + (x_2 = 3) \\
\fbox{2}\quad & x_0 + x_2 \leq 4
\end{align}
con: x_0 \in \{0..4\}, x_1 \in \{0,1\}, x_2 \in \{2,3\}
Ipotesi:
+
" e "\leq
", GAC per "=
"Si consideri il seguente CSP:
\begin{align}
\fbox{0}\quad & x_0 + x_1 = x_2\\
\fbox{1}\quad & x_1 = (x_0 \leq 2) + (x_2 = 3) \\
\fbox{2}\quad & x_0 + x_2 \leq 4
\end{align}
con: x_0 \in \{0..4\}, x_1 \in \{0,1\}, x_2 \in \{2,3\}
Step 1, vincolo \fbox{0}
\{0..4\} + \{0,1\} = \{2,3\}
x_0 \in \{1..3\}, x_1 \in \{0,1\}, x_2 \in \{2,3\}
Step 2, vincolo \fbox{1}
\{0,1\} = (\{1..3\} \leq 2) + (\{2,3\} = 3)
\{0,1\} = \{0,1\} + \{0,1\}
Step 3, vincolo \fbox{2}
\{1..3\} + \{2,3\} \leq 4
x_0 \in \{1..2\}, x_1 \in \{0,1\}, x_2 \in \{2,3\}
Step 4, vincolo \fbox{0}
\{1..2\} + \{0,1\} = \{2,3\}
---
Step 5, vincolo \fbox{1}
\{0,1\} = (\{1,2\} \leq 2) + (\{2,3\} = 3)
\{0,1\} = \{1\} + \{0,1\}
\{1\} = \{1\} + \{0\}
(\{2,3\} = 3)
è falso, quindi 3
viene eliminatox_0 \in \{1,2\}, x_1 \in \{1\}, x_2 \in \{2\}
Step 6, vincolo \fbox{2}
\{1,2\} + \{2\} \leq 4
---
Step 7, vincolo \fbox{0}
\{1,2\} + \{1\} = \{2\}
x_0 \in \{1\}, x_1 \in \{1\}, x_2 \in \{2\}
A questo punto tutti i vincoli sono soddisfatti
Passi rimanenti di AC1
\fbox{1}
, domini: ---
\fbox{2}
, domini: ---
\fbox{0}
, domini: ---
\fbox{1}
, domini: ---
\fbox{2}
, domini: ---
Sia dato il seguente CSP (un caso particole di Graph coloring):
\begin{align}
\min z = & \max(x)\\
\text{s.t.: } & {\rm\scriptsize ALLDIFF}([x_0, x_1, x_2, x_3])\\
& {\rm\scriptsize ALLDIFF}([x_2, x_3, x_4, x_5])\\
& x_2 = 1\\
& x_i \in \{0..5\} & \forall i = 0..5
\end{align}
Si discutano alcune modalità per rompere eventuali simmetrie
Il problema presenta diverse simmetrie. In particolare:
{\rm\scriptsize ALLDIFF}
sono indistinguibilix_2
, che è soggetta ad un altro vincoloÈ possibile eliminare molte delle le simmetrie usando il metodo lex-leader, nel caso speciale di variabili soggette ad {\rm\scriptsize ALLDIFF}
x_2
!E.g.:
\begin{align}
& x_0 < x_1 < x_3\\
& x_3 < x_4 < x_5
\end{align}