Halaman ini menjelaskan siklus proses rencana rute menggunakan Route Optimization API, mulai dari mengidentifikasi kebutuhan pemilihan rute hingga menyelesaikan rencana rute terintegrasi dalam sistem Anda.
Saat mengikuti tahapan rencana rute, Anda dapat mencapai tujuan berikut:
- Petakan operasi armada Anda: Terjemahkan armada fisik, batasan kompleks, dan sasaran 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.
Diagram berikut menunjukkan siklus proses rencana rute.
Fase implementasi 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 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 tersebut mencakup semua kebutuhan Anda.
- Mengintegrasikan 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 kejelasan tentang resource 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 |
|---|---|
|
|
Mengidentifikasi batasan Anda
Batasan Anda adalah batas dan batasan tentang cara menggunakan kendaraan dan cara menangani pengiriman. Batasan ini menentukan sebagian besar operasi Anda dan sangat penting saat membuat rencana rute yang dioptimalkan.
Batasan umumnya dikelompokkan dalam dua kategori:
| Batasan ketat | Batasan ringan |
|---|---|
| Ini adalah batas yang tidak dapat dilanggar. Misalnya, truk tidak dapat mengangkut muatan yang melebihi kapasitas maksimumnya, dan pengemudi tidak dapat melakukan pengambilan setelah toko tutup. | Ini adalah preferensi yang dapat dilanggar jika diperlukan, biasanya dengan biaya penalti. Misalnya, Anda mungkin lebih suka memuat truk hanya hingga kapasitas 80%, atau mengirimkan sebelum waktu target, tetapi Anda tidak keberatan melampaui batas ini untuk mendapatkan rute yang lebih baik. |
Batasan umum mencakup:
- Batas kapasitas: Berat, volume, atau jumlah item maksimum yang dapat diangkut oleh kendaraan.
- Periode waktu: Slot waktu tertentu saat lokasi buka untuk kunjungan, atau jam shift tertentu dari 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 tenaga kerja setelah jumlah jam kerja tertentu.
Menetapkan tujuan bisnis Anda
Setelah Anda menetapkan resource dan tugas serta batasannya, inilah 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 adalah 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 menginginkan jalur terpendek untuk menghemat bahan bakar, atau lebih memilih rute yang lebih cepat, tetapi mungkin lebih panjang karena menggunakan jalan raya? | Apakah Anda ingin meminimalkan total jam kerja, atau memprioritaskan kedatangan pada waktu tertentu yang dapat memperpanjang waktu yang dihabiskan dalam 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 memperhitungkan realitas 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 depo |
vehicles[].startWaypointvehicles[].endWaypoint
|
Lokasi tempat kendaraan memulai dan mengakhiri rutenya. |
| Jam buka bisnis Anda |
model.globalStartTimemodel.globalEndTime
|
Waktu mulai paling awal dan waktu berakhir paling akhir untuk seluruh operasi 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 longgar untuk kapasitas kendaraan. Jika loadDemand pengiriman melebihi batas yang tersisa, pengiriman tersebut 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 periode ini, pengiriman akan dilewati. |
| Batas durasi giliran kerja | vehicles[].routeDurationLimit |
Menetapkan batas ketat atau longgar untuk 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 di 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 mengurangi 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 bergerak. Hal ini membedakan antara terjebak macet (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. |
Membuat permintaan dan mendapatkan respons
Penggunaan Route Optimization API untuk membuat rencana rute melibatkan langkah-langkah berikut:
- Konfigurasikan lingkungan Anda: Siapkan project Google Cloud, aktifkan API, dan konfigurasikan 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 ke dalam biaya dan batasan API adalah tugas yang kompleks. Rencana rute awal Anda mungkin tidak sesuai dengan tujuan bisnis atau ekspektasi pengemudi. Menyempurnakan rencana rute adalah proses iteratif untuk menguji rute yang ditampilkan dan menyesuaikan parameter hingga Anda menemukan penyiapan yang mencapai sasaran Anda.
Menyesuaikan tujuan dan batasan
Jika rencana rute yang dihasilkan tidak memenuhi kebutuhan, Anda dapat mengubah parameter tertentu untuk mendapatkan hasil yang berbeda. Memperketat atau melonggarkan parameter akan mengubah cara sasaran yang bertentangan diselesaikan dalam rencana rute, dan melonggarkan parameter adalah cara yang efisien untuk menemukan parameter yang menyebabkan error dalam rencana rute Anda.
Tabel berikut mencantumkan masalah perutean umum dan parameter yang dapat Anda sesuaikan untuk mengatasinya.
| Skenario | Parameter | Penyesuaian | Deskripsi |
|---|---|---|---|
| Pengiriman penting dilewati | shipments[].penaltyCost |
Tingkatkan nilainya, atau tambahkan biaya penalti ke pengiriman lain | Jika pengiriman bersifat opsional, tingkatkan biaya penalti untuk memprioritaskannya. Jika pengiriman bersifat wajib (tidak memiliki biaya penalti), tambahkan biaya penalti ke pengiriman lain yang kurang penting. Hal ini membuat pengiriman tersebut bersifat opsional, sehingga waktu dan kapasitas kendaraan dapat digunakan untuk pengiriman penting. |
| Pengiriman dilewati karena waktu | softStartTime / softEndTime |
Menambahkan periode waktu fleksibel | Periode waktu yang ketat akan membatalkan tugas yang terlambat satu menit. Jendela waktu fleksibel memungkinkan pengemudi tiba sedikit di luar jadwal dengan membayar "biaya" daripada gagal dalam penugasan. |
| Pengiriman dilewati karena berat | loadLimits[].softMaxLoad dan costPerUnitAbove |
Menambahkan permintaan beban ringan | Memungkinkan kendaraan sedikit melebihi kapasitas idealnya (dengan penalti) daripada meninggalkan paket. |
| Pengiriman dilewati karena kelebihan muatan armada | model.vehicles[] atau shipments[].timeWindows |
Menambahkan kendaraan atau melonggarkan periode waktu | Jika ada terlalu banyak pengiriman untuk armada saat ini, terutama selama jam puncak, tambahkan lebih banyak kendaraan atau perluas periode pengiriman untuk menyebarkan beban kerja. |
| Rute terlalu panjang atau tidak efisien | vehicles[].costPerKilometer / costPerHour |
Menambahkan biaya atau meningkatkan nilainya | Memberi tahu API bahwa perjalanan memerlukan biaya yang mahal, sehingga mendorongnya untuk menghapus perhentian yang jauh dan terisolasi guna membuat rute yang lebih efisien untuk 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 mempersingkat rute, kecuali jika Anda juga menerapkan batas durasi untuk memaksa pemecah masalah mendistribusikan workload ke 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 titik awal berdasarkan solusi Anda sebelumnya, sehingga API dapat mengubah rencana yang ada, bukan menghitung rencana baru dari awal.
Berikut adalah berbagai cara untuk memperbarui rencana rute dengan parameter injeksi:
- Teruskan rute dari respons sebelumnya ke kolom
injectedFirstSolutionRoutespermintaan baru Anda. Hal ini mempercepat penelusuran pengoptimalan dan berguna untuk perencanaan ulang sebelum operasi harian dimulai, seperti mengintegrasikan pengiriman di menit-menit terakhir. - 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 untuk pengelola armada dan mengirimkan petunjuk belokan demi belokan kepada pengemudi.
Visualisasi
Agar pengelola armada dapat memverifikasi dan memantau rencana rute, Anda dapat memvisualisasikan rencana rute dengan cara berikut:
Agar pengelola armada dapat memverifikasi dan memantau rencana rute, Anda dapat menampilkannya di peta dasbor. Bergantung pada tahap pengembangan saat ini, Anda dapat memvisualisasikan rencana rute dengan cara berikut:
- Menjelajahi 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 melalui daftar ini, menggunakanshipmentIndexuntuk mengambil koordinat lokasi untuk setiap perhentian, dan menggunakan library pemetaan untuk merender penanda bernomor pada 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
mewakili 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 navigasi 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 akan 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 eksekusi rute secara real time. Meskipun API menyediakan polyline jalur yang dimaksudkan untuk evaluasi, Fleet Engine memasangkan urutan kunjungan yang direncanakan dengan pelacakan kendaraan secara live.