Panduan ini menunjukkan kemungkinan penggunaan atribut transisi. Tutorial ini akan mengajarkan cara membuat model 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 keterlambatan khusus model ke transisi tertentu di rute yang dioptimalkan. Biaya dan keterlambatan 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.
- 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 kumpulan atribut transisi, dan cocok dengan transisi di rute menggunakan tag di lokasi awal dan lokasi akhir transisi. Untuk mempelajari atribut transisi lebih lanjut, lihat
dokumentasi referensi untuk
TransitionAttributes
.
Membuat model skenario dunia nyata
Bagian ini menunjukkan dua contoh kecil tentang cara menerapkan batasan bisnis di dunia nyata menggunakan atribut transisi.
Reservasi waktu untuk parkir
Dalam skenario ini, pengemudi harus memarkir kendaraan sebelum dapat mengunjungi lokasi A. Lokasi B berada di sekitar, dan pengemudi dapat menggunakan tempat parkir yang sama untuk kedua kunjungan. Jika pengemudi mengunjungi B tepat setelah A, ia 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 guna memarkir kendaraan hanya saat pengemudi berpindah dari satu tempat parkir ke tempat parkir lainnya.
Saat membuat model waktu parkir secara terpisah dari durasi kunjungan, Anda membuat rute yang mengelompokkan kunjungan yang menggunakan parkir yang sama sehingga memerlukan waktu lebih sedikit. Anda membuat model lebih akurat, dan Anda juga membuat pengoptimal memilih rute tempat kunjungan dikelompokkan.
Gunakan langkah-langkah berikut untuk melakukannya dalam permintaan Route Optimization API:
Gunakan
VisitRequest.duration
hanya untuk waktu yang diperlukan untuk melakukan kunjungan. Misalnya, untuk menyerahkan paket dan mengumpulkan tanda tangan dari pelanggan.Untuk setiap tempat parkir yang berbeda yang digunakan dalam model, gunakan tag baru yang tidak digunakan untuk hal lain dalam model, misalnya
PARKING_123
.Tambahkan tag ini ke hal berikut:
VisitRequest.tags
dalam 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 parkir baru, tambahkan entri ke
ShipmentModel.transition_attributes
yang menambahkan penundaan untuk parkir saat datang dari tempat parkir yang berbeda 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 perlu 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 harus 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 dan pengiriman yang dilakukan oleh kendaraan.
- Setelah pembersihan, kendaraan tidak boleh melakukan pengambilan atau pengiriman tambahan.
- Waktu untuk mengemudi ke sana dan membersihkan kendaraan dihitung berdasarkan jam kerja pengemudi, dan harus sesuai dengan durasi maksimum 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
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 fasilitas pembersihan dengan atribut berikut:
- Setiap lokasi fasilitas pembersihan harus direpresentasikan sebagai permintaan kunjungan pengiriman dari pengiriman ini.
- Tambahkan
CLEANED
keVisitRequest.tags
dari setiap permintaan kunjungan pengiriman fasilitas pembersihan. Ini menandakan bahwa kendaraan yang meninggalkan lokasi ini bersih. Permintaan kunjungan lain dalam model tidak boleh menggunakan tag ini sehingga kendaraan dianggap "tidak bersih" saat meninggalkannya. - Izinkan pengoptimal untuk melewati pengiriman ini jika kendaraan tidak
digunakan dengan menetapkan
penalty_cost
ke angka kecil.
Untuk setiap kendaraan, tambahkan
CLEANED
keVehicle.start_tags
. Ini digunakan untuk menandai kendaraan sebagai bersih sebelum melakukan pengambilan atau pengiriman, dengan asumsi bahwa kendaraan telah dibersihkan pada akhir hari kerja sebelumnya, dan memungkinkan kendaraan untuk berpindah dari titik awal langsung ke titik akhir. Meskipun rute tersebut tidak terjadi dalam praktiknya, mengizinkan skenario ini akan 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 akhir kendaraan jika 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 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 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. Menetapkan
TransitionAttributes.delay
paling cocok untuk menerapkan batasan keras atau untuk mengekspresikan kompromi dalam hal
waktu yang dihabiskan.
TransitionAttributes.cost
lebih cocok saat menerapkan preferensi lembut atau kompromi yang dinyatakan sebagai
biaya tambahan. Anda dapat menggabungkan penundaan dan biaya secara sewenang-wenang jika waktu
yang dihabiskan dan biaya menjadi masalah.
Contoh pembersihan kendaraan menggunakan penundaan yang sangat lama, karena membersihkan 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 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 bersama dengan keterlambatan, 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 menetapkan
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.