Costruzione Di Un Algoritmo Genetico Per Lo Scheduling Del Ciclo Di Prelievo

  • 1,238 views
Uploaded on

 

More in: Technology , Business
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,238
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Costruzione di un Algoritmo Genetico per lo scheduling del ciclo di prelievo Al fine di gestire i cicli di prelievo con molti codici articolo si è scelto di implementare un algoritmo genetico come strumento per la ricerca di una sequenza ottimale. Il lavoro svolto si articola nelle seguenti fasi: Codifica semplificata delle locazioni di picking Costruzione della matrice delle distanze tra punti di prelievo Costruzione del vettore delle distanze tra punti di prelievo e punto IO Costruzione dell’algoritmo Costruzione dell’interfaccia grafica Nel seguito vengono spiegati in dettaglio i passi sopra individuati e viene analizzato lo svolgimento in Matlab. Codifica semplificata delle locazioni di picking Il centro di stoccaggio rivolto al picking consta di 4 scaffalature di 3 livelli poste l’una in fronte all’altra lungo il lato lungo. Ogni livello consta di 80 postazioni di picking disposte su due file. Ogni fila è accessibile da un corridoio che separa due scaffalature. Il numero totale di corridoi è pari a 5 (e. g. 3 corridoi tra le scaffalature e 2 esterni). Ogni postazione di picking è associata ad un numero identificativo che varia da 1 a 960. Il punto IO è situato ad uno dei vertici esterni di una delle scaffalature esterne. Si assume che la postazione appartenente allo scaffale estremo più vicino al punto IO, che ne è posta al vertice esterno più vicino al punto IO e che appartiene al primo livello ha codice identificativo 1. Continuando la numerazione, la postazione attigua sulla stessa fila ha codice identificativo pari a 2 e la quarantesima pari a 40. Viceversa il codice 41 appartiene alla postazione attigua a quella con codice 1 ma che non appartiene alla stessa fila e il codice 80 appartiene alla postazione attigua a quella con codice 40 ma che non appartiene alla stessa fila. Estendendo la numerazione agli altri scaffali si ha che la postazione del primo livello più lontana dal punto IO ha codice 320, ed estendendo la numerazione ai livelli, la stessa postazione all’ultimo livello ha codice 960.
  • 2. Per semplificare la codifica ai fini di una trattazione meno complessa ma non meno approssimativa ai fini dello scheduling si è scelto di comprimere la dimensione altezza e si è scelto di identificare due postazioni che si affacciano l’una in fronte all’altra sullo stesso corridoio con lo stesso codice. In tal modo si perviene ad una codifica con un numero di codici pari a 200 disposti su 5 sequenze da 40 unità ciascuna. Chiamiamo queste unità col termine celle per distinguerle dalle postazioni reali. Abbiamo quindi due codifiche per le postazioni di prelievo che possiamo denominare come codifica a locazioni (introdotta precedentemente) e codifica a celle. Le cinque sequenze di celle adiacenti risultano tra loro equidistanti se le tre interne si considerano localizzate lungo l’asse del corridoio che separa due scaffali e le due esterne lungo l’asse del corridoio esterno (e. g. se si considera questo di pari dimensioni di quelli interni). Le celle adiacenti all’interno della stessa sequenza risultano anch’esse equidistanti e pari al valore ay. La codifica a celle segue la stessa logica della codifica a locazioni per cui l’unità più vicina al punto IO assume codice 1 mentre la più distante ha codice 200. In Fig. 1 è riportata una schematizzazione grafica delle postazioni di magazzino, la relazione tra codifica a locazioni e codifica a celle e delle distanze sopradescritte tra celle e file adiacenti. FILA 2 FILA 1 COD.LOCAZIONE {(41, 81), (361, 401), (681, 721)} SEQ 1 SEQ 2 COD.CELLA 41 Fig. 1. Rappresentazione magazzino e postazioni di prelievo con codifica semplificata.
  • 3. Viene inseguito presentato lo script implementato in Matlab per poter passare dalla codifica principale (a locazioni) a quella semplificata (a celle) dato un vettore p di locazioni di picking. function [pt] = trasformazionecodici(p, M, MM) MM è una matrice tridimensionale (dim. nfileXnpostazioniXnlivelli) che identifica le postazioni di picking nella codifica a locazioni in cui le tre dimensioni identificano il numero di fila, il livello e la posizione delle postazioni. Gli elementi della matrice rappresentano i codici locazione dati alle postazioni di picking. M è una matrice bidimensionale (dim. nfileXnpostazioni) che identifica le postazioni di picking nella codifica a celle. Le due dimensioni identificano il numero di fila e la posizione delle postazioni. La terza dimensione rappresentante il livello non è contemplata per le motivazioni espresse in precedenza. Gli elementi della matrice rappresentano i codici celle dati alle postazioni di picking. p è un vettore di lunghezza l i cui elementi rappresentano delle locazioni di magazzino secondo la codifica dettata da MM. pt è il vettore trasformato dei codici di locazione nella codifica a celle. Le due matrici sono salvate col nome disposiz_mag.mat. Costruzione della matrice delle distanze tra punti celle Per la costruzione dei percorsi che separano due celle è possibile fare riferimento alla disposizione delle celle nel magazzino. Ogni cella è caratterizzata da due coordinate X e Y che ne individuano al posizione all’interno del magazzino. La coordinata X è riferita alla sequenza a cui appartiene la cella mentre Y è riferita alla posizione della cella lungo la sequenza. Per esempio la cella 1 ha coordinate (1,1), mentre la cella 200 ha coordinate (5,40). Il percorso per raggiungere due celle situate lungo la stessa sequenza è dato semplicemente dalla differenza dei valori della coordinata Y delle due celle per la costante ay. Il percorso per raggiungere due celle poste in sequenze diverse è di due tipologie in relazione al verso di percorrenza dei corridoi ospitanti le postazioni di prelievo cui le celle si riferiscono. Si ha Return: dalla cella di partenza si torna indietro verso il corridoio principale, lo si percorre fino a raggiungere il corridoio che ospita la cella che si vuole raggiungere e si percorre tale corridoio fino al punto d’arrivo. Dr(i,j) = Y(i)*ay + Y(j)*ay + abs(X(i)-X(j))*ax;
  • 4. Traversal: dalla cella di partenza si percorre il corridoio fino a raggiungere il corridoio principale posto sul retro della struttura di stoccaggio, lo si percorre fino al corridoio ospitante la cella che si desidera raggiungere e lo si percorre fino al punto d’arrivo. Dt(i,j) = (ncelle + 1 - Y(i))*ay + (ncelle + 1 - Y(j))*ay + abs(X(i)-X(j))*ax La distanza tra due posizioni di prelievo poste in corridoi diversi sarà posta uguale alla minima distanza che si ha seguendo le due strategie di percorrenza dei corridoi. Nel seguito viene descritto lo script implementato per il calcolo della matrice delle distanze. function [D, DDI, X, Y] = matricedist(ax, ay, ncorr, ncelle) ax: costante indicante la distanza tra gli assi di due corridoi adiacenti. ay: costante indicante la distanza tra i baricentri di due celle adiacenti lungo la stessa sequenza. ncorr: numero di corridoi (e. g. di sequenze). ncelle: numero di celle per ogni corridoio. D: matrice simmetrica dim( ncorrXncelle) delle distanze tra le celle. DDI: matrice simmetrica delle stesse dimensioni di D a valori in {R, T, A, I, S} indicante il tipo di percorso tra celle. R: percorso Return tra le celle. T: percorso Traversal tra le celle. A: percorso in Avanti seguendo la numerazione delle celle nel corridoio. I: percorso in Indietro seguendo la numerazione delle celle nel corridoio in modo regressivo. S: presente lungo la diagonale principale. Questa distanza potrebbe essere richiesta quando è richiesta la distanza tra la cella e se stessa che ovviamente è uguale a zero. Questa eventualità si ha quando devono essere prelevati articoli che sono presenti a diversi livelli dell’impianto di stoccaggio o l’uno in fronte all’altro (ad ognuno dei tre possibili livelli). Visto che tali codici sono inclusi all’interno di un unico codice semplificato è possibile che nella lista di prelievo semplificata il codice semplificato appaia più volte (questo non deve comunque preoccupare poiché il codice principale è sempre rintracciabile attraverso la posizione all’interno della lista originaria data quella semplificata). Questo inoltre ha l’implicazione che durante il processo di ricerca della soluzione tali celle verranno visitate verosimilmente in successione come a logica ci si aspetterebbe di fare. Questa semplificazione non ha quindi implicazioni significative sulla calcolo della soluzione.
  • 5. Costruzione del vettore delle distanze tra punti di prelievo e punto IO Per il calcolo della soluzione bisogna considerare la distanza intercorrente fra le celle e il punto di IO. Tale distanza dipende dalla posizione della cella all’interno del centro di stoccaggio e dalla posizione del punto IO. Esso è posto a lato struttura in prossimità della cella 1. La distanza tra una qualsiasi cella e il punto IO sarà pari alla distanza tra la cella e il corridoio principale, più la distanza tra il corridoio ospitante la cella e il corridoio 1, più la distanza tra quest’ultimo ed il punto IO. function [DIO] = distanzaIO(ax, ay, aa, ncorr, ncelle) % ax = 2, ay = 0.6, ncelle = 40, ncorr = 5, aa = 3. aa: distanza tra punto IO e corridoio principale in fronte a cella 1. DIO: vettore i cui elementi rappresentano le distanze tra il punto IO ed ogni cella. Costruzione dell’algoritmo Data una lista di prelievo nella codifica a celle l’algoritmo implementato col nome picking_genetico permette la risoluzione del problema di scheduling fin qui descritto. Dalla lista di prelievo è possibile generare una popolazione iniziale di sequenze di prelievo eseguendo delle permutazioni su questa. È possibile definire la numerosità della popolazione come parametro di input dello script. Definita una popolazione ad ogni iterazione è valutata la funzione di fitness di ogni elemento della popolazione. Essa è pari all’inverso della distanza totale percorsa nel ciclo di prelievo dettato dall’elemento della popolazione. Una volta calcolata la fitness per ogni individuo viene calcolata la fitness relativa. Esse vengono ordinate in modo ascendente e sommate in modo progressivo in modo da avere una funzione cumulata di tipo Pareto. In questo modo è possibile estrarre un (o più nel caso di crossover) elemento della popolazione generando un numero random e ricercandolo all’interno della funzione cumulata prima trovata. Esso sarà verosimilmente l’individuo con fitness migliore. Sull’individuo, o individui, estratti si devono applicare uno dei tre operatori evolutivi quali la riproduzione, il crossover o la mutazione. La scelta dell’operatore da applicare è data attraverso la generazione di un numero random che si confronta con le probabilità (definite a priori) di applicazione degli operatori. La riproduzione consiste semplicemente nel ricopiare l’individuo scelto precedentemente nella nuova popolazione al posto dell’individuo attualmente peggiore.
  • 6. Il crossover si applica a due individui scambiando delle sottoparti delle due sequenze tra loro. Nel nostro caso viene scelto un gene e viene scambiato il suo valore con il gene scelto dell’altro individuo. In questo modo si generano due nuovi individui che presentano le caratteristiche dei due “genitori”. Tuttavia bisogna effettuare un’altra operazione sui due “figli” che elimini la ridondanza del valore del gene scambiato (e. g. sostituiamo al posto del valore ridondante il valore del gene precedentemente scambiato). Infine i due nuovi individui sono copiati nella nuova generazione al posto degli individui con valore di fitness peggiore. La mutazione si applica ad un solo elemento scambiando la posizione di due geni e ricopiando tale individuo mutato al posto dell’individuo con valore di fitness peggiore. Nel seguito viene descritto lo script implementato. function [seq, sol, PP, FFF, Iseq, Xseq, Yseq] = picking_genetico(pt, D, DIO, DDI, X, Y, MAXiter, pr, pm, pc, npool) pt: è la lista di prelievo con codifica a celle. MAXiter: numero di iterazioni. pr: probabilità di riproduzione. pc: individua la probabilità di crossover attraverso pc – pr. pm: individua la probabilità di mutazione attraverso 1- pc. npool: dimensioni popolazione. seq: soluzione dell’algoritmo nella codifica a celle. sol: valore del percorso associato alla sequenza-soluzione. PP: popolazione finale. FFF: vettore dei valori di fitness degli individui migliori ad ogni iterazione. Iseq: vettore indicante la tipologia di percorso tra una cella e la successiva all’interno della sequenza di prelievo dettata da seq. Xseq: restituisce la posizione di corridoio della cella. Yseq: restituisce il numero di postazione di prelievo all’interno del corridoio dato in Xseq.
  • 7. Per ottenere nuovamente la codifica a locazioni è possibile richiamale lo script trasfcodinver.m come descritto in seguito. function [pinv] = trasfcodiciinver(p, pt, seq) dato il vettore p della sequenza originale, il vettore pt della sequenza a codifica a celle e il vettore seq della sequenza soluzione dell’algoritmo, restituisce il vettore pinv della nuova sequenza, espressa secondo la codifica a locazioni. Nel seguito si presenta uno script che raccoglie tutte le funzioni viste precedentemente. function [S, Iseq, sol] = pickinggeneticoaggregato(p,M,MM,ax,ay,aa,ncorr, ncelle, MAXiter, pr, pm, pc, npool) S racchiude in un unica matrice pinv, Xseq e Yseq. Costruzione dell’interfaccia grafica L’interfaccia grafica è costruita attraverso il Toolbox di Matlab Guide. Essa consta di due file GPkI.m e GPkI.fig. il primo contiene la parte di codice mentre il secondo la parte grafica. Per lanciare la maschera basta digitare GPkI dal Command Window di Matlab posizionandosi all’interno della cartella genetico grafico. Essa richiama le funzioni trasformazionecodici., picking_genetico.m e trasfcodicinv.m viste in precedenza. Necessita, invece, delle matrice delle M, MM, D, DDI, DIO, X, Y che sono caricate nel Workspace al lancio di GPkI e sono salvate nei file .mat disposiz_mag, matricedist_out e distanzaIO_out. Quest’ultimo modo di operare segue dal voler mantenere separate le due fasi di definizione dei parametri dell’impianto e la gestione del ciclo di prelievo. All’interno della maschera troviamo i seguenti oggetti: Inserisci lista di prelievo: campo in cui inserire la lista di prelievo (codici postazioni con codifica a locazioni). Pannello grafici: è possibile visualizzare in tempo reale l’evoluzione della popolazione e della Fitness Function migliore cliccando sul comando Visualizzazione. In basso al pannello è riportata la distanza totale del percorso migliore ottenuto all’ultima iterazione.
  • 8. Pannelli di Risposta: i pannelli di risposta sono 3 e sono situati a lato destro della maschera. Il pannello Codice a celle restituisce la sequenza di Input secondo la codifica a celle ed il risultato del calcolo secondo la stessa codifica. Il pannello Posizione restituisce le posizioni di corridoio e di profondità lungo i corridoi di servizio. Il pannelo Output restituisce la sequenza con fitness migliore all’ultima iterazione e le rispettive indicazioni sul percorso. Pannello Parametri e Calcolo: in questo pannello si possono definire i parametri di calcolo quali la numerosità della popolazione, il numero di iterazioni e le probabilità dei tre operatori. In figura 2 è riportata un’immagine della maschera al completamento del calcolo. Fig. 2. Output di GPkI.