Problema PLI
Salve a tutti, vorrei proporvi una bella sfida!
Dato il seguente problema di PLI, secondo voi come si potrebbe modellizzare il vincolo del "non più di 2 portate diverse"?
Ringrazio in anticipo chi risponderà!
Dato il seguente problema di PLI, secondo voi come si potrebbe modellizzare il vincolo del "non più di 2 portate diverse"?
Ringrazio in anticipo chi risponderà!

Risposte
Non mi sembra un problema particolarmente complicato. Ad ogni modo mettimi in evidenza gli eventuali errori presenti nella mia soluzione.
Per comodità nelle sommatorie definisco $text(Antipasti)=1 text(, ....... , Dolci)=4$.
Definisco:
$v_(i,j)$ è il voto dato alla persona $j$-esima ($j=A,...,F$) per la tipologia di portata $i$-esima ($i=1,...,4$).
$x_(i,j)$ è il numero di piatti della portata $i$-esima che porterà la $j$-esima persona.
$M$ è un valore arbitrario molto grande, ipoteticamente $+ oo$
La soluzione è la seguente:
$max sum_{i=1}^{4}sum_{j=A}^{F}v_(i,j)*x_(i,j)$
$sum_{i=1}^{4}x_(i,j)<=3 text( )j=A,...,F text( [1] )$
$y_(i,j)<=1 text( (*))$
$M*y_(i,j)>=x_(i,j) text( (*))$
$sum_{i=1}^{4}y_(i,j)<=2 text( )j=A,...,F text( [2])$
$sum_{i=1}^{4}x_(i,j)>=1 text( )j=A,...,F text( [3])$
$x_(i,j)>=0 text( )i=1,..,4 text( )j=A,...,F$
$y_(i,j)>=0 text( intero) text( )i=1,..,4 text( )j=A,...,F$
$(**)$ l'elemento $y_(i,j)$ mi permette di contare se una portata ($i$-esma) viene portata dal $j$-esimo amico. Questo per differenziare il discorso delle portate da quello dei piatti. E' necessario perché altrimenti i vincoli 1 e 2 avrebbero la stessa scrittura (con il secondo però che non funzionerebbe come voluto!).
$[1]$ rappresenta il vincolo 1
$[2]$ rappresenta il vincolo 2
$[3]$ rappresenta il vincolo 3
Mi sembra che non ci dovrebbero essere problemi. Eventualmente fammeli presenti!
Per comodità nelle sommatorie definisco $text(Antipasti)=1 text(, ....... , Dolci)=4$.
Definisco:
$v_(i,j)$ è il voto dato alla persona $j$-esima ($j=A,...,F$) per la tipologia di portata $i$-esima ($i=1,...,4$).
$x_(i,j)$ è il numero di piatti della portata $i$-esima che porterà la $j$-esima persona.
$M$ è un valore arbitrario molto grande, ipoteticamente $+ oo$
La soluzione è la seguente:
$max sum_{i=1}^{4}sum_{j=A}^{F}v_(i,j)*x_(i,j)$
$sum_{i=1}^{4}x_(i,j)<=3 text( )j=A,...,F text( [1] )$
$y_(i,j)<=1 text( (*))$
$M*y_(i,j)>=x_(i,j) text( (*))$
$sum_{i=1}^{4}y_(i,j)<=2 text( )j=A,...,F text( [2])$
$sum_{i=1}^{4}x_(i,j)>=1 text( )j=A,...,F text( [3])$
$x_(i,j)>=0 text( )i=1,..,4 text( )j=A,...,F$
$y_(i,j)>=0 text( intero) text( )i=1,..,4 text( )j=A,...,F$
$(**)$ l'elemento $y_(i,j)$ mi permette di contare se una portata ($i$-esma) viene portata dal $j$-esimo amico. Questo per differenziare il discorso delle portate da quello dei piatti. E' necessario perché altrimenti i vincoli 1 e 2 avrebbero la stessa scrittura (con il secondo però che non funzionerebbe come voluto!).
$[1]$ rappresenta il vincolo 1
$[2]$ rappresenta il vincolo 2
$[3]$ rappresenta il vincolo 3
Mi sembra che non ci dovrebbero essere problemi. Eventualmente fammeli presenti!
