Last Mile -toimitus useista Python-varastoista

Matemaattinen mallinnus, ratkaisu ja visualisointi käyttämällä PuLP:tä ja VeRoViziä

Kuva Marcin Jozwiak on Unsplash

Verkkokaupan nopean kasvun myötä yritykset kohtaavat jatkuvasti kasvavia vaatimuksia nopeasta ja edullisesta toimituksesta. Viimeisen mailin toimitus viittaa toimitusketjun viimeiseen vaiheeseen, jossa paketit toimitetaan varastosta asiakkaan ovelle. Tämä on monimutkainen taktinen ongelma, jossa päätetään yhdessä, kuinka paketit jaetaan kuorma-autoille ja miten kuorma-autot reititetään asiakkaille. Se on myös erittäin kallis ongelma viimeisimmät arviot asettaa viimeisen mailin toimituksen 53 %:iin toimituskuluista. Tämä korostaa tarvetta luoda tehokkaita toimitussuunnitelmia.

Tämän ongelman klassisessa muodossa on yksi varikko (yleensä varasto), josta kaikki kuorma-autot lastataan ja lähetetään toimituksiinsa. Monimutkaisempi versio sisältää useita toimipisteitä lähellä toisiaan – esimerkiksi kun vähittäiskauppaketjut toimittavat kaupoista. Tässä tapauksessa tiettyä asiakasta voi palvella useampi kuin yksi toimipiste, joten yrityksen on myös määritettävä, mitkä toimipisteet toimittavat mille asiakkaille. Joskus yhdelläkään toimipaikalla ei ole saatavilla kaikkia asiakkaan tilauksen tuotteita, jolloin tilaus on jaettava useiden varastojen kesken.

Alla keskustelemme kuinka mallintaa ja ratkaista tämä monimutkaisempi monitoimipisteongelmalomake käyttämällä kokonaislukuohjelmointi (IP). Tällä ongelmalla on seuraavat näkökohdat:

  1. On joukko kuorma-autoja, varastoja, asiakkaita ja tuotteita.
  2. Jokainen asiakas on tilannut tietyn määrän kutakin tuotetta, ja jokaisessa varastossa on tietty määrä kutakin tuotetta saatavilla.
  3. Jokainen kuorma-auto sijaitsee täsmälleen yhdellä varikolla (eli sen reitti alkaa ja päättyy aina sen tukikohtaan). Lisäksi kuorma-autojen ei tarvitse olla identtisiä – jokaisella trukilla voi olla erilainen tilavuuskapasiteetti ja kilometrihinta.

Tavoitteena on samanaikaisesti määrittää 1) kullekin toimipisteelle kullekin asiakkaalle lähetettävät tuotteet, 2) pakettien jakaminen kuorma-autoille ja 3) kuinka jokainen kuorma-auto reititetään asiakkailleen siten, että kokonaissumma on pienin. toimituskulut mahdollinen.

Toteutamme ja ratkaisemme IP-mallin PuLP Ja käyttää VeRoViz visualisoida kuorma-autojen reitit. Aluksi tuomme tarvittavat kirjastot:

Esimerkki skenaario

Huonekaluyrityksellä on kaksi toimipistettä Fredericksburgissa, VA:n alueella, ja toimitettavana on kahdeksan asiakastilausta. Tiedot ja kartta näkyvät alla. Huomautus: - nodesArray muuttuja valmistettiin kanssa VeRoViz Sketch Tool, joka mahdollistaa sijaintitietojen graafisen luomisen ja viennin Pythoniin.

Skenaariokartta: Siniset merkit osoittavat varastoja ja oranssit merkit osoittavat asiakkaita.

Ongelman mallinnus

Vaikka tätä ongelmaa voidaan lähestyä useilla tavoilla, rakennamme ja ratkaisemme kokonaislukuohjelmointimallin. Tämä antaa tarkan matemaattisen määrittelyn ongelmasta ja mahdollistaa kohtuullisen kokoisten ongelmantapahtumien optimaalisen ratkaisemisen käyttämällä valmiita ratkaisijoita (vaikka laajempia ilmentymiä ei useinkaan voida ratkaista nopeasti valmiilla ratkaisimilla ja vaativat erityistä -suunnitellut ratkaisualgoritmit). Aloitamme mallin syötteillä:

Seuraavaksi määrittelemme päätösmuuttujamme:

Lopuksi määrittelemme optimointimallin:

Tässä mallissa tavoitefunktio (1), jonka haluamme minimoida, on yksinkertaisesti kaikkien aiheutuneiden matkakustannusten summa. Kohdan (2) rajoitukset varmistavat, että jokaisessa paikassa, jos tietty kuorma-auto saapuu paikkaan, myös trukki lähtee. Kohdan (3) rajoitukset varmistavat, että yksikään kuorma-auto ei lähde varastosta, joka ei ole sen tukikohta. Kohdan (4) rajoitukset varmistavat, että jokainen asiakas saa kaikki tilaamansa tuotteet. Kohdan (5) rajoitukset varmistavat, että alipiirejä ei tapahdu millään reitillä. Koska piirin muodostavalla paikkaryhmällä on sama määrä reunoja kuin solmuissa, estämme tämän esiintymisen jokaisessa mahdollisessa ei-tyhjässä asiakasryhmässä jokaisessa kuorma-autossa. Kohdan (6) rajoitukset varmistavat, että kunkin varaston ja tuotteen osalta kuorma-autoihin ladatun ja kyseisestä varastosta asiakkaille lähetetyn tuotteen kokonaismäärä ei ylitä varaston saatavuutta. Kohdan (7) rajoitukset varmistavat, että mitään tuotteen yksikköä ei lastata kuorma-autoon ja lähetetä asiakkaalle, ellei trukki käy asiakkaan luona. Kohdassa (8) olevat rajoitukset varmistavat, että kunkin kuorma-auton kuorma-autoon ladattujen tuotteiden kokonaismäärä ei ylitä sen kapasiteettia. Lopuksi rajoitukset kohdassa (9–10) määrittelevät toimialueet päätösmuuttujille (binääri x muuttujat; ei-negatiivinen kokonaisluku u muuttujat).

Helppokäyttöisyyden ja uudelleenkäytettävyyden vuoksi luomme Python-funktion, joka rakentaa tämän mallin esiintymiä tietyille syöttötiedoille käyttämällä PuLP:

Esimerkkiskenaarion ongelman ratkaiseminen

Nyt kun malli on muotoiltu, voimme käyttää sitä löytääksemme optimaalisen ratkaisun skenaarioimme. Alla käytämme mukana toimitettua CBC-ratkaisijaa PuLP. Optimaalisen ratkaisun löytäminen voi kestää 15–45 sekuntia. Jos sinulla on pääsy tehokkaampiin CPLEX Ratkaisija, voit käyttää sen sijaan kommentoituja rivejä saadaksesi ratkaisun paljon nopeammin.

Tämän suorittaminen antaa meille seuraavan tulostusviestin:

Kuorma-autojen reittien purkaminen ja tarkasteleminen

Nyt meidän täytyy poimia kuorma-autojen reittisuunnitelmat ratkaisumuuttujista ratkaistussa mallissa. Haluamme tietää jokaisen kuorma-auton pysäkit ja mitkä tuotteet kullekin pysäkille toimitetaan. Saadaksemme nämä tiedot, meidän on seulottava nollasta poikkeavat päätösmuuttujat.

Tämä muodostaa seuraavat kuorma-autoreitit:

Huomaa, että asiakkaalla C1 vierailee kaksi kuorma-autoa (T2 ja T4) – näin ollen jaettu tilaus. Ottaen huomioon asiakkaiden samanaikaiset vaatimukset ja käytettävissä olevat resurssit, tämä osoittautuu optimaaliseksi päätökseksi. Tämä voi olla tarpeen myös esimerkiksi silloin, kun tilaus sisältää joukon nimikkeitä, joita ei löydy yhdestäkään varastosta.

Kuorma-autojen reittien visualisointi

Viimeisenä vaiheena käytämme VeRoViz luodaksesi mukavan visualisoinnin rekkareiteille:

Yhteenveto

Vaikka monet muunnelmat tästä ongelmasta ovat mahdollisia, tämä esimerkki havainnollistaa, kuinka voimme mallintaa ja ratkaista tällaisen ongelman kokonaislukuohjelmointia käyttämällä. Se osoittaa myös, kuinka Pythonilla voidaan liimata yhteen tehokkaita komponentteja, kuten PuLP ja VeRoViz luoda nopeasti hyödyllisiä päätöksenteon tukijärjestelmiä. Hyvää toimitusta!

Lähdekoodia voi tarkastella muistikirjassa tätä tai ladattu tätä.

Last Mile Delivery From Use Depot Pythonissa Julkaistu uudelleen lähteestä https://towardsdatascience.com/last-mile-delivery-from-multiple-depots-in-python-26c4325407b4?source=rss—-7f60cf5620c9—4 kohti datatascience.com/feed

<!-

->

Aikaleima:

Lisää aiheesta Blockchain-konsultit