Panduan ini menunjukkan kemungkinan penggunaan atribut transisi. Anda akan mempelajari cara memodelkan skenario dunia nyata pada dua contoh: memasukkan waktu parkir 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 di rute yang dioptimalkan. Biaya dan penundaan ini ditambahkan di atas 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.
- Tempat perhentian saat 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 di rute menggunakan tag pada 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.
Waktu reservasi untuk parkir
Dalam skenario ini, pengemudi harus memarkirkan 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, mereka 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 ekstra untuk memarkir kendaraan hanya saat pengemudi berpindah dari satu tempat parkir ke tempat parkir lain.
Jika Anda memodelkan waktu parkir secara terpisah dari durasi kunjungan, Anda akan membuat rute yang lebih cepat untuk kunjungan yang menggunakan tempat parkir yang sama. Anda membuat model menjadi 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.duration
hanya 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 berikut:
VisitRequest.tags
di semua permintaan kunjungan yang menggunakan tempat parkir ini.Vehicle.start_tags
jika kendaraan memulai rutenya di tempat parkir ini.Vehicle.end_tags
jika kendaraan memulai dan mengakhiri rutenya di tempat parkir ini.
Untuk setiap tag tempat parkir baru, tambahkan entri ke
ShipmentModel.transition_attributes
yang menambahkan penundaan untuk parkir saat datang dari tempat parkir lain dengan melakukan hal berikut:Tetapkan
TransitionAttributes.excluded_src_tag
danTransitionAttributes.dst_tag
kePARKING_123
.Tetapkan
TransitionAttributes.delay
ke waktu yang diperlukan untuk memarkir kendaraan.
Misalnya, jika tag lokasi adalah
PARKING_123
dan dibutuhkan waktu 150 detik untuk memarkir kendaraan, Anda menambahkan 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 perlu dibersihkan di akhir rute, dengan batasan tambahan berikut:
- Pembersihan dilakukan di fasilitas pembersihan khusus sebelum kembali ke depot kendaraan. Rute yang dioptimalkan menggunakan fasilitas pembersihan terbaik berdasarkan lokasinya dan lokasi pengambilan serta pengiriman yang dilakukan oleh kendaraan.
- Setelah pembersihan, kendaraan tidak boleh melakukan penjemputan atau pengantaran tambahan.
- Waktu untuk berkendara ke sana dan membersihkan kendaraan dihitung dalam jam kerja pengemudi, dan harus sesuai dengan durasi maksimal rute.
Anda memodelkan persyaratan ini dengan hanya mengizinkan rute yang kosong atau yang kunjungan terakhirnya adalah ke fasilitas pembersihan. Di Route Optimization API, Anda dapat 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
CLEANED
danROUTE_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 pengiriman baru yang mewakili kunjungan ke tempat pencucian kendaraan dengan atribut berikut:
- Setiap lokasi fasilitas pembersihan harus ditampilkan sebagai permintaan kunjungan pengiriman untuk pengiriman ini.
- Tambahkan
CLEANED
keVisitRequest.tags
dari setiap permintaan kunjungan pengiriman fasilitas pembersihan. Hal ini menandakan bahwa kendaraan yang keluar dari lokasi ini bersih. Permintaan kunjungan lain dalam model tidak boleh menggunakan tag ini sehingga kendaraan dianggap "tidak bersih" saat meninggalkan lokasi tersebut. - Izinkan pengoptimal melewati pengiriman ini saat kendaraan tidak digunakan dengan cara lain dengan menyetel
penalty_cost
ke angka kecil.
Untuk setiap kendaraan, tambahkan
CLEANED
keVehicle.start_tags
. Ini digunakan untuk menandai kendaraan sebagai bersih sebelum melakukan penjemputan atau pengantaran, dengan asumsi bahwa kendaraan telah dibersihkan di akhir hari kerja sebelumnya, dan memungkinkannya untuk langsung menuju titik jalan akhir dari titik jalan awal. Meskipun rute tersebut tidak terjadi dalam praktiknya, mengizinkan skenario ini membantu pengoptimal menelusuri rute yang dioptimalkan secara lebih efisien.Untuk setiap kendaraan, tambahkan
ROUTE_END
keVehicle.end_tags
.Tambahkan entri baru ke
ShipmentModel.transition_attributes
yang melarang kendaraan tiba di titik jalan akhir kendaraan jika kendaraan tidak bersih, dengan properti berikut:Tetapkan
TransitionAttributes.excluded_src_tag
keCLEANED
.Tetapkan
TransitionAttributes.dst_tag
keROUTE_END
.Tetapkan
TransitionAttributes.delay
ke nilai yang besar. Jika Anda membuat penundaan lebih lama dari durasi rute maksimal, 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 (86400 detik) untuk melarang transisi ke akhir rute dari mana saja 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 dan batasan bisnis yang diterapkan. Setelan
TransitionAttributes.delay
paling cocok untuk menerapkan batasan ketat atau untuk menyatakan pertukaran dalam hal
waktu yang dihabiskan.
TransitionAttributes.cost
lebih cocok saat menerapkan preferensi atau kompromi ringan yang dinyatakan sebagai
biaya tambahan. Anda dapat menggabungkan penundaan dan biaya secara sewenang-wenang jika waktu yang dihabiskan dan biaya menjadi perhatian.
Contoh pencucian kendaraan menggunakan penundaan yang sangat lama, karena mencuci kendaraan di akhir rute adalah persyaratan yang sulit dan penundaan yang lama mencegah pengoptimal mengabaikan persyaratan tersebut. Jika Anda hanya menetapkan biaya, pengoptimal dapat memilih untuk melewati pembersihan, jika menemukan cara untuk mengkompensasi 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 bersama 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 menghapus 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 menyetel
TransitionAttributes.excluded_src_tag
atau
TransitionAttributes.excluded_dst_tag
ke tag yang tidak digunakan di mana pun dalam model. Hal ini akan cocok dengan 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.