Contoh ini menunjukkan cara menggunakan atribut transisi untuk memprioritaskan rute tempat pengambilan dan pengiriman terdekat dilakukan oleh kendaraan yang sama dalam satu blok waktu. Untuk mempelajari atribut transisi lebih lanjut, lihat Membuat Logika Bisnis Model dengan Atribut Transisi.
Dalam contoh ini:
- Pengiriman paket A, B, dan C berdekatan satu sama lain di jalan yang sama.
- Pengiriman tambahan akan tersedia di masa mendatang.
- Pengiriman tidak memiliki waktu pengiriman yang ditentukan.
- Terlepas dari jadwal kunjungan, kendaraan harus melewati jalan ini dua kali: sekali di pagi hari dalam perjalanan dari depot, dan sekali di malam hari dalam perjalanan pulang.
- Jarak perjalanan dan durasi rute secara keseluruhan selalu sama, terlepas dari kapan A, B, dan C dilakukan.
Dalam situasi ini, dan untuk permintaan yang hanya menggunakan biaya per jam dan biaya per kilometer, rute yang dioptimalkan dapat menangani A dan B pada pagi hari dan C ditangani pada malam hari, dan biaya solusinya akan sama seperti jika ketiganya ditangani secara bersamaan.
Biaya per kilometer dengan nilai minimum
Untuk mengelompokkan kunjungan di sekitar, Anda harus memilih jarak minimum terlebih dahulu. Ini adalah jarak maksimum antara dua kunjungan yang Anda anggap berada di sekitar. Contoh ini menggunakan nilai minimum 100 meter yang kira-kira sesuai dengan satu blok di area perkotaan. Anda dapat menaikkan atau menurunkan nilai minimum untuk menyesuaikan dengan kebutuhan bisnis dan preferensi pengemudi Anda.
Untuk mengelompokkan kunjungan terdekat dalam jarak 100 meter dari satu sama lain, Anda menetapkan biaya tinggi pada 100 meter pertama setiap transisi dan biaya lebih rendah untuk setiap meter tambahan transisi. Karena 100 meter pertama adalah yang paling mahal, pengoptimal akan menghemat biaya terbesar dengan menggunakan transisi yang lebih pendek dari nilai minimum 100 meter, meskipun hal ini berarti memperpanjang keseluruhan panjang rute.
Untuk menyiapkan biaya, Anda menambahkan entri baru ke
ShipmentModel.transition_attributes
dengan properti berikut:
- Untuk mencocokkan semua kemungkinan transisi, pilih tag yang tidak digunakan di mana pun dalam
model, misalnya
UNUSED_TAG
. TetapkanTransitionAttributes.excluded_src_tag
danTransitionAttributes.excluded_dst_tag
ke tag ini. - Siapkan
TransitionAttributes.distance_limit
dengan jarak dan biaya minimum:- Tetapkan
DistanceLimit.soft_max_meters
ke nilai minimum yang dipilih. - Tetapkan
DistanceLimit.cost_per_kilometer_below_soft_max
ke biaya per kilometer di bawah nilai minimum. - Tetapkan
DistanceLimit.cost_per_kilometer_above_soft_max
ke biaya per kilometer di atas nilai minimum.
- Tetapkan
{
"model": {
"transitionAttributes": [
{
"excluded_dst_tag": "UNUSED_TAG ",
"excluded_src_tag": "UNUSED_TAG ",
"distanceLimit": {
"softMaxMeters": 100,
"costPerKilometerBelowSoftMax": 50,
"costPerKilometerAboveSoftMax": 1,
}
}
]
}
}
Tag #unused_tag#
tidak boleh digunakan oleh pengiriman atau kendaraan apa pun untuk mencocokkan
semua kemungkinan transisi. Untuk informasi selengkapnya, lihat Cara mencocokkan semua permintaan kunjungan.
Cara kerja biaya tinggi di bawah nilai minimum
Bagian ini menunjukkan pengaruh biaya di bawah dan di atas nilai minimum terhadap biaya keseluruhan berbagai solusi dari contoh skenario.
Solusi 1: Lakukan A, B dalam perjalanan ke sana, C dalam perjalanan kembali
Dalam solusi ini, pengiriman dibagi menjadi dua traversal jalan ini. Dua di antaranya dikirim pada traversal pertama, dan satu lagi dikirim pada traversal kedua. Ada 5 transisi:
Transisi | Jarak | Di bawah nilai minimum | Di atas ambang batas | ||
---|---|---|---|---|---|
Jarak | Biaya | Jarak | Biaya | ||
depot →A | 1.000 m | 100 m | 5 | 900 m | 0,9 |
A→B | 50 m | 50 m | 2,5 | 0 mnt | 0 |
B→other | 1.030 m | 100 m | 5 | 930 m | 0,93 |
other→C | 1.000 m | 100 m | 5 | 900 m | 0,9 |
C→depot | 1.080 m | 100 m | 5 | 980 m | 0,98 |
Total | 450 m | 22,5 | 3710 m | 3,71 |
Biaya keseluruhan dihitung dari jumlah dua biaya per kilometer:
- biaya per kilometer di bawah nilai minimum (50) kali total jarak yang ditempuh di bawah nilai minimum (450 m = 0,45 km),
- biaya per kilometer di atas nilai minimum (1) kali total jarak yang ditempuh di atas nilai minimum (3710 m = 3,71 km).
Dengan demikian, biaya keseluruhannya adalah 0,45 * 50 + 3,71 * 1 = 22,5 + 3,71 = 26,21.
Solusi 2: Lakukan A, B, C dalam perjalanan ke sana, tidak ada apa pun dalam perjalanan kembali
Dalam solusi ini, tidak seperti solusi 1, ketiga pengiriman dikirim "sebagai grup" selama satu perjalanan di jalan. Pada traversal lainnya, kendaraan tidak berhenti sama sekali. Sekali lagi, ada 5 transisi, tetapi panjang dan komposisinya berbeda:
Transisi | Jarak | Di bawah nilai minimum | Di atas ambang batas | ||
---|---|---|---|---|---|
Jarak | Biaya | Jarak | Biaya | ||
depot →A | 1.000 m | 100 m | 5 | 900 m | 0,9 |
A→B | 50 m | 50 m | 2,5 | 0 mnt | 0 |
B→C | 30 m | 30 m | 1,5 | 0 mnt | 0 |
C→lainnya | 1.000 m | 100 m | 5 | 900 m | 0,9 |
other→depot | 2.080 m | 100 m | 5 | 1.980 m | 1,98 |
Total | 380 m | 19 | 3.780 m | 3,78 |
Dengan menggunakan komputasi yang sama seperti dalam solusi 1, biaya keseluruhannya adalah 0,38 * 50 +
3,78 * 1 = 19 + 3,78 = 22,78, dan melakukan semua kunjungan dalam satu blok waktu memiliki biaya yang lebih rendah daripada melakukan kunjungan dalam dua grup. Anda dapat memperkuat efek ini dengan
meningkatkan
DistanceLimit.cost_per_kilometer_below_soft_max
.
Alasan biaya per kilometer yang rendah di bawah nilai minimum tidak berfungsi
Karena Anda ingin lebih memilih transisi singkat daripada transisi panjang, Anda mungkin tergoda untuk memberikan biaya per kilometer yang tinggi untuk transisi panjang, dan mempertahankan biaya per kilometer yang rendah untuk transisi singkat. Namun, hal ini sebenarnya memiliki efek terbalik: karena 100 meter pertama transisi adalah yang termurah, pengoptimal akan menggunakan meter "murah" ini untuk mendapatkan efek terbesar dengan lebih memilih transisi yang memiliki jarak hampir atau lebih dari 100 meter.
Anda dapat melihat efek ini pada dua contoh solusi. Jika Anda menukar biaya per kilometer di bawah dan di atas nilai minimum, biaya rute akan berubah:
Biaya tinggi di atas nilai minimum | Biaya tinggi di bawah nilai minimum | |||
---|---|---|---|---|
Solusi 1 | Solusi 2 | Solusi 1 | Solusi 2 | |
KM di bawah nilai minimum | 0.45 | 0,38 | 0.45 | 0,38 |
Biaya per KM di bawah nilai minimum | 100 | 100 | 50,00 | 50,00 |
KM di atas nilai minimum | 3,71 | 3,78 | 3,71 | 3,78 |
Biaya per KM di atas nilai minimum | 50,00 | 50,00 | 100 | 100 |
Total biaya | 185,95 | 189,38 | 26,21 | 22,78 |
Untuk setiap versi, total biaya yang lebih rendah dari dua solusi tersebut ditandai dengan huruf tebal. Anda dapat melihat bahwa saat menggunakan biaya tinggi di atas nilai minimum, biaya total rute kini lebih tinggi untuk rute tempat kunjungan dikelompokkan, yang merupakan kebalikan dari yang ingin Anda capai.