Picchi Tommaso, Corradini Simone Cutting stock problem, variable lenght BPP (bin packing problem) La ditta Arquati S.r.l. ci ha assegnato un problema sull ottimizzazione del taglio di profili su verghe di acciaio (barre) utilizzate nell assemblaggio di tende da sole; lo scopo dell algoritmo è di minimizzare lo scarto e quindi il relativo costo complessivo delle barre utilizzate. IL PROBLEMA: k=1,,k j=1,,jk l=1,,l i=1,..,il tipi di profili oggetto j- esimo di profilo k tipi di barre i- esima barra di tipo l Wk = lunghezza profilo di tipo K (ogni profilo j=1,,j è lungo Wk) Wl = lunghezza barra tipo l (ogni barra i=1,,il è lungo Wl) Cl = costo barra tipo l (ogni barra i=1,,il costa Cl) IL MODELLO: = 1 0 Se uso barra i di tipo l altrimenti X jkil = 1 0 Se taglio profilo j di tipo k dalla barra i di tipo l altrimenti
funzione obiettivo: L l =1 I l i=1 min C l Minimizza il costo delle barre, in funzione della variabile Y, che ci dice se una barra è presa oppure no. vincolo di assegnazione: L I l l =1 i=1 X jkil =1 Ogni profilo deve essere tagliato. vincolo di capacità: K J W k k k =1 j =1 X jkil W l La somma dei profili tagliati su una barra non può eccedere la lunghezza della barra stessa. vincolo di precedenza: Y (i+1)l Ordina i tagli delle barre in ordine crescente (prima barra 1 tipo 1, poi barra 2 tipo 1 ) dichiarazioni variabili binarie: { 0,1} i =1,..,I L X jkil { 0,1} l =1,..,L i =1,..,I L l =1,..,L k =1,..,K j =1,..,J K
LA MODELLAZIONE IN XPRESS. Le fasi di lavoro una volta determinato il modello sono state quelle di analizzare ed ottenere dati significativi per elaborare il nostro modello in xpress. La ditta Arquati ci ha fornito le misure dei profili da tagliare, su base mensile; inoltre ci ha fornito le misure delle barre che devono essere tagliate e i relativi costi (vedi file.dat). Questo lavoro è stato complicato dal fatto che le tende da sole sono composte da 2 braccia, ogni braccio è composto da due profili di spessore diverso, per questo nella nostra modellazione abbiamo dovuto tenere conto anche dello spessore. Per questo motivo abbiamo scelto di analizzare 165 profili di spessore 0 (60 mm) e 165 profili di spessore 1 (50 mm) ognuno dei quali dovrà essere tagliato da barre con spessore uguale a quello richiesto. L ampiezza di questi dati corrisponde al fabbisogno produttivo di due settimane della ditta. IL MODELLO: procedure Modello z:= sum (l in l_tipibarre,i in i_nbarre) (Costo(l)* y(i,l)+ Costo(l)* y1(i,l)) forall (j in j_oggetti,k in k_profili) v1(j,k):=sum(i in i_nbarre,l in l_tipibarre) x(j,k,i,l)=1 forall (j in j_oggetti,k in k_profili) v2(j,k):=sum(i in i_nbarre,l in l_tipibarre) x1(j,k,i,l)=1 forall (i in i_nbarre,l in l_tipibarre) v3(i,l):=sum(k in k_profili,j in j_oggetti)wk(k,j)*x(j,k,i,l)<=wl_spessore0(l,i)*y(i,l) forall (i in i_nbarre,l in l_tipibarre) v4(i,l):=sum(k in k_profili,j in j_oggetti) Wk1(k,j)*x1(j,k,i,l)<=Wl_spessore1(l,i)*y1(i,l) forall(l in l_tipibarre,i in i_nbarre i<3)do y(i,l)>=y(i+1,l) y1(i,l)>=y1(i+1,l) forall(i in i_nbarre,l in l_tipibarre) y(i,l) is_binary forall(f in i_nbarre,m in l_tipibarre) y1(f,m) is_binary forall(j in j_oggetti,k in k_profili, i in i_nbarre,l in l_tipibarre) x(j,k,i,l) is_binary forall(j in j_oggetti,k in k_profili, i in i_nbarre,l in l_tipibarre) x1(j,k,i,l) is_binary end- procedure
EURISTICO 1: NEXT-FIT procedure Next_Fit i:=1 forall(k in k_profili,j in j_oggetti)do if(wk(k,j)<=cres(i))then cres(i):=cres(i)- Wk(k,j) znf:=costo(i) else i:=i+1 cres(i):=cres(i)- Wk(k,j) costo(i):=znf+costo(i) i:=1 forall(k in k_profili,j in j_oggetti)do if(wk1(k,j)<=cres1(i))then cres1(i):=cres1(i)- Wk1(k,j) znf1:=costo1(i) else i:=i+1 cres1(i):=cres1(i)- Wk1(k,j) costo1(i):=znf1+costo1(i) EURISTICO 2: FIRST FIT zff:=0 s:=1 forall(k in k_profili,j in j_oggetti)do yff(k,j):=- 1 forall(i in n_contenitori)do if(wk(k,j)<=capres(i))then yff(k,j):=1 capres(i):=capres(i)- Wk(k,j) cff(i):=1 break
if(yff(k,j)=- 1)then s:=s+1 capres(s):=capres(s)- Wk(k,j) zff:=sum(i in n_contenitori)cff(i)*costi(i) zff1:=0 s:=1 forall(k in k_profili,j in j_oggetti)do yff1(k,j):=- 1 forall(i in n_contenitori)do if(wk1(k,j)<=capres1(i))then yff1(k,j):=1 capres1(i):=capres1(i)- Wk1(k,j) cff1(i):=1 break if(yff1(k,j)=- 1)then s:=s+1 capres1(s):=capres1(s)- Wk1(k,j) zff1:=sum(i in n_contenitori)cff1(i)*costi1(i) somma1:=zff+zff1 SOLUZIONI OTTENUTE: Una volta terminato la stesura del programma e avere determinato i dati necessari abbiamo compilato ed eseguito il programma. Abbiamo ricavato i dati sperati. Infatti, al tempo zero (0 secondi) gli euristici hanno dato due risultati diversi. Il Next- fit ha dato come costo totale 814, contro i 744 del Firs- fit, siccome il First- fit ottimizza ulteriormente la minimizzazione degli scarti. La soluzione migliore, 736, è ottenuta grazie alla risoluzione del modello a scapito della velocità di esecuzione, infatti, sono stati impiegati 307 secondi per ottenere questo risultato. Inoltre siamo riusciti anche a determinare da quale barra dobbiamo tagliare il singolo profilo. I grafici qui sotto riportano i profili da tagliare sulle varie barre, per quanto riguarda lo spessore 0, 60mm.
taglio profili spessore 0 (60 mm) da barre di 5 m 9 numero barre 7 5 3 1 0 1000 2000 3000 4000 5000 6000 lunghezza barre (mm) taglio profili spessore 0 (60mm) da barre di 6 m 13 11 numero barre 9 7 5 3 1 0 1000 2000 3000 4000 5000 6000 7000 lunghezza barre (mm)
taglio profili spessore 0 (60mm) da barre di 7 m 11 numero barre 9 7 5 3 1 0 1000 2000 3000 4000 5000 6000 7000 8000 lunghezza barre (mm)
CONCLUSIONI: Abbiamo verificato che con l euristico first- fit riusciamo ad ottenere un buon compromesso tra velocità di esecuzione e riduzione degli sprechi. Questo ci permette di abbassare il costo delle barre utilizzate(744 ), vicino alla soluzione ottenuta con il modello (736, con un gap del 2,9%,vedi immagine pagina precedente). Ora presenteremo alla ditta Arquati il nostro progetto, cercando di adattare il modello alle esigenze specifiche dell azienda.