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
- resistori = 6 (numero di tipi di resistori)
- dispResi (numero di resistori di tipo i=1..6 disponibili)
- resistenzai (resistenza del resistore i=1..6)
- posizioni = 4 (numero posizioni possibili in cui collocare il resistore)
- resDes = 65 (valore di resistenza totale desiderato)
Variabili
- xij (variabile binaria che indica se il resistore i=1..6 è nella posizione j=1..4)
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
- vincolo che impone che in ogni posizione ci sia un unico resistore:
(somma)i xij = 1 (per ogni j)
- vincolo che impone che non si utilizzino più resistori di tipo i di quanti siano disponibili:
(somma)j xij <= dispResi (per ogni i)
- vincolo che introduce la variabile ausiliaria resPosj descritta nel paragrafo sulle variabili:
resPosj = (somma)j xij * resistenzai (per ogni j)
- vincolo che introduce la variabile ausiliaria resTot per il calcolo della resistenza totale:
resTot = [(resPos1 * resPos2) / (resPos1+ resPos2)] + [(resPos3 * resPos4) / (resPos3 + resPos4)]
Con queste ultime due variabili ausiliarie ci semplifichiamo la vita per la notazione delle espressioni, non è che sono realmente necessarie per risolvere il problema. Vabbè, si chiamano ausiliarie apposta.
- vincoli per definire la variabile ausiliaria z necessaria per la nostra funzione obiettivo. Vogliamo trovare il massimo scostamento in valore assoluto dal valore desiderato, quindi dovremo considerare sia il caso in cui resTot sia maggiore di resDes, sia il caso contrario:
z >= resTot - resDes
z >= resDes - resTot
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