Torna alla pagina di Ricerca Operativa
:: Ricerca Operativa - PLI - Ambulanze - 16.04.09 ::
Testo del problema
Un territorio che comprende un certo numero di centri abitati deve essere coperto da un dato numero di ambulanze per il pronto intervento. Le ambulanze possono sostare presso apposite rimesse dislocate nel territorio, in posizioni date. Da ciascuna di queste posizioni ogni ambulanza può coprire alcuni dei centri abitati, ma non tutti. Un centro abitato si intende coperto quando esiste almeno un’ambulanza in grado di raggiungerlo entro un dato tempo limite.
Conoscendo la popolazione residente in ciascuno dei centri abitati, localizzare le ambulanze in modo da massimizzare la copertura della popolazione.
Dati
I centri abitati sono 9, le postazioni disponibili sono 6,
le ambulanze sono 3.
Tab. 1: Popolazione [n. abitanti]
Paese Popolazione
1 250
2 450
3 1000
4 825
5 1100
6 940
7 120
8 280
9 480
Tab. 2: Tempo di intervento [minuti]
Paese Postazione
1 2 3 4 5 6
1 1 3 12 6 12 4
2 2 2 11 2 13 8
3 5 3 12 0 19 7
4 7 5 14 1 21 9
5 5 0 8 3 11 3
6 14 8 0 12 6 12
7 17 12 3 16 2 9
8 12 8 8 12 2 4
9 7 3 12 7 7 0
Tab. 3: Disponibilità ambulanze
N. Ambulanze Frazione di tempo
0 15%
1 20%
2 30%
3 35%
Tempo max di intervento = 8 minuti.
Formulazione del problema
Dati
- centri = 9 (numero di centri abitati)
- post = 6 (numero di postazioni disponibili)
- ambul = 3 (numero ambulanze disponibili)
- popoli (popolazione del centro abitato i=1..9)
- tIntij (tempo di intervento dalla postazione j=1..6 al centro abitato i=1..9) [minuti]
- dispAmbk (disponibilità ambulanza k=1..3 espressa come frazione di tempo) [%]
- maxInt = 8 (tempo massimo di intervento) [minuti]
Variabili
- xi (variabile binaria che indica se il centro abitato i è coperto o no)
- yj (variabile binaria che indica se nella postazione j c'è un'ambulanza)
Funzione obiettivo
(somma)i max xi * popoli
Vincoli
- vincolo sulla disponibilità di ambulanze:
(somma)j yj = ambul
- vincolo che impone che le città coperte siano solo quelle a cui le ambulanze possono arrivare entro il tempo limite:
xi <= (somma)j yj "per cui tIntij <= maxInt"
Non sapendo come altro scriverlo ho messo la condizione tra virgolette. In altre parole verranno conteggiate nella somma solo quelle postazioni che distano meno di maxInt dal centro abitato. In questo modo se non ce n'è nemmeno una, allora xi dovrà essere <= 0 (come è ovvio che sia), altrimenti potrà valere anche 1.
Linghizzazione del problema
! esercizio: ambulanze;
model:
sets:
centro /1..9/: popol,
x;
postazione /1..6/: y;
intervento(centro,postazione): tInt;
endsets
data:
popol = 250 450 1000 825 1100 940 120 280 480;
tInt = 1 3 12 6 12 4
2 2 11 2 13 8
5 3 12 0 19 7
7 5 14 1 21 9
5 0 8 3 11 3
14 8 0 12 6 12
17 12 3 16 2 9
12 8 8 12 2 4
7 3 12 7 7 0;
ambul = 3;
maxInt = 8;
enddata
! funzione obiettivo;
max = @sum(centro(i): x(i) * popol(i));
! vincolo sulla disponibilità di ambulanze;
@sum(postazione(j): y(j)) = ambul;
! vincolo sulla copertura dei centri;
@for(centro(i):
x(i) <= @sum(postazione(j) | tInt(i,j) #LE# maxInt: y(j))
);
! definisco le variabili binarie;
@for(centro(i): @bin(x(i)));
@for(postazione(j): @bin(y(j)));
end
Torna alla pagina di Ricerca Operativa