Panduan ini menunjukkan kemungkinan penggunaan atribut transisi. Tutorial ini akan mengajarkan cara memodelkan skenario dunia nyata pada dua contoh: menggabungkan waktu untuk memarkir kendaraan ke dalam rute yang dioptimalkan, dan memastikan bahwa setiap rute berakhir dengan kunjungan ke lokasi tertentu.
Sebelum memulai
Anda menggunakan atribut transisi untuk menambahkan biaya dan penundaan khusus model ke transisi tertentu dalam rute yang dioptimalkan. Biaya dan penundaan ini ditambahkan ke durasi transisi dan biaya yang dihitung dari data peta berdasarkan parameter kendaraan yang digunakan.
Transisi adalah segmen rute yang menghubungkan satu lokasi ke lokasi berikutnya.
Lokasi mengacu pada salah satu titik berikut dalam rute kendaraan:
- Titik awal rute.
- Perhentian tempat pengambilan atau pengiriman dilakukan.
- Titik akhir rute.
Anda menentukan semua atribut transisi untuk model dengan menambahkannya ke daftar
ShipmentModel.transition_attributes.
Setiap elemen daftar menentukan satu set atribut transisi, dan dicocokkan dengan transisi dalam rute menggunakan tag di lokasi awal dan lokasi akhir transisi. Untuk mempelajari lebih lanjut atribut transisi, lihat
dokumentasi referensi untuk
TransitionAttributes.
Membuat model skenario dunia nyata
Bagian ini menunjukkan dua contoh kecil cara menerapkan batasan bisnis di dunia nyata menggunakan atribut transisi.
Menyisihkan waktu untuk parkir
Dalam skenario ini, pengemudi harus memarkir kendaraan sebelum dapat mengunjungi lokasi A. Lokasi B berada di dekatnya, dan pengemudi dapat menggunakan tempat parkir yang sama untuk kedua kunjungan. Jika pengemudi mengunjungi B tepat setelah A, dia akan menghemat waktu karena tidak perlu meninggalkan tempat parkir dan memarkir kendaraan lagi. Di Route Optimization API, Anda dapat menggunakan atribut transisi untuk menambahkan waktu tambahan untuk memarkir kendaraan hanya saat pengemudi berpindah dari satu tempat parkir ke tempat parkir lainnya.
Saat Anda memodelkan waktu parkir secara terpisah dari durasi kunjungan, Anda membuat rute yang memerlukan waktu lebih sedikit untuk kunjungan yang menggunakan parkir yang sama. Anda membuat model lebih presisi, dan Anda juga membuat pengoptimal lebih memilih rute tempat kunjungan dikelompokkan.
Gunakan langkah-langkah berikut untuk melakukannya dalam permintaan Route Optimization API:
Gunakan
VisitRequest.durationhanya selama waktu yang diperlukan untuk melakukan kunjungan. Misalnya, untuk menyerahkan paket dan mengumpulkan tanda tangan dari pelanggan.Untuk setiap tempat parkir berbeda yang digunakan dalam model, gunakan tag baru yang tidak digunakan untuk hal lain dalam model, misalnya
PARKING_123.Tambahkan tag ini ke:
VisitRequest.tagsdi semua permintaan kunjungan yang menggunakan tempat parkir ini.Vehicle.start_tagsjika kendaraan memulai rutenya di tempat parkir ini.Vehicle.end_tagsjika kendaraan memulai dan mengakhiri rutenya di tempat parkir ini.
Untuk setiap tag parkir baru, tambahkan entri ke
ShipmentModel.transition_attributesyang menambahkan penundaan untuk parkir saat datang dari tempat parkir yang berbeda dengan melakukan hal berikut:Tetapkan
TransitionAttributes.excluded_src_tagdanTransitionAttributes.dst_tagkePARKING_123.Tetapkan
TransitionAttributes.delayke waktu yang diperlukan untuk memarkir kendaraan.
Misalnya, jika tag lokasi adalah
PARKING_123dan perlu waktu 150 detik untuk memarkir kendaraan, tambahkan entri berikut keShipmentModel.transition_attributes:{ "excluded_src_tag": "PARKING_123", "dst_tag": "PARKING_123", "delay": "150s" }
Pembersihan wajib di akhir rute
Dalam skenario ini, kendaraan harus dibersihkan di akhir rute, dengan batasan tambahan berikut:
- Pembersihan dilakukan di fasilitas pembersihan khusus sebelum kendaraan kembali ke depo kendaraan. Rute yang dioptimalkan menggunakan fasilitas pembersihan terbaik berdasarkan lokasinya serta lokasi pengambilan dan pengiriman yang dilakukan oleh kendaraan.
- Setelah pembersihan, kendaraan tidak boleh melakukan pengambilan atau pengiriman tambahan.
- Waktu untuk berkendara ke sana dan membersihkan kendaraan dihitung sebagai jam kerja pengemudi, dan harus sesuai dengan durasi maksimal rute.
Anda membuat model persyaratan ini dengan hanya mengizinkan rute yang kosong atau yang kunjungan terakhirnya adalah ke fasilitas pembersihan. Di Route Optimization API, Anda melakukannya dengan melarang transisi ke titik jalan akhir rute dari lokasi mana pun kecuali dari fasilitas pembersihan atau dari titik awal rute:
- Pilih dua tag baru yang tidak digunakan di mana pun dalam model, misalnya
CLEANEDdanROUTE_END. Yang pertama adalah untuk lokasi tempat kendaraan berada atau menjadi bersih, dan yang kedua adalah untuk akhir rute. - Untuk setiap kendaraan, tambahkan pengiriman khusus pengantaran baru yang mewakili kunjungan
ke fasilitas pembersihan dengan atribut berikut:
- Setiap lokasi fasilitas pembersihan harus direpresentasikan sebagai permintaan kunjungan pengiriman untuk pengiriman ini.
- Tambahkan
CLEANEDkeVisitRequest.tagssetiap permintaan kunjungan pengiriman fasilitas pembersihan. Hal ini menandakan bahwa kendaraan yang meninggalkan lokasi ini bersih. Permintaan kunjungan lain dalam model tidak boleh menggunakan tag ini agar kendaraan dianggap "tidak bersih" saat meninggalkannya. - Izinkan pengoptimal melewati pengiriman ini jika kendaraan tidak digunakan dengan menetapkan
penalty_costke angka kecil.
Untuk setiap kendaraan, tambahkan
CLEANEDkeVehicle.start_tags. Hal ini digunakan untuk menandai kendaraan sebagai bersih sebelum melakukan penjemputan atau pengiriman, dengan asumsi bahwa kendaraan telah dibersihkan pada akhir hari kerja sebelumnya, dan memungkinkannya untuk langsung beralih dari titik jalan awal ke titik jalan akhir. Meskipun rute tersebut tidak terjadi dalam praktiknya, mengizinkan skenario ini membantu pengoptimal menelusuri rute yang dioptimalkan secara lebih efisien.Untuk setiap kendaraan, tambahkan
ROUTE_ENDkeVehicle.end_tags.Tambahkan entri baru ke
ShipmentModel.transition_attributesyang melarang kendaraan tiba di titik jalan akhir kendaraan jika kendaraan tidak bersih, dengan properti berikut:Tetapkan
TransitionAttributes.excluded_src_tagkeCLEANED.Tetapkan
TransitionAttributes.dst_tagkeROUTE_END.Setel
TransitionAttributes.delayke nilai yang besar. Jika Anda membuat penundaan lebih lama dari durasi rute maksimum, Anda secara efektif melarang pengoptimal menggunakan transisi ini dalam rute.
Misalnya, jika skala waktu model adalah satu hari kerja, Anda dapat menggunakan penundaan 24 jam (86.400 detik) untuk melarang transisi ke akhir rute dari mana pun kecuali fasilitas pembersihan dan awal rute:
{ "excluded_src_tag": "CLEANED", "dst_tag": "ROUTE_END", "delay": "86400s" }
Cara memilih antara penundaan dan biaya
Pilihan antara penundaan dan biaya bergantung pada sifat logika bisnis dan batasan yang diterapkan. Menetapkan
TransitionAttributes.delay
paling cocok untuk menerapkan batasan ketat atau untuk menyatakan kompromi dalam hal
waktu yang dihabiskan.
TransitionAttributes.cost
lebih cocok saat menerapkan preferensi ringan atau kompromi yang dinyatakan sebagai
biaya tambahan. Anda dapat menggabungkan penundaan dan biaya secara arbitrer jika waktu yang dihabiskan dan biaya menjadi perhatian.
Contoh pembersihan kendaraan menggunakan penundaan yang sangat lama, karena membersihkan kendaraan di akhir rute adalah persyaratan mutlak dan penundaan yang lama mencegah pengoptimal mengabaikan persyaratan tersebut. Jika Anda hanya menetapkan biaya, pengoptimal dapat memilih untuk melewati pembersihan, jika menemukan cara untuk mengganti biaya di tempat lain, misalnya dengan mengirimkan lebih banyak pengiriman dalam waktu yang "dihemat" dengan tidak membersihkan kendaraan.
Contoh parkir menggunakan penundaan singkat yang sesuai dengan waktu tambahan yang diperlukan untuk memarkir kendaraan. Anda juga dapat menggunakan biaya yang dikombinasikan dengan penundaan, jika pengemudi berhenti di tempat parkir berbayar.
Cara menambahkan atribut transisi yang cocok dengan semua permintaan kunjungan
Contoh di atas menggunakan atribut transisi yang cocok dengan lokasi yang memiliki tag tertentu, atau lokasi yang tidak memiliki tag. Namun, bagaimana jika Anda perlu menambahkan atribut transisi yang berlaku untuk semua transisi?
Anda tidak dapat menghilangkan tag begitu saja, karena setiap pesan
TransitionAttributes
harus memiliki salah satu dari
TransitionAttributes.src_tag
dan
TransitionAttributes.excluded_src_tag
serta salah satu dari
TransitionAttributes.dst_tag
dan
TransitionAttributes.excluded_dst_tag.
Namun, Anda dapat mencocokkan semua tag dengan menetapkan
TransitionAttributes.excluded_src_tag
atau
TransitionAttributes.excluded_dst_tag
ke tag yang tidak digunakan di mana pun dalam model. Tindakan ini akan mencocokkan semua lokasi
yang tidak memiliki tag ini, tetapi karena Anda sengaja memilih tag yang tidak
digunakan oleh lokasi mana pun, atribut transisi ini akan cocok dengan semua lokasi.