• Non ci sono risultati.

5.4 Ottimizzazione delle operazioni di stoccaggio e di prelievo

5.4.2 Il modello

Il modello si propone di combinare i cicli di stoccaggio e di prelievo all’in-terno di un singolo blocco, in modo tale da minimizzare l’energia o il tempo necessario globalmente per eseguire i relativi cicli doppi.

Il modello è stato concepito per la risoluzione del problema di sequen-ziamento nella sua forma più generale e complessa, ovvero con LTPR > 1; di conseguenza si devono non solamente accoppiare stoccaggi e prelievi in cicli doppi, ma anche selezionare le migliori locazioni dove immagazzina-re/prelevare i prodotti.

Si è assunto che lo stesso prodotto non possa avere una richiesta di stoc-caggio e di prelievo nello stesso blocco; quando questo si verifica, entrambe le richieste vengono rimosse dalla lista delle transazioni, poiché, in situazioni

5.4. Ottimizzazione delle operazioni di stoccaggio e di prelievo 79

Tabella 5.1. Variabili del modello

Nome della variabile Descrizione

store_loc[i] ∀i ∈ [1..n] Locazione di stoccaggio per il ciclo dual command i

retr_loc[i] ∀i ∈ [1..n] Locazione di prelievo per il ciclo dual command i

store_item[i] ∀i ∈ [1..n] Prodotto da stoccare nel ciclo dual command i

retr_item[i] ∀i ∈ [1..n] Prodotto da prelevare nel ciclo dual command i

energy[i] ∀i ∈ [1..n] Energia per svolgere il ciclo dual command i

time[i] ∀i ∈ [1..n] Tempo per svolgere il ciclo dual command i

reali un carico verrebbe immediatamente prelevato dal convogliatore e non inserito a scaffalatura.

Le variabili considerate nel modello sono riportate nella tabella 5.1, per una data dimensione del blocco n; le variabili decisionali sono i prodotti da stoccare e prelevare che devono essere accoppiati in ogni ciclo doppio i e le locazioni di stoccaggio/prelievo che dovono essere servite; il tempo e l’energia associata a un dato ciclo doppio rappresentano, invece, le variabili ausiliarie del modello.

I dati in ingresso sono riportati nella tabella 5.2.

Tabella 5.2. Dati di input per il modello: n rappresenta il numero di ciclo dual command all’interno di un blocco, P è il numero della classe del prodotto, L è la capacità di stoccaggio della scaffalatura

Input Descrizione

store_list[i] ∀i ∈ [1..n] Codice prodotto richiesto i nella lista di stoccaggio retr_list[i] ∀i ∈ [1..n] Codice prodotto richiesto i nella lista di prelievo class[k] ∀k ∈ [1..P ] Classe assegnata al prodotto k dalla politica di stocaggio class_assign[j] ∀j ∈ [1..L] Classe assegnata alla locazione j dalla politica di stocaggio inventory[j] ∀j ∈ [1..L] Stato locazione: 0 se j è vuota, codice prodotto se occupata Energy[i, j] ∀i, j ∈ [1..L] i 6= j Energia per il ciclo dual command da i a j

Time[i, j] ∀i, j ∈ [1..L] i 6= j Tempo di viaggio del ciclo dual command da i a j

La funzione obiettivo è rappresentata in eq. 5.1, dove il parametro binario bin permette all’utente di specificare la prestazione da minimizzare: bin deve essere posto a 1 se si vuole ottimizzare il consumo di energia del blocco, a 0 se si vuole, invece, ridurne il tempo complessivo dei cicli.

minimize bin · n X i=1 energy[i] + (1 − bin) · n X i=1 time[i] (5.1)

I vincoli sono rappresentati in eq. 5.2-5.10 e le variabili sono in grassetto.

retr_item[i] = retr_list[i] ∀i ∈ [1..n] (5.2)

80 Capitolo 5. Politiche di sequencing

class[store_item[i]] = class_assign[store_loc[i]] ∀i ∈ [1..n] (5.4)

inventory[store_loc[i]] = 0 ∀i ∈ [1..n] (5.5)

inventory[retr_loc[i]] = retr_item[i] ∀i ∈ [1..n] (5.6)

energy[i] = Energy[store_loc[i], retr_loc[i]] ∀i ∈ [1..n] (5.7)

time[i] = Time[store_loc[i], retr_loc[i]] ∀i ∈ [1..n] (5.8)

store_loc[i] 6= store_loc[j] ∀i, j ∈ [1..n] i 6= j (5.9)

retr_loc[i] 6= retr_loc[j] ∀i, j ∈ [1..n] i 6= j (5.10) Per evitare simmetrie nelle soluzioni, si è fissato un ordine alla lista di prelievo, in modo tale che il prodotto prelevato nel ciclo doppio i corrisponda al prodotto nell’i-esima posizione della lista di prelievi (si veda eq. 5.2); il prodotto da stoccare nello stesso ciclo, invece, verrà selezionato dal risolutore tra le richieste di stoccaggio della lista (vedi eq. 5.3). Si è scelto di fissare i prelievi e “rilassare” gli stoccaggi per aumentare la velocità risolutiva; nel-la lista di stoccaggi, infatti, è facile trovare più prodotti dello stesso tipo essendo essi ordinati a lotti, mentre nella lista di prelievi la variabilità dei prodotti è solitamente maggiore; nel caso questa condizione non sia verifi-cata, tuttavia, è possibile fissare la lista di stoccaggio e rendendo variabile la lista di prelievi semplicemente invertendo le variabili nelle eq. 5.2 e 5.3. Va ricordato, comunque, che l’ordine di esecuzione dei cicli doppi ottenuto dal modello è virtuale e tutti i cicli dual command di ciascun blocco pos-sono essere eseguiti in qualunque ordine, essendo la prestazione complessiva di blocco a venire ottimizzata: essa è dunque indipendente dalla sequenza con cui i cicli stabiliti vengono effettivamente realizzati, poiché le condizioni di input su cui opera il modello si intendono immutate fino alla completa esecuzione dell’intero blocco. Accade spesso nella realtà che i prodotti da stoccare giungano alla stazione di input attraverso un nastro trasportatore e dunque la loro sequenza sia fissata; in questo caso è sufficiente riordinare i cicli proposti dal modello secondo l’ordine di collocazione delle u.d.c. nel nastro.

Il vincolo in eq. 5.4 limita il dominio alle possibili locazioni di ciascun prodotto, a seconda della politica di stoccaggio: con la politica di allocazione

5.4. Ottimizzazione delle operazioni di stoccaggio e di prelievo 81

EBFT ogni codice da gestire a magazzino potrà essere collocato esclusiva-mente nella zona ad esso dedicata, mentre con la politica dinamica BEOL, invece, tutti gli elementi appartenenti ad una determinata classe class po-tranno essere stoccati in qualunque locazione vuota dell’intera zona associata alla classe.

L’eq. 5.5 limita la scelta delle locazioni di stoccaggio alle sole locazioni vuote a magazzino; l’eq. 5.6, invece, collega la scelta della locazione di pre-lievo alle locazioni effettivamente occupate dal prodotto richiesto. I vincoli in eq. 5.7 e 5.8 assegnano ad ogni coppia di stoccaggio e prelievo i valori di tempo e di consumo energetico del ciclo dual command, calcolati in base ai modelli proposti nel cap. 2. Per applicare il modello, in particolare, è neces-sario calcolare i tempi e i consumi energetici del trasloelevatore per spostarsi a vuoto da una locazione all’altra all’interno della scaffalatura (tempo ed energia di interleaving ); si devono poter associare, inoltre, a ciascuna loca-zione i valori di tempo e di energia per le movimentazioni one-way con carico a bordo dall’I/O alla locazione e dalla locazione all’I/O, per poter completare il calcolo delle prestazioni di ciclo doppio. A tal fine, si è sviluppato un pro-gramma in linguaggio C basato sul modello proposto nel cap. 2; per sfruttare, inoltre, le capacità combinatorie della programmazione con vincoli e ridurre i tempi di calcolo data la complessità del problema, sono stati pre-elaborati i valori di tempo ed energia per le diverse scaffalature da analizzare, in modo da ottenere L(L − 1) vettori multidimensionali Time e Energy, contenenti i tempi ed i valori di energia per tutte le possibili combinazioni di stoccaggio e prelievo all’interno della scaffalatura. Questi vettori vengono poi passati come parametri di input al modello di sequenziamento (eq. 5.7 e 5.8).

Infine, le eq. 5.9 e 5.10 garantiscono la selezione di locazioni di stoccaggio e prelievo tutte differenti per blocco, in modo che i cicli doppi individuati possano essere eventualmente riordinati come desiderato per la loro effettiva realizzazione.

5.4.3 Risoluzione del problema con Constraint