Pengiriman Mile Terakhir Dari Beberapa Depot dengan Python

Pemodelan Matematika, Solusi, dan Visualisasi Menggunakan PuLP dan VeRoViz

Foto oleh Marcin Jozwiak on Unsplash

Dengan pesatnya pertumbuhan belanja online, perusahaan menghadapi tuntutan yang terus meningkat untuk pengiriman yang cepat dan berbiaya rendah. Pengiriman mil terakhir mengacu pada tahap akhir rantai pasokan, di mana paket dikirimkan dari depot ke depan pintu pelanggan. Ini adalah masalah taktis kompleks yang melibatkan penentuan bersama bagaimana menugaskan paket ke truk dan bagaimana mengarahkan truk ke pelanggan. Ini juga masalah yang sangat mahal, dengan perkiraan baru-baru ini menempatkan pengiriman last mile sebesar 53% dari total biaya pengiriman. Ini menggarisbawahi kebutuhan untuk menghasilkan rencana pengiriman yang efisien.

Bentuk klasik dari masalah ini melibatkan satu depot (biasanya gudang) dari mana semua truk dimuat dan dikirim keluar untuk pengirimannya. Versi yang lebih kompleks melibatkan beberapa depot yang berdekatan satu sama lain โ€” misalnya, saat rantai ritel mengirim dari lokasi toko. Dalam hal ini, pelanggan tertentu dapat dilayani oleh lebih dari satu depot, sehingga perusahaan juga harus menentukan depot mana yang akan dikirimkan ke pelanggan yang mana. Kadang-kadang tidak ada satu depot yang memiliki semua item dalam pesanan pelanggan yang tersedia, sehingga pesanan harus dibagi di antara beberapa depot.

Di bawah ini kita akan membahas bagaimana memodelkan dan menyelesaikan bentuk masalah multi-depot yang lebih kompleks ini menggunakan pemrograman bilangan bulat (AKU P). Masalah ini memiliki aspek-aspek berikut:

  1. Ada satu set truk, depot, pelanggan, dan produk.
  2. Setiap pelanggan telah memesan jumlah tertentu dari setiap produk, dan setiap depot memiliki jumlah tertentu dari setiap produk yang tersedia.
  3. Setiap truk bermarkas tepat di satu depot (artinya rutenya selalu dimulai dan berakhir di pangkalannya). Selain itu, truk tidak harus identik โ€” setiap truk mungkin memiliki kapasitas volume dan biaya per mil yang berbeda.

Tujuannya adalah untuk secara bersamaan menentukan 1) produk yang akan dikirim dari setiap depot ke setiap pelanggan, 2) cara menugaskan paket ke truk, dan 3) cara mengarahkan setiap truk ke pelanggannya, semuanya dengan cara yang mencapai total terendah biaya pengiriman mungkin.

Kami akan menerapkan dan menyelesaikan model IP dengan Bubur Dan gunakan VeRoViz untuk memvisualisasikan rute truk. Untuk memulai, kami mengimpor pustaka yang diperlukan:

Contoh Skenario

Sebuah perusahaan furnitur memiliki dua depot di area Fredericksburg, VA dengan delapan pesanan pelanggan yang akan dikirimkan. Data dan peta ditunjukkan di bawah ini. Catatan: Grafik nodeArray variabel disiapkan dengan Alat Sketsa VeRoViz, yang memungkinkan pembuatan grafis dari data lokasi dan ekspor ke Python.

Peta Skenario: Penanda biru menunjukkan depot dan penanda oranye menunjukkan pelanggan.

Pemodelan Masalah

Meskipun ada beberapa cara untuk mendekati masalah ini, kami akan membangun dan menyelesaikan model pemrograman bilangan bulat. Ini memberikan spesifikasi matematis yang tepat dari masalah dan memungkinkan contoh masalah berukuran sedang untuk diselesaikan secara optimal menggunakan pemecah siap pakai (walaupun di luar jangkauan kami, contoh yang lebih besar sering tidak dapat diselesaikan dengan cepat dengan pemecah siap pakai dan membutuhkan khusus -algoritma solusi yang dirancang). Kita mulai dengan input model:

Selanjutnya, kami mendefinisikan variabel keputusan kami:

Terakhir, kami mendefinisikan model pengoptimalan:

Dalam model ini, fungsi tujuan (1) yang ingin diminimalkan hanyalah jumlah dari semua biaya perjalanan yang dikeluarkan. Batasan dalam (2) memastikan bahwa untuk setiap lokasi, jika sebuah truk tertentu tiba di lokasi tersebut, maka truk tersebut juga berangkat. Kendala dalam (3) memastikan bahwa tidak ada truk yang berangkat dari depot yang bukan basisnya. Kendala dalam (4) memastikan bahwa setiap pelanggan mendapatkan semua produk yang mereka pesan. Kendala dalam (5) memastikan tidak ada sub-sirkuit yang terjadi di rute mana pun. Karena sekelompok lokasi yang membentuk sirkuit akan memiliki jumlah tepi yang sama dengan node, kami mencegah hal ini terjadi di setiap kemungkinan subkumpulan pelanggan yang tidak kosong untuk setiap truk. Batasan dalam (6) memastikan bahwa untuk setiap depot dan produk, total unit produk yang dimuat ke dalam truk dan dikirim ke pelanggan dari depot tersebut tidak melebihi ketersediaan di depot. Batasan dalam (7) memastikan bahwa tidak ada unit produk apa pun yang dimuat ke dalam truk dan dikirim ke pelanggan kecuali jika truk tersebut mengunjungi pelanggan. Batasan dalam (8) memastikan bahwa untuk setiap truk, total volume produk yang dimuat di atas kapal tidak melebihi kapasitasnya. Akhirnya, kendala dalam (9-10) menentukan domain untuk variabel keputusan (biner untuk x variabel; bilangan bulat non-negatif untuk u variabel).

Untuk kemudahan dan penggunaan kembali, kami akan membuat fungsi Python untuk membuat instance model ini untuk penggunaan data input tertentu Bubur:

Memecahkan Masalah Contoh Skenario

Sekarang kita telah merumuskan modelnya, kita dapat menggunakannya untuk menemukan solusi optimal untuk skenario kita. Di bawah ini kami menggunakan pemecah CBC yang disertakan dengan Bubur. Ini mungkin memakan waktu 15โ€“45 detik untuk menemukan solusi optimal. Jika Anda memiliki akses ke yang lebih kuat CPLEX solver, Anda dapat menggunakan baris yang dikomentari untuk mendapatkan solusi lebih cepat.

Menjalankan ini memberi kita pesan keluaran berikut:

Mengekstrak dan Melihat Rencana Perjalanan Truk

Sekarang kita perlu mengekstrak rencana perjalanan truk dari variabel keputusan dalam model yang diselesaikan. Untuk setiap truk, kami ingin mengetahui perhentiannya dan produk mana yang akan dikirimkan di setiap perhentian. Untuk mendapatkan informasi ini, kita perlu menyaring variabel keputusan bukan nol.

Ini membangun rencana perjalanan truk berikut:

Perhatikan bahwa pelanggan C1 dikunjungi oleh dua truk (T2 dan T4) โ€” karenanya, pesanan terpisah. Mengingat permintaan pelanggan dan sumber daya yang tersedia secara simultan, ini ternyata merupakan keputusan yang optimal. Ini mungkin juga diperlukan ketika, misalnya, pesanan berisi sekumpulan barang yang tidak ditemukan di satu depot.

Memvisualisasikan Rute Truk

Sebagai langkah terakhir kami, kami menggunakan VeRoViz untuk membuat visualisasi yang bagus untuk rute truk:

Kesimpulan

Meskipun banyak variasi pada masalah ini yang mungkin, contoh ini mengilustrasikan bagaimana kita dapat memodelkan dan menyelesaikan masalah seperti itu dengan menggunakan pemrograman bilangan bulat. Ini juga menunjukkan bagaimana Python dapat digunakan untuk merekatkan komponen yang kuat seperti Bubur dan VeRoViz untuk membuat sistem pendukung keputusan yang berguna dengan cepat. Selamat mengantarkan!

Kode sumber dapat dilihat di notebook di sini atau diunduh di sini.

Pengiriman Mil Terakhir Dari Beberapa Depot dengan Python Dipublikasikan ulang dari Sumber https://towardsdatascience.com/last-mile-delivery-from-multiple-depots-in-python-26c4325407b4?source=rssโ€”-7f60cf5620c9โ€”4 via https:// menujudatascience.com/feed

<!โ€“

->

Stempel Waktu:

Lebih dari Konsultan Blockchain