Swappa : Uni / Ricerca Operativa - PNL - Resistenze - 12.02.09
Creative Commons License

Torna alla pagina di Ricerca Operativa


 :: Ricerca Operativa - PNL - Resistenze - 12.02.09 ::

Testo del problema

Si vuole progettare un semplice componente resistivo combinando in serie due blocchi, ciascuno dei quali è formato da due resistori in parallelo. I quattro resistori da usare possono essere scelti all’interno di un insieme di resistori disponibili.
Come effetto si vuole ottenere un componente la cui resistenza sia il più vicina possibile (non importa se maggiore o minore) ad un valore desiderato.
Formulare il problema, classificarlo e risolverlo con i dati del file RESISTEN.TXT.

Dati

Sono disponibili 6 tipi di resistori.

Tipo  Numero  Resistenza
 1      1         12
 2      1         15
 3      2         20
 4      2         22
 5      1         30
 6      1         40

Il valore di resistenza desiderato è 65.

Formulazione del problema

Dati

Variabili

E' comodo inoltre definire una variabile continua resPosj che contenga il valore della resistenza nella posizione j, ed una variabile continua resTot per il calcolo della resistenza totale. Le definiremo meglio poi nei vincoli.

Funzione obiettivo

Si vuole minimizzare lo scostamento massimo dal valore desiderato, quindi introduciamo la variabile ausiliaria z che definiremo poi nei vincoli:
min z

Vincoli

Linghizzazione del problema

! esercizio - Resistenze;
model:

sets:
resistore /1..6/: dispRes, resistenza;
posizione /1..4/: resPos;
disposizione(resistore,posizione): x;
endsets

data:
resistenza = 12 15 20 22 30 40;
dispRes =  1  1  2  2  1  1;
resDes = 65;
enddata

! funzione obiettivo;
min = z;

! vincolo perché ci sia un unico resistore per posizione;
@for(posizione(j): @sum(resistore(i): x(i,j)) = 1);

! vincolo perché non si usino più resistori di quelli disponibili;
@for(resistore(i): @sum(posizione(j): x(i,j)) <= dispRes(i));

! vincolo per definire le variabili ausiliarie resPos;
@for(posizione(j): resPos(k)= @sum(resistore(i): resistenza(i) * x(i,j)));

! vincolo per definire la variabile ausiliaria resTot;
resTot = [(resPos(1) * resPos(2))/(resPos(1) + resPos(2))] 
         + [(resPos(3) * resPos(4))/(resPos(3) + resPos(4))];

! vincoli per definire la variabile ausiliaria z;
z >= resDes - resTot;
z >= resTot - resDes;

! definisco le variabili x come binarie;
@for(tipo(i): @for(posiz(k): @bin(x(i,k))));

end

Torna alla pagina di Ricerca Operativa

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