Sei sulla pagina 1di 3

Tesina di Applicazioni di Intelligenza Artificiale

Di Elisa Benetti
Scopo progetto:
Dati in ingresso un numero variabile di ordini di pezzi di stoffa, il compito del
programma dev’essere quello della gestione dei ritagli su rotoli di lunghezza
prefissata.
Spiegazione Programma:
Dopo la lettura degli ordini e la loro memorizzazione in una lista Lrich, viene
calcolata la lunghezza di questa lista e di conseguenza sono create varie liste di
questa stessa lunghezza (la lunghezza è la stessa sia nel caso si stiano trattando gli
ordini, sia nel caso si trattino i rotoli da tagliare in quanto , nel caso peggiore, si userà
al massimo 1 rotolo per ogni ordine):
Ordini: Per ogni ordine viene segnalato in quale rotolo verrà tagliato
Lung: Lunghezze dei vari ordini
OrdiniRotoli: Lista di liste. A tutti gli effetti è una ‘matrice’ in cui ogni elemento
può assumere valore 0 o 1. Se il valore i-esimo della j-esima listaè 1, allora l’ordine i-
esimo verrà tagliato dal rotolo j-esimo, altrimenti no.
LungRot: Stessa struttura di OrdiniRotoli ma ogni elemento che nella lista
precedente ha valore 1, avrà qui la corrispondente lunghezza dell’ordine.
Vengono poi inizializzate la lista con gli identificativi dei rotoli e quella delle
lunghezze con i giusti valori, definiti i domini ed infine i vincoli.
Minimizzazione in schedulingSfrido.ecl:
La minimizzazione viene fatta sulla somma degli sfridi, ovvero della stoffa
rimanente, da ciascun rotolo.
Per fare questo dapprima mi creo una lista RotScelti che conterrà per ogni rotolo un
1 o uno zero a seconda che il rotolo sia o meno utilizzato.
Questo è stato ottenuto scorrendo la lista di liste OrdiniRotoli e per ogni lista si mette
in rotScelti il suo valore massimo: ovvero se almeno 1 ordine sarà tagliato in quel
rotolo avremo un 1, altrimenti uno zero.
Si scorre infine la lista di liste LungRot e per ognuna si esegue la seguente
operazione: si somma la lista di lunghezze tagliate dal rotolo, la si detrae dalla
lunghezza totale del rotolo e tutto questo si moltiplica per l’elemento corrispondente
a quel rotolo nella lista RotScelti che quindi porterà il valore a zero se il rotolo non è
usato e al valore trovato se il rotlo è usato.
Avremo così la nostra lista ListaSfridi con, per ogni rotolo utilizzato, la quantità di
stoffa da esso avanzata.
Minimizzando la somma di questi valori avremo raggiunto il nostro obiettivo.
La quantità di operazioni da eseguire è notevole, visto inoltre che con questo metodo
viene eseguita per ogni rotolo anche se questo non è in effetti utilizzato.
All’aumentare del numero di ordini l’aumento delle permutazioni possibili dei valori
nel labeling cresce con andamento esponenziale, se consideriamo che per ognuna di
queste possibilita si avranno lunghe tempistiche a causa dei calcoli sopra spiegati,
l’andamento esponenziale verrà maggiormente accentuato dando tempi
eccessivamente lunghi già a 7-8 ordini.
Minimizzazione in schedulingMinimizeRot.ecl:
Ho quindi ragionato sul fatto che la minimizzazione dello sfrido totale è equivalente
alla minimizzazione del numero di rotoli utilizzati, a meno delle informazioni sulla
stoffa rimanente, che nel secondo caso non verranno espresse.
E’stato quindi eseguito semplicemente un minimize sulla somma dei valori della lista
RotScelti, diminuendo notevolmente le tempistiche di esecuzione.
I valori scelti nei due casi risultano effettivamente gli stessi:

Ma l’inizio della crescita esponenziale nel caso degli sfridi si nota gia in un numero
di ordini minore rispetto al caso della minimizzazione dei rotoli:
E come il grafico della crescita delle tempistiche degli sfridi sia molto piu ‘ripido’
rispetto all’altro caso si nota visualizzando un maggiore numero di esempi:

Potrebbero piacerti anche