Ricerca Operativa e Logistica Dott. F.Carrabs e Dott.ssa M.Gentili A.A. 20/202 Lezione 6-8 Rappresentazione di funzioni non lineari: - Costi fissi - Funzioni lineari a tratti
Funzioni obiettivo non lineari: Costi fissi In diversi problemi reali, la produzione di un bene comporta: Ø Un costo proporzionale alla produzione del bene; Ø Un costo fisso di avvio della produzione; Il contributo al costo totale dovuto alla decisione di produrre unità di un dato bene è modellato come segue: costo f()= p+c se >0 0 se =0 p p+c Come modellare una funzione obiettivo di questo tipo?
Funzioni obiettivo non lineari: Costi fissi ) Introduciamo una variabile binaria per indicare quando il costo fisso deve essere considerato: y = se >0 0 se =0 2) aggiungo i vincoli logici: My e y (supponiamo intera. Il secondo vincolo è inutile se la funzione obiettivo è di minimo) 3) la funzione obiettivo viene riscritta come: py+c
Esempio: Processo produttivo con costi fissi Una fabbrica di automobili produce tre tipi di auto A, A2 e A3. La fabbrica ha a disposizione cinque catene di montaggio M,,M5 per la produzione di questi tre modelli. La seguente tabella mostra quante ore sono richieste per produrre un tipo di auto su ogni catena e per quante ore settimanalmente una catena può lavorare. A A2 A3 Ore totali Costo fisso M 2 0 7 40 29000 M2 9 7 5 05 6500 M3 4 5 8 80 7500 M4 2 0 3 20500 M5 5 8 3 96 9000 Il profitto per la vendita delle tre auto è rispettivamente di 29000 Euro per una A, 22000 euro per una A2 e 5000 euro per una A3. Vincoli di produzione aggiuntivi impongono di produrre almeno 5 auto A, almeno 0 A2 e almeno 5 A3. A causa di uno sciopero degli operai però è possibile far funzionare al più tre catene simultaneamente. Si vuole determinare il piano di produzione che massimizzi i profitti.
5 ma 29000! j + 22000! 2 j +5000! 3 j " 29000y "6500y 2 " 7500y 3 " 20500y 4 "900y 5 j= 2 +0 2 + 7 3 #40 9 2 + 7 22 + 5 32 #05 4 + 5 2 +8 3 # 80 +2 2 +0 3 #3 5 +8 2 +3 3 # 96 5! j $ 5 j= 5! 2 j $0 j= 5! 3 j $5 j= 5 j= j + 2 j + 3 j # My j j % {,...,5} y j # j + 2 j + 3 j j % {,...,5} 5! y j # 3 j= Processo produttivo (doppio indice) X ij = numero di macchine Ai prodotte sulla catena di montaggio j se la catena di montaggio Mi viene utilizzata y i = 0 altrimenti ij integer, i % {,2,3}, j % {,...,5}, y j binaria, j %,...,5 5 j= { } Rimuovendo i costi fissi il piano di produzione cambia?
Esempio: Localizzazione di impianti Sia C un insieme di n clienti che devono essere serviti e L un insieme delle possibili localizzazioni dove aprire k impianti. Il costo di servizio del cliente i da parte dell impianto nella locazione j è pari a c ij. Quando un impianto viene attivato si devono sostenere dei costi fissi di apertura pari a p j. Si vogliono localizzare k impianti in modo tale che:. tutti i clienti siano serviti 2. ogni cliente sia servito da non più di un impianto 3. i costi totali siano minimizzati
Esempio: Localizzazione di impianti min" c ij ij + p j y j i!n " j!l " j!l " ij = # i! N j!l " ij $ My j # j! L i!n " j!l y j = k y j! 0, { } #j! L ij! { 0,} #j! L #i! N
Funzioni obiettivo non lineari: lineari a tratti Un altro tipo di funzione non lineare che può essere rappresentata tramite le variabili intere sono le funzioni lineari a tratti. f ( ) c = c c 2 3 se 0 4 se 4 < 0 se0 < 5 c c 2 c 3 0 4 0 5 Come modellare una funzione obiettivo di questo tipo?
Funzioni obiettivo non lineari: lineari a tratti f ( ) c = c c 2 3 se 0 4 se 4 < 0 se0 < 5 c c 2 c 3 Come modellare una funzione obiettivo di questo tipo? 0 2 3 4 0 5 L idea è di gestire separatamente i tre intervalli in cui varia la introducendo 3 variabili decisionali, 2 e 3 associate ai tre intervalli e tali che = + 2 + 3. Le i assumono il seguente significato: = indica di quanto supera il valore 0, senza eccedere 4. (0 4) 2 = indica di quanto supera il valore 4 senza eccedere 0. (0 2 6) 3 = indica di quanto supera il valore 0 senza eccedere 5. (0 3 5)
Funzioni obiettivo non lineari: lineari a tratti f ( ) = c c c 2 3 se 0 4 se 4 < 0 se0 < 5 c c 2 c 3 Come modellare una funzione obiettivo di questo tipo? 0 2 3 4 0 5 Affinchè sia rispettato il significato dato alle i nel punto è necessario garantire che: 2 >0 =4 e che 3 >0 2 =6. A tal fine introduciamo le seguenti variabili logiche:! y = se = 4 " # 0 altrimenti Ed inseriamo i seguenti vincoli:! y 2 = se = 6 2 " # 0 altrimenti 4y!! 4 6y 2! 2! 6y 0! 3! 5y 2
Funzioni obiettivo non lineari: lineari a tratti Il modello finale è: minc + c 2 2 + c 3 3 = + 2 + 3 4y!! 4 6y 2! 2! 6y 0! 3! 5y 2 i " 0, y i # {0,} Verifichiamo quali valori assumono le i al variare delle variabili logiche y j Consideriamo le possibili combinazioni di valori di y e y 2: y =0 e y 2 =0 0 4, 2 = 3 =0 0 4 y =0 e y 2 = non si può verificare y = e y 2 =0 X =4, 0 2 6, 3 =0 4 0 y = e y 2 = =4, 2 =6, 0 3 5 0 5 In generale se si hanno k segmenti la tipologia di vincoli da definire è del tipo: L j y j j L j y j- dove L j è la lunghezza del j-esimo segmento
Esempio (naive): Acquisto dvd Il signor Rossi ha bisogno di acquistare 80 DVD e, a tal fine, si reca in un centro commerciale dove c è un eccezionale offerta proprio sull acquisto di DVD. L offerta consiste nell applicare un prezzo via via decrescente al crescere del numero di dvd acquistati in accordo alle seguenti fasce: costo = 60. 30. 0. 30 per i primi00 dvd per i successivi dvd tra 0e 400 per i successivi dvd tra 400 e000 Esempio: acquistando 420 dvd si pagherebbero.60*00+300*.30+20*0.30=556 euro. Per permettere a più consumatori di usufruire dell offerta, non è possibile acquistare più di 000 dvd. L obiettivo è portare a casa almeno 80 dvd minimizzando la spesa totale.
Esempio (naive): Acquisto dvd costo = 60. 30. 0. 30 per i primi00 dvd per i successivi dvd tra 0e 400 per i successivi dvd tra 400 e000. Definiamo le variabili decisionali associate agli intervalli: = il numero di dvd acquistati a.60 euro 0 00 2 = il numero di dvd acquistati a.30 euro 0 2 300 3 = il numero di dvd acquistati a 0.30 euro 0 3 600 2. Introduciamo le variabili logiche y e y2 tali che:! y = se =00 " # 0 altrimenti! y 2 = se 2 = 300 " # 0 altrimenti 3. Ed inseriamo i seguenti vincoli: 00y!!00 300y 2! 2! 300y 0! 3! 600y 2
Esempio (naive): Acquisto dvd Il modello matematico è: fo : min.60 +.30 2 + 0.30 3 = + 2 + 3 00y!!00 300y 2! 2! 300y 0! 3! 600y 2!000 " 80 i " 0, y i # {0,} E banale verificare che la soluzione ottima consiste nell acquistare esattamente i 80 dvd richiesti. Ciò implica che all ottimo =80, 2=3=0. ed il valore della funzione obiettivo è: 28 euro. Vedremo in seguito come una modifica su questo problema lo renda più interessante.
Un azienda di trasporto pubblico ha a disposizione un budget di 00.000 Euro per pubblicizzare una sua iniziativa attraverso televisione e carta stampata. Un annuncio sui giornali costa 000 Euro e si possono fare al massimo 30 annunci di questo tipo. Uno spot televisivo costa 0.000 Euro e si possono fare al più 5 spot in totale. Il numero di nuovi utenti che si possono raggiungere con i due media decresce con il numero di annunci secondo la seguente tabella: Tipo Pubblicità Fascia Nuovi contatti Giornali Televisione Esempio : Annunci pubblicitari -0-20 2-30 -5 6-0 -5 900 600 300 0.000 5.000 2.000 Per esempio, decidendo di fare 2 annunci sui giornali ed 8 spot televisivi si raggiungono 75.200 nuovi utenti (9.000+.200 giornali; 50.000+5.000 televisione), con una spesa complessiva di 2.000+80.000=92.000 Euro. Si vuole massimizzare il numero di contatti, rispettando il vincolo di budget complessivo.
= # annunci su giornale che garantiscono 900 contatti (0 0) 2 = # annunci su giornale che garantiscono 600 contatti (0 2 0) 3 = # annunci su giornale che garantiscono 300 contatti (0 3 0) w = # di spot che garantiscono 900 contatti (0 w 5) w 2 = # di spot garantiscono 600 contatti (0 w 2 5) w 3 = # di spot che garantiscono 300 contatti (0 w 3 5) E 4 variabili binarie: Esempio : Acquisto dvd Per prima cosa definisco due triple (ognuna associata ad una tipologia di annuncio) di variabili decisionali, 2, 3 e che rappresentano rispettivamente:! y i = se i =0 " # 0 altrimenti con i=,2;! u i = se w i = 5 " # 0 altrimenti
Esempio : Annunci pubblicitari ma900 + 600 2 +300 3 +0000w + 5000w 2 + 2000w 3 + 2 + 3! 30 w + w 2 + w 3!5 000( + 2 + 3 )+0000(w + w 2 + w 3 )!00000 0y!!0 0y 2! 2!0y 0! 3!0y 2 5u! w! 5 5u 2! w 2! 5u 0! w 3! 5u 2 i, w i, intere "i =, 2,3 y i, u i binarie "i =, 2
Esempio : Annunci pubblicitari param num_fasce; set FASCE:=..num_fasce; set NUM_VAR_LOGICHE:=..num_fasce-; set TIPO_PUB; param budget; param costi{tipo_pub}; param contatti{tipo_pub,fasce}; param limit{tipo_pub,fasce}; param ma_annunci{tipo_pub}; var {TIPO_PUB,FASCE} >=0,integer; var y{tipo_pub,num_var_logiche} binary; maimize contatti_tot: sum{i in TIPO_PUB, j in FASCE} contatti[i,j]*[i,j]; s.t. v_ma_annunci{i in TIPO_PUB}: sum{j in FASCE} [i,j] <=ma_annunci[i]; s.t. vincolo_budget: sum{i in TIPO_PUB,j in FASCE} costi[i]*[i,j] <=budget; s.t. maval_i_first {i in TIPO_PUB}: [i,]<=limit[i,]; s.t. maval_i_first2 {i in TIPO_PUB}: [i,]>=y[i,]*limit[i,]; (.dat) param num_fasce:=3; set TIPO_PUB:= giornali tv; param budget:=00000; param costi:= giornali 000 tv 0000; param contatti: 2 3:= giornali 900 600 300 tv 0000 5000 2000; param limit: 2 3:= giornali 0 20 30 tv 5 0 5; param ma_annunci:= giornali 30 tv 5; s.t. maval_i_middle {i in TIPO_PUB,j in FASCE:j>}: [i,j]<=y[i,j-]*(limit[i,j]-limit[i,j-]); s.t. maval_i_middle2 {i in TIPO_PUB,j in FASCE:j> &&j<card(fasce)}: [i,j]>=y[i,j]*(limit[i,j]-limit[i,j-]);
Esempio : Annunci pubblicitari IBM ILOG License Manager: "IBM ILOG Optimization Suite for Academic Initiative" is accessing CPLEX 2 with option(s): "e m b q ". CPLEX 2.2.0.0: timing= Times (seconds): Input = 0.0045 Solve = 0.00795 Output = 0.000492 CPLEX 2.2.0.0: optimal integer solution; objective 80000 MIP simple iterations 0 branch-and-bound nodes solve_result = solved [*,*] : 2 3 := giornali 0 0 0 tv 5 3 0; y [*,*] : 2 := giornali tv 0;
Modellazione delle funzioni lineari a tratti con ampl (.dat) param num_fasce; set FASCE:=..num_fasce; set NUM_VAR_LOGICHE:=..num_fasce-; set TIPO_PUB; param budget; param costi{tipo_pub}; param contatti{tipo_pub,fasce}; param limit{tipo_pub,fasce}; param ma_annunci{tipo_pub}; var {TIPO_PUB} >=0,integer; maimize contatti_tot: sum{i in TIPO_PUB} <<{j in FASCE:j<card(FASCE)} limit[i,j]; {j in FASCE} contatti[i,j]>> [i]; s.t. v_ma_annunci{i in TIPO_PUB}: [i] <=ma_annunci[i]; s.t. vincolo_budget: sum{i in TIPO_PUB} costi[i]*[i] <=budget; param num_fasce:=3; set TIPO_PUB:= giornali tv; param budget:=00000; param costi:= giornali 000 tv 0000; param contatti: 2 3:= giornali 900 600 300 tv 0000 5000 2000; param limit: 2 3:= giornali 0 20 30 tv 5 0 5; param ma_annunci:= giornali 30 tv 5;
Funzioni lineari a tratti concave e convesse Ma è sempre necessario introdurre le variabili logiche per gestire le funzioni lineari a tratti? c 3 c 3 c 2 c 2 c 0 c 0 No, infatti queste variabili non sono necessarie qualora la funzione sia convessa (figura a sinistra) ed il problema è di minimo oppure quando la funzione è concava (figura a destra) ed il problema è di massimo. Affinchè f sia convessa (concava) devono essere verificate due condizioni: Ø f deve essere continua, ossia c i+ a i+ = c i a i+ per i =,...,n dove a i+ è l estremo destro dell intervallo i-esimo (sinistro dell intervallo i+-esimo); Ø la derivata di f, nei tratti lineari, deve essere non decrescente (non crescente), ossia c i+ c i (c i+ c i ) per i=,...,n.
Funzioni lineari a tratti concave e convesse In base a quanto appena visto, per quale dei due esempi (acquisto dvd e annunci pubblicitari) è possibile modificare il modello matematico eliminando le variabili logiche? min.60 +.30 2 + 0.30 3 ma900 + 600 2 +300 3 +0000w + 5000w 2 + 2000w 3 = + 2 + 3 00y!!00 300y 2! 2! 300y 0! 3! 600y 2!000 "20 i " 0, y i # {0,} NO! + 2 + 3! 30 w + w 2 + w 3!5 000( + 2 + 3 )+0000(w + w 2 + w 3 )!00000 0y!!0 0y 2! 2!0y 0! 3!0y 2 5u! w! 5 5u 2! w 2! 5u 0! w 3! 5u 2 SI! i, w i, intere "i =, 2,3 y i, u i binarie "i =, 2
Esempio : Annunci pubblicitari (no var logiche) Con le variabili logiche y ma900 + 600 2 +300 3 +0000w + 5000w 2 + 2000w 3 Senza le variabili logiche y ma900 + 600 2 +300 3 +0000w + 5000w 2 + 2000w 3 + 2 + 3! 30 w + w 2 + w 3!5 000( + 2 + 3 )+0000(w + w 2 + w 3 )!00000 0y!!0 0y 2! 2!0y 0! 3!0y 2 5u! w! 5 5u 2! w 2! 5u 0! w 3! 5u 2 i, w i, intere "i =, 2,3 y i, u i binarie "i =, 2 + 2 + 3! 30 w + w 2 + w 3!5 000( + 2 + 3 )+0000(w + w 2 + w 3 )!00000 0!!0 0! 2!0 0! 3!0 0! w! 5 0! w 2! 5 0! w 3! 5 i, w i intere "i =, 2,3 Scrivere in ampl questo modello matematico e verificare che la soluzione ottima non cambia pur avendo eliminato le y.
Funzioni lineari a tratti: variante Il signor Rossi ha bisogno di acquistare 80 DVD e, a tal fine, si reca in un centro commerciale dove c è un eccezionale offerta proprio sull acquisto di DVD. L offerta consiste nell applicare un prezzo differente a seconda del numero di dvd acquistato in accordo alle seguenti fasce: costo = 60. 30. 0. 30 se se se 0 00 0 40 400 000 Esempio: acquistare 50 dvd costa 80 euro mentre acquistarne 0 costa 3.3 euro. Per permettere a più consumatori di usufruire dell offerta, non è possibile acquistare più di 000 dvd. L obiettivo è portare a casa almeno 20 dvd minimizzando la spesa totale.
Per prima cosa definisco tre variabili decisionali, 2 e 3 con : 0 00 0 2 400 40 3 000 E tre variabili binarie: Esempio : Acquisto dvd y i = se i > 0 0 altrimenti Ovviamente, solo una delle tre variabili decisionali può assumere un valore diverso da zero e quindi possiamo scrivere che il numero totale di dvd acquistati è pari a + 2 + 3. La funzione obiettivo del problema diventa c +c 2 2 +c 3 3, ossia: min.60 +.30 2 +0.30 3
Esempio : Acquisto dvd E riscrivo questi vincoli: In questo modo: 0 0 40 00 2 3 400 000 0 0y 2 40y 3 00y 2 3 400y 2 000 y 3 con y + y2 + y3 =
Esempio : Acquisto dvd 0 0y 40y y + 2 3 y 00y 2 + 2 3 y 3 400y 000 y = 2 3 Consideriamo le possibili combinazioni di valori di y, y 2 e y 3 : y =, y 2 =0, y 3 =0 0 00, 2 = 3 =0 0 00 y =0, y 2 =, y 3 =0 0 2 400, = 3 =0 0 400 y =0, y 2 =0, y 3 = 40 3 000, = 2 =0 40 000
Esempio : Acquisto dvd min.60 +.302 + 0.303 s. t. + = + 2 3 + 2 + 3 0 0y 2 40y y 3 00y 2 3 + y2 + y3 = 80 400y 2 000 y 3 Qual è la soluzione ottima?
Visualizzare modello caricato in ampl # Visualizza la funzione obiettivo epand {j in.._nobjs} _obj[j]; # Visualizza i vincoli del problema epand {i in.._ncons} _con[i]; maimize contatti_tot: 900*['giornali',] + 600*['giornali',2] + 300*['giornali',3] + 0000*['tv',] + 5000*['tv',2] + 2000*['tv',3]; subject to v_ma_annunci['giornali']: ['giornali',] + ['giornali',2] + ['giornali',3] <= 30; subject to v_ma_annunci['tv']: ['tv',] + ['tv',2] + ['tv',3] <= 5; subject to vincolo_budget: 000*['giornali',] + 000*['giornali',2] + 000*['giornali',3] + 0000*['tv',] + 0000*['tv',2] + 0000*['tv',3] <= e+05; subject to maval_i_first['giornali']: ['giornali',] <= 0; subject to maval_i_first['tv']: ['tv',] <= 5; subject to maval_i_first2['giornali']: ['giornali',] - 0*y['giornali',] >= 0; subject to maval_i_first2['tv']: ['tv',] - 5*y['tv',] >= 0;....