:: Ricerca Operativa - Museo ::
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:
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.
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.