Halaman ini menjelaskan siklus proses rencana rute menggunakan Route Optimization API, mulai dari mengidentifikasi kebutuhan perutean Anda hingga menyelesaikan rencana rute terintegrasi dalam sistem Anda.
Saat mengikuti tahapan rencana rute, Anda dapat mencapai tujuan berikut:
- Memetakan operasi armada: Terjemahkan armada fisik, batasan kompleks, dan tujuan bisnis Anda ke dalam kode untuk API.
- Mengoptimalkan rencana rute untuk bisnis Anda: Pahami cara menyempurnakan rencana rute agar dapat memenuhi sasaran dan meningkatkan operasi harian Anda.
- Deploy ke produksi: Terapkan rencana rute Anda dengan menyertakannya dalam operasi sehari-hari Anda.
Diagram berikut menunjukkan masa aktif rencana rute.
Fase penerapan rencana rute terjadi saat Anda pertama kali mengintegrasikan API atau saat persyaratan bisnis Anda berubah secara signifikan. Panduan ini mencakup tahap 1 hingga 5.
Fase operasi harian lebih ringan, dan penyempurnaan minimal. Panduan ini mencakup tahap 2 hingga 4.
Tahapan siklus proses rute adalah sebagai berikut:
- Tentukan cakupan masalah Anda: Identifikasi dan atur tujuan, resource, tugas, dan batasan Anda untuk mendapatkan gambaran lengkap tentang operasi Anda sebelum Anda mulai menggunakan API.
- Memetakan data Anda: Terjemahkan realitas bisnis Anda ke dalam parameter API sehingga rencana rute mencerminkan cara Anda ingin armada beroperasi.
- Buat permintaan dan dapatkan rencana rute: Masukkan data Anda ke API dan dapatkan rencana rute yang dioptimalkan.
- Sempurnakan rencana rute Anda: Uji rencana rute Anda dan lakukan iterasi dengan menyesuaikan batasan dan tujuan untuk memastikan rencana rute tersebut mencakup semua kebutuhan Anda.
- Integrasikan rencana rute: Hubungkan rencana rute ke sistem yang ada untuk memberikan navigasi yang dapat ditindaklanjuti.
Menentukan cakupan masalah Anda
Sebelum menggunakan API, Anda perlu mengatur detail operasi sehari-hari ke dalam kategori data yang jelas. Dengan begitu, Anda dapat memulai proses penerapan dengan memahami secara jelas sumber daya dan tugas saat ini, batasan yang mempengaruhinya, dan tujuan yang ingin Anda capai dengan armada Anda.
Mengidentifikasi resource dan tugas Anda
Langkah penting saat merencanakan rencana rute adalah mengidentifikasi sumber daya dan tugas Anda, yaitu kendaraan dan pengiriman.
| Kendaraan | Pengiriman |
|---|---|
|
|
Identifikasi batasan Anda
Batasan Anda adalah batas dan pembatasan tentang cara Anda dapat menggunakan kendaraan dan cara Anda harus menangani pengiriman. Data ini menentukan sebagian besar operasi Anda dan sangat penting saat membuat rencana rute yang dioptimalkan.
Batasan umumnya dikelompokkan ke dalam dua kategori:
| Batasan berat | Batasan ringan |
|---|---|
| Ini adalah batas yang tidak dapat dilanggar. Misalnya, truk tidak dapat membawa beban yang melebihi kapasitas maksimumnya, dan pengemudi tidak dapat melakukan pengambilan setelah toko tutup. | Ini adalah preferensi yang dapat dilanggar jika perlu, biasanya dengan biaya penalti. Misalnya, Anda mungkin lebih memilih memuat truk hanya hingga 80% kapasitas, atau melakukan pengiriman sebelum waktu target, tetapi Anda tidak keberatan melampaui batas ini untuk mendapatkan rute yang lebih baik. |
Batasan umum meliputi:
- Batas kapasitas: Berat, volume, atau jumlah item maksimum yang dapat dibawa kendaraan.
- Periode waktu: Slot waktu tertentu saat lokasi buka untuk dikunjungi, atau jam kerja tertentu pengemudi.
- Biaya: Biaya menjalankan kendaraan atau melewati pengiriman. Salah satu tujuan utama API ini adalah membuat rencana rute yang hemat biaya.
- Istirahat pengemudi: Periode istirahat pengemudi yang biasanya diwajibkan oleh hukum ketenagakerjaan setelah jumlah jam kerja tertentu.
Menetapkan tujuan bisnis Anda
Setelah Anda menetapkan resource dan tugas serta batasannya, saatnya menetapkan metrik yang paling penting bagi bisnis Anda. Tujuan ini sejalan dengan batasan, dan membantu Anda memutuskan hal yang paling penting saat merencanakan rute.
Berikut beberapa contoh tujuan bisnis:
| Ukuran armada | Jarak | Waktu | Biaya |
|---|---|---|---|
| Apakah Anda ingin meminimalkan jumlah kendaraan yang digunakan, atau menggunakan seluruh armada untuk menyelesaikan hari kerja lebih awal? | Apakah Anda ingin jalur terpendek untuk menghemat bahan bakar, atau Anda lebih memilih rute yang lebih cepat yang mungkin lebih panjang karena penggunaan jalan tol? | Apakah Anda ingin meminimalkan total jam kerja, atau memprioritaskan tiba pada waktu tertentu yang dapat memperpanjang waktu yang dihabiskan di rute? | Apakah Anda ingin meminimalkan biaya operasional seperti upah dan bahan bakar, atau menerima biaya yang lebih tinggi untuk memenuhi tenggat waktu yang ketat? |
Memetakan data Anda
Setelah mengumpulkan data, petakan data tersebut agar sesuai dengan properti API. Hal ini memberi pengoptimal semua informasi untuk menampilkan rencana rute yang mempertimbangkan kondisi bisnis Anda.
Gunakan parameter dalam tabel berikutnya untuk memetakan resource, tugas, batasan, dan tujuan yang Anda petakan di bagian Tentukan cakupan masalah Anda.
Pemetaan variabel
| Konsep dunia nyata | Parameter API | Deskripsi |
|---|---|---|
| Pengemudi atau kendaraan | model.vehicles[] |
Mewakili satu kendaraan dalam armada Anda. |
| Lokasi depot |
vehicles[].startWaypointvehicles[].endWaypoint
|
Lokasi tempat kendaraan memulai dan mengakhiri rutenya. |
| Jam buka Anda |
model.globalStartTimemodel.globalEndTime
|
Waktu mulai paling awal dan waktu berakhir paling akhir untuk operasi seluruh armada. |
| Tugas atau paket | model.shipments[] |
Mewakili tugas. Dapat berupa pickup, delivery, atau keduanya. |
| Lokasi tugas |
pickups[].arrivalWaypointdeliveries[].arrivalWaypoint
|
Lokasi geografis tempat tugas dilakukan. |
| Waktu layanan |
pickups[].durationdeliveries[].duration
|
Waktu yang dihabiskan di lokasi untuk menyelesaikan tugas (misalnya, menurunkan muatan), tidak termasuk waktu perjalanan. |
Pemetaan batasan
| Batasan dunia nyata | Parameter API | Deskripsi |
|---|---|---|
| Kapasitas kendaraan | vehicles[].loadLimits |
Menetapkan batas ketat atau fleksibel untuk kapasitas kendaraan. Jika loadDemand pengiriman melebihi batas yang tersisa, pengiriman tidak akan ditetapkan. |
| Ukuran paket | shipments[].loadDemands |
Jumlah kapasitas kendaraan yang digunakan pengiriman. |
| Pembatasan kendaraan | shipments[].allowedVehicleIndices |
Membatasi pengiriman sehingga hanya dapat diambil atau dikirim oleh kendaraan atau pengemudi tertentu. |
| Jam buka | shipments[].pickups[].timeWindows atau shipments[].deliveries[].timeWindows |
Menetapkan jam yang tersedia untuk mengunjungi lokasi. Jika kendaraan tidak dapat tiba dalam jangka waktu ini, pengiriman akan dilewati. |
| Batas panjang shift | vehicles[].routeDurationLimit |
Menetapkan batas keras atau lunak pada durasi kerja pengemudi tertentu (misalnya, maksimal 8 jam), terlepas dari waktu berakhir global. |
| Istirahat pengemudi | vehicles[].breakRule |
Menerapkan aturan istirahat tertentu, seperti istirahat wajib setelah jam kerja tertentu. |
| Pembatasan jalan | vehicles[].travelMode |
Menentukan mode perjalanan (misalnya, DRIVE atau BICYCLE). Hal ini membatasi rute ke jalan yang sah dan menentukan kecepatan yang digunakan untuk menghitung waktu perjalanan. |
Pemetaan tujuan
| Tujuan dunia nyata | Parameter API | Deskripsi |
|---|---|---|
| Meminimalkan ukuran armada | vehicles[].fixedCost |
Menerapkan biaya satu kali untuk penggunaan kendaraan. Biaya tetap yang tinggi memaksa rute untuk memprioritaskan penggunaan lebih sedikit kendaraan daripada meningkatkan total jarak atau waktu kerja. |
| Meminimalkan jarak | vehicles[].costPerKilometer |
Menerapkan biaya untuk setiap kilometer yang ditempuh. Memprioritaskan rute yang lebih pendek untuk menghemat bahan bakar dan keausan. |
| Meminimalkan total waktu | vehicles[].costPerHour |
Menerapkan biaya untuk setiap jam kendaraan aktif (termasuk waktu perjalanan dan waktu tunggu). Memprioritaskan penyelesaian yang lebih cepat. |
| Meminimalkan waktu mengemudi | vehicles[].costPerTraveledHour |
Menerapkan biaya khusus untuk waktu yang dihabiskan untuk pindah. Hal ini membedakan antara duduk di tengah kemacetan (mahal) dan menunggu di halte(berpotensi lebih murah). |
| Memprioritaskan tugas tertentu | shipments[].penaltyCost |
Menerapkan biaya jika pengiriman tertentu dilewati. Menetapkan nilai ini ke tinggi memastikan tugas penting diprioritaskan daripada tugas opsional. |
Buat permintaan dan dapatkan respons
Penggunaan Route Optimization API untuk membuat rencana rute melibatkan langkah-langkah berikut:
- Konfigurasi lingkungan Anda: Siapkan project Google Cloud Anda, aktifkan API, dan konfigurasi autentikasi. Untuk mengetahui petunjuknya, lihat Memulai. Anda hanya perlu mengikuti langkah ini satu kali.
- Kirim permintaan: Buat isi permintaan menggunakan pemetaan data yang ditentukan di bagian sebelumnya. Untuk mengetahui informasi tentang endpoint, header, dan pemformatan permintaan, lihat Membuat permintaan API.
- Pahami respons: Setelah mendapatkan respons dari API, pahami rencana rute dan arti setiap parameter. Lihat Menafsirkan respons.
Menyempurnakan rencana rute
Menerjemahkan logistik dunia nyata menjadi biaya dan batasan API adalah tugas yang kompleks. Rencana rute awal Anda mungkin tidak sesuai dengan tujuan bisnis atau ekspektasi pengemudi. Memperbaiki rencana rute adalah proses iteratif untuk menguji rute yang ditampilkan dan menyesuaikan parameter hingga Anda menemukan penyiapan yang mencapai tujuan Anda.
Menyesuaikan tujuan dan batasan
Jika rencana rute yang dibuat tidak sesuai dengan kebutuhan Anda, Anda dapat mengubah parameter tertentu untuk mendapatkan hasil yang berbeda. Memperketat atau melonggarkan parameter mengubah cara tujuan yang bertentangan diselesaikan dalam rencana rute, dan melonggarkan parameter adalah cara yang efisien untuk menemukan parameter yang menyebabkan kesalahan dalam rencana rute Anda.
Tabel berikut mencantumkan masalah perutean umum dan parameter yang dapat Anda sesuaikan untuk menyelesaikannya.
| Skenario | Parameter | Penyesuaian | Deskripsi |
|---|---|---|---|
| Pengiriman penting dilewati | shipments[].penaltyCost |
Meningkatkan nilainya, atau menambahkan biaya penalti ke pengiriman lain | Jika pengiriman bersifat opsional, tingkatkan biaya penaltinya untuk memprioritaskannya. Jika pengiriman bersifat wajib (tidak memiliki biaya penalti), tambahkan biaya penalti ke pengiriman lainnya yang kurang penting. Hal ini membuat pengiriman tersebut bersifat opsional, sehingga waktu dan kapasitas kendaraan dapat digunakan untuk pengiriman yang penting. |
| Pengiriman dilewati karena waktu | softStartTime / softEndTime |
Menambahkan periode waktu fleksibel | Periode waktu yang ketat akan membatalkan tugas yang terlambat satu menit. Jendela fleksibel memungkinkan pengemudi tiba sedikit di luar jadwal dengan membayar "biaya" daripada gagal menyelesaikan tugas. |
| Pengiriman dilewati karena berat | loadLimits[].softMaxLoad dan costPerUnitAbove |
Menambahkan permintaan pemuatan ringan | Memungkinkan kendaraan sedikit melebihi kapasitas idealnya (dengan penalti) daripada meninggalkan paket. |
| Pengiriman dilewati karena kelebihan beban armada | model.vehicles[] atau shipments[].timeWindows |
Menambahkan kendaraan atau periode waktu relaksasi | Jika ada terlalu banyak pengiriman untuk armada saat ini, terutama selama jam puncak, tambahkan lebih banyak kendaraan atau perluas periode pengiriman untuk mendistribusikan beban kerja. |
| Rute terlalu panjang atau tidak efisien | vehicles[].costPerKilometer / costPerHour |
Menambahkan biaya atau meningkatkan nilainya | Memberi tahu API bahwa perjalanan mahal, sehingga mendorongnya untuk menghilangkan perhentian yang jauh dan terpencil untuk membuat rute yang lebih ketat bagi armada. |
| Shift pengemudi terlalu panjang | vehicles[].routeDurationLimit atau model.vehicles[] |
Menambahkan batas durasi, atau menambahkan kendaraan dan batas | Menerapkan batas ketat (misalnya, 8 jam) pada total waktu yang dihabiskan pengemudi di jalan. Menambahkan kendaraan saja tidak akan memperpendek rute kecuali jika Anda juga menerapkan batas durasi untuk memaksa pemecah masalah mendistribusikan workload di seluruh armada yang lebih besar. |
Memperbarui rencana rute
Anda sering kali perlu memperbarui rencana rute sambil mempertahankan basis yang sama, seperti menambahkan penjemputan ke jadwal pengemudi yang aktif. Untuk melakukannya, gunakan parameter injeksi, yang memberikan API awal berdasarkan solusi sebelumnya, sehingga API dapat mengubah paket yang ada, bukan menghitung paket baru dari awal.
Berikut adalah berbagai cara untuk memperbarui rencana perjalanan dengan parameter injeksi:
- Teruskan rute dari respons sebelumnya ke kolom
injectedFirstSolutionRoutespermintaan baru Anda. Hal ini mempercepat penelusuran pengoptimalan dan berguna untuk merencanakan ulang sebelum operasi harian dimulai, seperti mengintegrasikan pengiriman mendadak. - Kontrol tingkat perubahan menggunakan kolom
injectedSolutionConstraint. Hal ini berguna saat operasi sudah berlangsung, sehingga Anda dapat mempertahankan urutan pengemudi saat ini atau memperbaiki bagian rencana yang telah dijalankan. - Pastikan rute yang diperbarui tetap ditetapkan ke kendaraan yang benar dengan
menetapkan
interpretInjectedSolutionsUsingLabelsketrue. Hal ini berguna dalam eksperimen saat menambahkan atau menghapus pengiriman dan kendaraan, karena mencocokkan rute menggunakan label, bukan indeks. Hal ini mengharuskan semua label kendaraan dan pengiriman bersifat unik.
Mengintegrasikan rencana rute Anda
Rencana rute akhir Anda adalah objek data yang merepresentasikan pengelolaan sumber daya dan tugas yang dioptimalkan, sekaligus mengikuti batasan dan tujuan Anda. Gunakan rencana rute ini dalam operasi harian Anda dengan mengintegrasikannya ke dalam sistem Anda. Hal ini biasanya melibatkan visualisasi rencana rute Anda untuk pengelola armada dan mengirimkan petunjuk belokan demi belokan kepada pengemudi.
Visualisasi
Untuk mengizinkan pengelola armada memverifikasi dan memantau rencana rute Anda, Anda dapat memvisualisasikan rencana rute dengan cara berikut:
Untuk mengizinkan pengelola armada memverifikasi dan memantau rencana rute Anda, Anda dapat menampilkannya di peta dasbor. Bergantung pada tahap pengembangan saat ini, Anda dapat memvisualisasikan rencana rute dengan cara berikut:
- Jelajahi tanpa kode: Anda dapat menggunakan aplikasi Pengoptimalan Rute open source untuk melihat cara API menerjemahkan data Anda menjadi jalur fisik di peta. Aplikasi web ini berfungsi sebagai alat eksplorasi yang memungkinkan Anda membuat skenario, menyesuaikan parameter batasan, dan merender rencana rute yang dihasilkan secara visual sebelum menulis kode apa pun.
- Menampilkan urutan kunjungan: Anda dapat menampilkan urutan kunjungan sebagai titik bernomor di peta untuk mengevaluasi rencana pengoptimalan dan pengiriman di sistem Anda sendiri. Untuk melakukannya, temukan array
visitsdi dalam setiap rute respons API. Item dalam array ini diurutkan persis seperti yang harus dilakukan pengemudi. Anda dapat melakukan iterasi pada daftar ini, menggunakanshipmentIndexuntuk mengambil koordinat lokasi setiap perhentian, dan menggunakan library pemetaan untuk merender penanda bernomor di peta berdasarkan urutannya dalam daftar. - Menggambar rute fisik: Anda dapat memvisualisasikan jalur yang direncanakan secara tepat di peta untuk memahami alasan pengoptimal memilih urutan tertentu. Polyline ini
merepresentasikan jalur yang dimaksudkan untuk perencanaan dan evaluasi, bukan rute
real-time yang diambil oleh pengemudi. Tetapkan
populatePolylines: truedalam permintaan Anda untuk mendapatkan kolomencodedPolylineuntuk setiap rute, dan dekode menggunakan metodegoogle.maps.geometry.encoding.decodePath()dari Maps JavaScript API.
Mengirim ke pengemudi
Anda dapat mengintegrasikan rute belokan demi belokan ke dalam aplikasi pengemudi menggunakan Navigation SDK, atau menyediakan deep link ke aplikasi pelanggan Google Maps.
- Navigation SDK: Jika memiliki aplikasi pengemudi kustom, Anda dapat mengintegrasikan
Navigation SDK for Android atau
iOS untuk panduan belokan demi belokan dalam aplikasi.
Anda dapat mengintegrasikan informasi tugas dari respons API ke dalam sistem
dan menggunakan SDK untuk navigasi. Untuk meneruskan rute dari respons API ke
SDK, tetapkan
populateTransitionPolylines: truedalam permintaan Anda. Tindakan ini menghasilkanrouteTokenuntuk setiap transisi dalam respons. - Fleet Engine: Untuk pengelolaan armada lanjutan, Anda dapat mengimpor rencana rute yang dihasilkan oleh API ke Fleet Engine untuk memantau pelaksanaan rute secara real time. Meskipun API menyediakan polyline jalur yang dimaksudkan untuk evaluasi, Fleet Engine menyandingkan urutan kunjungan yang direncanakan dengan pelacakan kendaraan live.