Membuat model logika bisnis dengan atribut transisi

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:

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

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

  3. Tambahkan tag ini ke hal berikut:

    1. VisitRequest.tags dalam 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 parkir baru, tambahkan entri ke ShipmentModel.transition_attributes yang menambahkan penundaan untuk parkir saat datang dari tempat parkir yang berbeda 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 perlu 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 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:

  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 fasilitas pembersihan dengan atribut berikut:
    1. Setiap lokasi fasilitas pembersihan harus direpresentasikan sebagai permintaan kunjungan pengiriman dari pengiriman ini.
    2. Tambahkan CLEANED ke VisitRequest.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.
    3. Izinkan pengoptimal untuk melewati pengiriman ini jika kendaraan tidak digunakan dengan menetapkan penalty_cost ke angka kecil.
  3. Untuk setiap kendaraan, tambahkan CLEANED ke Vehicle.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.

  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 akhir kendaraan jika 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 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.

Bacaan lebih lanjut