Consegna dell'ultimo miglio da più depositi in Python

Modellazione matematica, soluzione e visualizzazione utilizzando PuLP e VeRoViz

Foto di Marcin Jozviak on Unsplash

Con la rapida crescita degli acquisti online, le aziende si trovano ad affrontare richieste sempre crescenti di consegne rapide e a basso costo. Consegna dell'ultimo miglio si riferisce alla fase finale della catena di fornitura, in cui i pacchi vengono consegnati da un deposito alla porta di casa del cliente. Si tratta di un problema tattico complesso che implica determinare congiuntamente come assegnare i pacchi ai camion e come instradare i camion verso i clienti. È anche un problema molto costoso, con stime recenti ponendo la consegna dell'ultimo miglio al 53% del costo di spedizione totale. Ciò sottolinea la necessità di generare piani di consegna efficienti.

La forma classica di questo problema prevede un unico deposito (di solito un magazzino) da cui tutti i camion vengono caricati e inviati per le consegne. Una versione più complessa prevede più depositi vicini tra loro, ad esempio quando le catene di vendita al dettaglio consegnano dai negozi. In questo caso, un dato cliente può essere servito da più di un deposito, quindi l'azienda deve anche determinare quali depositi spediranno a quali clienti. A volte nessun singolo deposito avrà a disposizione tutti gli articoli dell'ordine di un cliente, pertanto è necessario che l'ordine venga suddiviso tra più depositi.

Di seguito discuteremo come modellare e risolvere questo problema più complesso utilizzando il modulo multi-deposito programmazione intera (IP). Questo problema presenta i seguenti aspetti:

  1. C'è una serie di camion, depositi, clienti e prodotti.
  2. Ogni cliente ha ordinato una quantità specifica di ciascun prodotto e ogni deposito ha una determinata quantità di ciascun prodotto disponibile.
  3. Ogni camion fa base esattamente in un deposito (il che significa che il suo percorso inizia e finisce sempre alla sua base). Inoltre, non è necessario che i camion siano identici: ogni camion può avere una capacità di volume e un costo per miglio diversi.

L'obiettivo è determinare simultaneamente 1) i prodotti da spedire da ciascun deposito a ciascun cliente, 2) come assegnare i pacchi ai camion e 3) come instradare ciascun camion verso i propri clienti, il tutto in modo da ottenere il totale più basso costo di consegna possibile.

Implementeremo e risolveremo un modello IP con Polpa E l'uso VeroViz per visualizzare i percorsi dei camion. Per iniziare importiamo le librerie necessarie:

Uno scenario di esempio

Un'azienda di mobili ha due depositi nell'area di Fredericksburg, Virginia, con otto ordini di clienti da consegnare. Di seguito i dati e la mappa. Nota: Il nodesArray la variabile è stata preparata con il file Strumento di schizzo VeRoViz, che consente la creazione grafica di dati sulla posizione e l'esportazione in Python.

Mappa dello scenario: gli indicatori blu indicano i depositi e gli indicatori arancioni indicano i clienti.

Modellare il problema

Sebbene esistano diversi modi per affrontare questo problema, costruiremo e risolveremo un modello di programmazione intera. Ciò fornisce una precisa specifica matematica del problema e consente di risolvere in modo ottimale istanze di problemi di dimensioni moderate utilizzando solutori standard (anche se oltre il nostro ambito, istanze più grandi spesso non possono essere risolte rapidamente con solutori standard e richiedono soluzioni speciali). algoritmi di soluzione progettati). Iniziamo con gli input del modello:

Successivamente, definiamo le nostre variabili decisionali:

Infine definiamo il modello di ottimizzazione:

In questo modello, la funzione obiettivo (1) che vogliamo minimizzare è semplicemente la somma di tutti i costi di viaggio sostenuti. I vincoli in (2) assicurano che per ogni luogo, se un particolare camion arriva al luogo, allora anche il camion parte. I vincoli in (3) assicurano che nessun camion parta da un deposito che non sia la sua base. I vincoli in (4) garantiscono che ogni cliente riceva tutti i prodotti ordinati. I vincoli in (5) garantiscono che non si verifichino sottocircuiti in alcun percorso. Poiché un gruppo di luoghi che formano un circuito avrà lo stesso numero di archi dei nodi, evitiamo che ciò accada in ogni possibile sottoinsieme non vuoto di clienti per ciascun camion. I vincoli in (6) garantiscono che per ciascun deposito e prodotto, le unità totali del prodotto caricate sui camion e spedite ai clienti da quel deposito non superino la disponibilità presso il deposito. I vincoli in (7) garantiscono che nessuna unità di qualsiasi prodotto venga caricata su un camion e spedita a un cliente a meno che il camion non visiti il ​​cliente. I vincoli di cui al punto (8) garantiscono che per ciascun camion il volume totale dei prodotti caricati a bordo non superi la sua capacità. Infine, i vincoli in (9–10) specificano i domini per le variabili decisionali (binari per x variabili; intero non negativo per il u variabili).

Per facilità e riusabilità, creeremo una funzione Python per costruire istanze di questo modello per l'utilizzo di dati di input specifici Polpa:

Risoluzione del problema dello scenario di esempio

Ora che abbiamo formulato il modello, possiamo utilizzarlo per trovare una soluzione ottimale per il nostro scenario. Di seguito utilizziamo il risolutore CBC incluso Polpa. Potrebbero essere necessari 15–45 secondi per trovare una soluzione ottimale. Se hai accesso a quello più potente CPLEX risolutore, puoi invece utilizzare le righe commentate per ottenere una soluzione molto più velocemente.

L'esecuzione di questo ci restituisce il seguente messaggio di output:

Estrazione e visualizzazione degli itinerari dei camion

Ora dobbiamo estrarre gli itinerari dei camion dalle variabili decisionali nel modello risolto. Vogliamo conoscere le fermate di ogni camion e quali prodotti consegnare a ciascuna fermata. Per ottenere queste informazioni, dobbiamo vagliare le variabili decisionali diverse da zero.

In questo modo vengono costruiti i seguenti itinerari per camion:

Tieni presente che il cliente C1 viene visitato da due camion (T2 e T4), quindi un ordine frazionato. Date le richieste simultanee dei clienti e le risorse disponibili, questa risulta essere una decisione ottimale. Ciò può essere necessario anche quando, ad esempio, un ordine contiene una serie di articoli non presenti in nessun singolo deposito.

Visualizzazione dei percorsi dei camion

Come ultimo passaggio, utilizziamo VeroViz per creare una bella visualizzazione per i percorsi dei camion:

Conclusione

Sebbene siano possibili molte varianti a questo problema, questo esempio illustra come possiamo modellare e risolvere un problema del genere utilizzando la programmazione intera. Mostra anche come Python può essere utilizzato per unire componenti potenti come Polpa ed VeroViz per creare rapidamente utili sistemi di supporto alle decisioni. Buona consegna!

Il codice sorgente può essere visualizzato in un notebook qui o scaricato qui.

Consegna dell'ultimo miglio da più depositi in Python Ripubblicato dalla fonte https://towardsdatascience.com/last-mile-delivery-from-multiple-depots-in-python-26c4325407b4?source=rss—-7f60cf5620c9—4 tramite https:// versodatascience.com/feed

<!–

->

Timestamp:

Di più da Consulenti Blockchain