Swappa : Uni / Ricerca Operativa - PNL - Dispersione - 20.01.05
Creative Commons License

Torna alla pagina di Ricerca Operativa


 :: Ricerca Operativa - PNL - Dispersione - 20.01.05 ::

Testo del problema

In un dato territorio si vogliono localizzare alcune infrastrutture “critiche” (depositi di munizioni, impianti chimici, fonti di rumore,...). Ciascuna di esse esercita un’influenza negativa su una superficie circolare di un dato raggio.
Si vuole localizzare le infrastrutture in modo da massimizzare la distanza minima che intercorre tra le loro aree di influenza.
In altri termini si vogliono localizzare nel piano alcuni cerchi in modo da massimizzare la distanza minima tra le loro circonferenze.
Formulare il problema, classificarlo e risolverlo con i dati del file DISPERS.TXT.

Dati

I cerchi sono 20.

Cerchio   1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

Raggio   24 31 15  7 18 22 10  8 25 27 14 13 11 19  2  3  9  4  5 20

La superficie in cui possono essere localizzati i cerchi è circolare, 
con centro nel punto (0,0) e raggio 200.
I cerchi devono essere INTERAMENTE contenuti in tale superficie.

Formulazione del problema

Dati

Variabili

Dobbiamo decidere dove localizzare le infrastrutture, quindi dobbiamo stabilire dove collocare i centri dei cerchi. Avremo bisogno di una variabile per coordinata:

Le variabili sono libere, quindi anche negative.

Funzione obiettivo

Dobbiamo massimizzare la distanza minima tra le aree di influenza, quindi utilizziamo una variabile ausiliaria per rappresentare il minimo delle distanze:
max z

Vincoli

Lighizzazione del problema

! esercizio: Dispersione;
model:

sets:
cerchi /1..20/: raggio,
		x, y; ! variabili;
endsets

data:
raggio = 24 31 15  7 18 22 10  8 25 27 14 13 11 19  2  3  9  4  5 20;
raggioTerr = 200;
enddata

! funzione obiettivo;
max = z;

! vincolo che impone che i cerchi siano interamente interni al territorio; 
@for(cerchi(i): (x(i)^2 + y(i)^2)^0.5 <= raggioTerr - raggio(i));

! vincolo per definire la distanza minima z; 
@for(cerchi(i): 
   @for(cerchi(j) | j #GT# i: 
      ((x(i)-x(j))^2 + (y(i)-y(j))^2)^0.5 - (raggio(i) + raggio(j)) >= d
   )
);

! definisco le variabili libere;
@for(cerchi(i): @free(x(i)));
@for(cerchi(i): @free(y(i)));

end

Torna alla pagina di Ricerca Operativa

(Printable View of http://www.swappa.it/wiki/Uni/RO-PNL-20gen2005)