Swappa : Uni / Ricerca Operativa - Museo
Creative Commons License

 :: Ricerca Operativa - Museo ::

Testo del problema

C'è una stanza in un museo, con 3 quadri appesi alle pareti secondo certe coordinate. Si vuole mettere un sensore d'allarme sul soffitto, in modo che esso "veda" i quadri sotto un certo angolo. La stanza è quadrata, con un lato di 16 metri; sul soffitto il sensore deve essere almeno a 1 metro da ogni parete.

L'ingegner Tizio vuole mettere il sensore in modo tale da massimizzare la somma complessiva degli angoli sotto i quali il sensore vede i quadri.

L'ingegner Caio vuole mettere invece il sensore in modo da massimizzare la minima ampiezza tra tutti e tre gli angoli.

Immaginando di vedere la stanza dal di sopra, ogni quadro ha due coordinate, perché è rappresentato da un segmento:

  1. p1 = (0,0), q1 = (0,4)
  2. p2 = (0,10), q2 = (6,16)
  3. p3 = (10,0), q1 = (15,0)

Risoluzione

Dato un triangolo di lati ABC, abbiamo che: c2 = a2 + b2 - 2abcos(alfa), con alfa l'angolo opposto al lato c.

Consideriamo i quadri, con le coordinate viste sopra, come il lato c di un triangolo con vertice il sensore.

Codice LINGO

model:

SETS:
quadri /1..3/: xp, yp, xq, yq, alfa, a, b, c;
ENDSETS


DATA:
! Le coordinate di ciascun quadro sono messe in colonna;
xp = 0  0 10;
yp = 0 10  0;
xq = 0  6 15;
yq = 4 16  0;
ENDDATA

!Funzione obiettivo: ci sono Tizio e Caio;
! Tizio vuole massimizzare la somma dei tre angoli, esce 3.58 etc. in radianti;
!max = @sum(quadri(i): alfa(i));

!Caio invece vuole massimizzare il minimo angolo;
! Occorre quindi una variabile ausiliaria, massimizzarla, e imporre 
! che sia <= a tutti e tre gli angoli;
max = aux;
@for (quadri(i): aux <= alfa(i));


! Calcolo la lunghezza dei lati;
@for(quadri(i): a(i) = ((xp(i) - X)^2 + (yp(i)- Y)^2)^1/2);
@for(quadri(i): b(i) = ((xq(i) - X)^2 + (yq(i)- Y)^2)^1/2);
@for(quadri(i): c(i) = ((xp(i) - xq(i))^2 + (yp(i)- yq(i))^2)^1/2);

! Calcolo l'angolo alfa per ogni triangolo;
@for(quadri(i): (c)^2 = a(i)^2 + b(i)^2 - 2*a(i)*b(i) * @cos(alfa(i)));

!Vincolo sull'ampiezza dell'angolo;
@for(quadri(i): alfa(i) <= 3.14);

!Vincoli sulla posizione del sensore: deve essere almeno ad un metro dalle pareti;
X >= 1;
X <= 15;
Y >= 1;
Y <= 15;
end

Come si vede, le funzioni obiettivo sono 2, perché 2 sono le proposte. Comunque alla fine salta fuori che i risultati sono molto simili.


Torna alla pagina di Ricerca Operativa

(Printable View of http://www.swappa.it/wiki/Uni/ROMuseo)