cerca
RO - Inviti a cena
modifica cronologia stampa login logout

Wiki

UniCrema


Materie per semestre

Materie per anno

Materie per laurea


Help

RO - Inviti a cena

 :: RO - Inviti a cena ::

Testo

Il ricercatore operativo, stanco di studiare per l'esame, vuole concedersi alcuni giorni di allegria e pianifica di invitare a cena alcune sue amiche (una per sera, naturalmente). Alcune tra le ragazze si conoscono tra loro e se una fosse invitata ciò sarebbe risaputo dalle sue amiche. Onde evitare spiacevoli scene di gelosia, il piano degli inviti a cena deve essere perciò congegnato in modo che nessuna delle invitate sia amica di un'altra invitata. Il giovanotto attribuisce un indice di gradimento ad ogni ragazza, pari al piacere di passare la serata con lei, e desidera naturalmente che gli inviti siano tali da massimizzare il gradimento complessivo, cioè la somma degli indici di gradimento delle ragazze invitate. Formulare il problema come problema di PLI (Max Independent Set pesato) e risolvere con LINDO il seguente esempio:

Valori: Samantha 100 Jessica 100 Melissa 90 Pamela 85 Naomi 50 Anastasia 20 Genoveffa 15 Gertrude 10

Amicizie: Samantha - Jessica - Melissa Jessica - Melissa - Pamela Jessica - Gertrude Melissa - Genoveffa Pamela - Naomi Gertrude - Genoveffa - Naomi Gertrude - Genoveffa - Anastasia

Soluzione ottima: Valore ottimo: Samantha, Pamela, Anastasia 205

Soluzione

Nella parte dei vincoli che si vede nella soluzione qui sotto, ce ne sono di due tipi: quelli a 2 variabili e quelli a 3 variabili.

I vincoli a 2 variabili riguardano le coppie di ragazze che sono amiche. Ad esempio, Pamela e Naomi fanno parte di una coppia. Ma nel testo notiamo che ci sono anche triplette di amiche. Possiamo allora raggruppare i vincoli in triplette. La cosa di per sé non cambia il risultato, ma c'è un'osservazione da fare.

Prendiamo i primi tre vincoli:

x1 + x2 <= 1
x1 + x3 <= 1
x2 + x3 <= 1

Se voglio raggrupparli in un vincolo solo, potrei scrivere

2x1 + 2x2 + 2x3 <= 3

da cui tiro fuori, dividendo per due:

x1 + x2 + x3 <= 1.5

E questo significa che il mio incolo di binarietà non è propriamente espresso dal vincolo. Infatti, il fatto che ho un gruppo di 3 amiche vuol dire che devo invitarne solo 1 di quel gruppo. D'accordo che le variabili sono dichiarate binarie, e che quindi i valori non interi saranno scartati, ma se scrivo le cose per bene, ovvero

x1 + x2 + c3 <= 1

allora il solutore trova subito un upper bound migliore, rispetto a prima, mettendoci meno tempo.

Per gli amanti delle definizione, questo vincolo triplo si chiama vincolo di clique, dove la clique è un sottografo completo di un grafo. E infatti questo vincolo rappresenta proprio una clique di amiche di cui solo una va prescelta.

! Inviti a cena

! Variabili: x(i) = invito a cena ragazza i = 1..8 (binaria)

!funzione  obiettivo: max valore complessivo

max 100 x1 + 100 x2 + 90 x3 + 85 x4 + 50 x5 + 20 x6 + 15 x7 + 10x8

st

! Vincoli su inviti indipendenti: non posso invitare coppie di amiche che si conoscono
! Li scrivo nella forma x1 + x2 <= 1

!x1 + x2 <= 1
!x1 + x3 <= 1
!x2 + x3 <= 1

x1 + x2 + x3 <= 1

!x2 + x4 <= 1
!x3 + x4 <= 1

x2 + x3 + x4 <= 1

x4 + x5 <= 1
x2 + x8 <= 1
x3 + x7 <= 1

!x5 + x8 <= 1
!x5 + x7 <= 1
!x7 + x8 <= 1

x5 + x7 + x8 <= 1

!x8 + x6 <= 1
!x7 + x6 <= 1

x6 + x7 + x8 <= 1

end

int 8