Uni.RO-PNL-12feb2009 History
Hide minor edits - Show changes to output
Deleted lines 15-16:
Deleted line 16:
Deleted line 17:
Deleted line 18:
Deleted line 19:
Deleted line 20:
Deleted line 21:
Deleted lines 22-23:
Changed lines 98-99 from:
resTot = [(resPos(1) * resPos(2))/(resPos(1) + resPos(2))] + [(resPos(3) * resPos(4))/(resPos(3) + resPos(4))];
to:
resTot = [(resPos(1) * resPos(2))/(resPos(1) + resPos(2))] + [(resPos(3) * resPos(4))/(resPos(3) + resPos(4))];
Added lines 1-111:
[[Torna alla pagina di Ricerca Operativa -> Ricerca Operativa]] ----
(:title Ricerca Operativa - PNL - Resistenze - 12.02.09:) %titolo%''':: 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) * '''dispRes'_i_'''' (numero di resistori di tipo i=1..6 disponibili) * '''resistenza'_i_'''' (resistenza del resistore i=1..6) * '''posizioni = 4''' (numero posizioni possibili in cui collocare il resistore) * '''resDes = 65''' (valore di resistenza totale desiderato)
!!!Variabili * '''x'_ij_'''' (variabile binaria che indica se il resistore i=1..6 è nella posizione j=1..4)
E' comodo inoltre definire una variabile continua '''resPos'_j_'''' 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_' x'_ij_' = 1''' (per ogni j) * vincolo che impone che non si utilizzino più resistori di tipo i di quanti siano disponibili:\\ '''(somma)'_j_' x'_ij_' <= dispRes'_i_'''' (per ogni i) * vincolo che introduce la variabile ausiliaria resPos'_j_' descritta nel paragrafo sulle variabili:\\ '''resPos'_j_' = (somma)'_j_' x'_ij_' * resistenza'_i_'''' (per ogni j) * vincolo che introduce la variabile ausiliaria resTot per il calcolo della resistenza totale:\\ '''resTot = [(resPos'_1_' * resPos'_2_') / (resPos'_1_'+ resPos'_2_')] + [(resPos'_3_' * resPos'_4_') / (resPos'_3_' + resPos'_4_')]'''\\ 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 -> Ricerca Operativa]]
|