Membuat model logika bisnis dengan atribut transisi

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:

  1. Gunakan VisitRequest.duration hanya selama waktu yang diperlukan untuk melakukan kunjungan. Misalnya, untuk menyerahkan paket dan mengumpulkan tanda tangan dari pelanggan.

  2. Untuk setiap tempat parkir berbeda yang digunakan dalam model, gunakan tag baru yang tidak digunakan untuk hal lain dalam model, misalnya PARKING_123.

  3. Tambahkan tag ini ke berikut:

    1. VisitRequest.tags di semua permintaan kunjungan yang menggunakan tempat parkir ini.

    2. Vehicle.start_tags jika kendaraan memulai rutenya di tempat parkir ini.

    3. Vehicle.end_tags jika kendaraan memulai dan mengakhiri rutenya di tempat parkir ini.

  4. 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:

    1. Tetapkan TransitionAttributes.excluded_src_tag dan TransitionAttributes.dst_tag ke PARKING_123.

    2. 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 ke ShipmentModel.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:

  1. Pilih dua tag baru yang tidak digunakan di mana pun dalam model, misalnya CLEANED dan ROUTE_END. Yang pertama adalah untuk lokasi tempat kendaraan berada atau menjadi bersih, dan yang kedua adalah untuk akhir rute.
  2. Untuk setiap kendaraan, tambahkan pengiriman khusus pengiriman baru yang mewakili kunjungan ke tempat pencucian kendaraan dengan atribut berikut:
    1. Setiap lokasi fasilitas pembersihan harus ditampilkan sebagai permintaan kunjungan pengiriman untuk pengiriman ini.
    2. Tambahkan CLEANED ke VisitRequest.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.
    3. Izinkan pengoptimal melewati pengiriman ini saat kendaraan tidak digunakan dengan cara lain dengan menyetel penalty_cost ke angka kecil.
  3. Untuk setiap kendaraan, tambahkan CLEANED ke Vehicle.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.

  4. Untuk setiap kendaraan, tambahkan ROUTE_END ke Vehicle.end_tags.

  5. Tambahkan entri baru ke ShipmentModel.transition_attributes yang melarang kendaraan tiba di titik jalan akhir kendaraan jika kendaraan tidak bersih, dengan properti berikut:

    1. Tetapkan TransitionAttributes.excluded_src_tag ke CLEANED.

    2. Tetapkan TransitionAttributes.dst_tag ke ROUTE_END.

    3. 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.

Bacaan lebih lanjut