cerca
Ricerca Operativa - PLI - Comizi - 19.04.01
modifica cronologia stampa login logout

Wiki

UniCrema


Materie per semestre

Materie per anno

Materie per laurea


Help

Ricerca Operativa - PLI - Comizi - 19.04.01

Torna alla pagina di Ricerca Operativa


 :: Ricerca Operativa - PLI - Comizi - 19.04.01 ::

Testo del problema

E' l'ultimo giorno della campagna elettorale e gli onorevoli Berlustelli e Rutusconi si stanno sfidando all'ultimo comizio. Ciascuno di loro deve percorrere l'autostrada e fermarsi in alcune città per arringare le folle. Ogni loro sosta lungo il viaggio implica un certo tempo fisso, uguale per entrambi ed indipendente dalla città, che deve essere impiegato stringendo mani e baciando bambini. Ogni comizio può essere di due tipi: comizio sintetico, in cui vengono enunciati rapidi slogan, e comizio analitico, in cui vengono esaminati in dettaglio vari punti del programma di governo. Ogni tipo di comizio ha la sua durata standard, indipendente dal numero di persone che vi assistono e uguale per entrambi gli onorevoli. In ogni città corrispondente ad un'uscita dell'autostrada è previsto che possa partecipare al comizio un certo numero di persone a seconda del tipo di comizio che vi si tiene e uguale per entrambi i candidati. Poiché la campagna elettorale volge al termine i comizi devono essere programmati in modo che l'ultimo termini entro la mezzanotte. Lo scopo del viaggio è ovviamente quello di arringare il maggior numero possibile di elettori.
Formulare il problema, classificarlo e risolverlo con i dati del file COMIZI.TXT.

Dati

La seguente tabella fornisce per ogni città in cui i candidati possono fermarsi 
la distanza dall'estremità A dell'autostrada A-Y, e l'audience prevista a 
seconda del tipo di comizio.

Città Distanza (km) Audience1 Audience2 
  a	   0			120	  140
  b	  12			 80	  200
  c	  25			 60	  100
  d	  31			400	  450
  e	  46			200	  250
  f	  60			 10	   30
  g	  72			500	  550
  h	  89			 90	  110
  i	 110			 50	   80
  j      127			300	  330
  k      142			 10	   50
  l	 160			 60	   90
  m	 166			230	  280
  n	 170			190	  240
  o	 180			100	  150
  p	 193			100	  110
  q	 211			100	  180
  r	 218			200	  300
  s	 230			 80	  180
  t	 244			 10	   20
  u	 263			 80	  150
  v	 280			 90	  100
  w	 285			120	  130
  x	 292			500	  650
  y	 298			400	  490

Gli spostamenti tra una città e l'altra avvengono ad una velocità media di 100 Km/h.
Il tempo fisso per ogni sosta è pari a 1/2 ora.
La durata del comizio è di 1 ora (tipo 1) o 1.5 ore (tipo 2).
Il tempo a disposizione è di 16 ore.

Formulazione del problema

Dati

  • citta = 25 (numero di città)
  • com = 2 (numero di tipi di comizio)
  • disti (distanza dalla città i=1..25) [km]
  • audij (audience nella città i=1..25 per il comizio di tipo j=1..2)
  • durj (durata comizio di tipo j=1..2) [h]
  • sosta = 0.5 (tempo minimo per sosta) [h]
  • tMax = 16 (tempo a disposizione) [h]
  • vel = 100 (velocità di spostamento) [km/h]

Variabili

  • xij (indica se il candidato si è fermato nella città i=1..25 e che tipo di comizio j=1..2 ha fatto)

La variabile è binaria.

Funzione obiettivo

max (somma)i (somma)j xij * audij

Vincoli

  • il candidato può fare un solo tipo di comizio per città:
    (somma)j xij <= 1 (per ogni i)

Il tempo a disposizione tMax è di 16 ore, ed ha tre componenti: tempo di trasferimento, tempi dei comizi, tempi fissi per le soste.
Consideriamoli separatamente e poi sommiamoli:

  • calcolo dei tempi di trasferimento:
    [(somma)j xij] * disti / vel <= tStrada (per ogni i)
  • calcolo dei tempi dedicati ai comizi:
    (somma)i (somma)j xij * durj <= tComizi
  • calcolo dei tempi persi nelle soste:
    (somma)i (somma)j xij * sosta <= tSoste
  • ...sommiamo le componenti e otteniamo il vincolo sul tempo a disposizione:
    tStrada + tComizi + tSoste <= tMax

Linghizzazione del problema

! esercizio - Comizi;

model:

sets:
citta /1..25/: distanze;
comizio /1..2/: durata;
svolgimento (citta,comizio): aud, x;
endsets

data:
distanze = 0 12 25 31 46 60 72 89 110 127 142 160 166 170 
           180 193 211 218 230 244 263 280 285 292 298;
aud =   120       140    
	80       200    
	60       100
	400       450 
	200       250    
	10        30    
	500       550    
	90       110    
	50        80    
	300       330  
	10        50    
	60        90    
	230       280    
	190       240    
	100       150    
	100       110    
	100       180
	200       300    
	80       180    
	10        20    
	80       150    
	90       100    
	120       130   
	500       650   
	400       490;
durata = 1 1.5;
sosta = 0.5;
tMax = 16;
vel = 100;
enddata

! funzione obiettivo;
max = @sum(svolgimento(i,j): x(i,j) * aud(i,j));

! vincolo tipo comizio per città;
@for(citta(i): @sum(comizio(j): x(i,j)) <= 1);

! calcolo/vincolo dei tempi di trasferimento;
@for(citta(i): @sum(comizio(j): x(i,j)) * distanze(i) / vel <= tStrada);

! calcolo/vincolo dei tempi dedicati ai comizi;
@sum(svolgimento(i,j): x(i,j) * durata(j)) <= tComizi;

! calolo/vincolo dei tempi persi nelle soste;
@sum(svolgimento(i,j): x(i,j) * sosta) <= tSoste;

! vincolo sul tempo massimo a disposizione;
tStrada + tComizi + tSoste <= tMax;

! dichiarazione variabile binaria x;
@for(svolgimento(i,j): @bin(x(i,j)));

end

Altre domande

Se i due onorevoli percorrono l'autostrada uno da A verso Y e l'altro da Y verso A, chi è avvantaggiato?

L'unico modo per scoprirlo è riformulare il problema e confrontare le due soluzioni. Per invertire il calcolo del tragitto bisognerà cambiare il vincolo:

! calcolo/vincolo dei tempi di trasferimento;
@for(citta(i): @sum(comizio(j): x(i,j)) * distanze(i) / vel <= tStrada);

in:

! calcolo/vincolo dei tempi di trasferimento;
@for(citta(i): @sum(comizio(j): x(i,j)) * (298 - distanze(i)) / vel <= tStrada);

Dove 298 era la distanza dall'ultima città. Risolvendo il problema in questa nuova forma si scopre che il valore ottimo non cambia.

E se piovesse e la velocità dovesse essere ridotta a 60 Km/h?

Bisogna risolvere il problema considerando il tragitto da "A->Y" e "Y->A", impostando stavolta la velocità (variabile vel) a 60. Si scopre così che il valore ottimo è migliore nel tragitto "Y->A", e vale 2780.

A che velocità dovrebbero viaggiare i due candidati per poter arringare più elettori?

Stiamo riformulando la funzione obiettivo del problema: vogliamo ora trovare la velocità minima a cui i candidati devono andare per arringare più elettori di quella che riescono ad arringare a 100 km/h (cioè 2980 persone). La funzione obiettivo va quindi riscritta come:

min = vel

e bisogna introdurre il vincolo che il numero di elettori arringati sia maggiore alla soluzione ottima trovata normalmente, cioè:

@sum(svolgimento(i,j): x(i,j) * aud(i,j)) > 2980;

Le soluzioni ottime trovate sono:

  • per il tragitto "A->Y": 119.2 km/h
  • per il tragitto "Y->A": 106.8 km/h

Quanto costa a ciascuno in termini di numero di elettori arringati la necessità di stringere mani e baciare bambini ad ogni tappa?

Per scoprirlo bisogna eliminare il vincolo:

! calolo/vincolo dei tempi persi nelle soste;
@sum(svolgimento(i,j): x(i,j) * sosta) <= tSoste;

e correggere il vincolo sui tempi totali in:

! vincolo sul tempo massimo a disposizione;
tStrada + tComizi <= tMax;

Risolvendo il problema scopriamo che la soluzione ottima aumenta da 2980 a 3580 elettori aringati.


Torna alla pagina di Ricerca Operativa