Pemecah masalah pemilihan rute menggunakan objek yang disebut dimensi untuk melacak kuantitas yang terakumulasi di sepanjang rute kendaraan, seperti waktu perjalanan atau, jika kendaraan melakukan pengambilan dan pengiriman, total berat yang dibawanya kami. Jika masalah {i>routing<i} melibatkan jumlah tersebut, baik dalam batasan fungsi tujuan, Anda perlu menentukan dimensi untuk menentukannya.
Bagian ini menjelaskan cara menetapkan dan menggunakan dimensi.
Contoh dimensi
Berikut adalah beberapa contoh dimensi dari bagian sebelumnya.
Contoh VRPTW membuat dimensi untuk dilacak kumulatif waktu tempuh untuk setiap kendaraan. Pemecah masalah menggunakan dimensi untuk menegakkan batasan di mana kendaraan hanya dapat mengunjungi lokasi dalam periode waktu.
Contoh CVRP membuat dimensi untuk permintaan (mis., bobot atau volume paket yang akan diambil), yang melacak beban kumulatif yang dibawa kendaraan di sepanjang rutenya. Pemecah masalah menggunakan dimensi untuk menerapkan batasan beban kendaraan tidak boleh melebihi kapasitasnya.
Contoh di bawah ini menentukan dimensi untuk VRPTW menggunakan
AddDimension
.
Python
routing.AddDimension( callback_index, slack_max, capacity, fix_start_cumul_to_zero, dimension_name)
C++
routing.AddDimension( callback_index, slack_max, capacity, fix_start_cumul_to_zero, dimension_name)
Java
routing.addDimension( callbackIndex, slackMax, capacity, fixStartCumulToZero, dimensionName)
C#
routing.AddDimension( callbackIndex, slackMax, capacity, fixStartCumulToZero, dimensionName)
Metode AddDimension
memiliki input berikut:
callback_index
: Indeks untuk callback yang menampilkan kuantitas. Tujuan , yang merupakan referensi internal pemecah masalah ke callback, dibuat oleh sepertiRegisterTransitCallback
atauRegisterUnitaryTransitCallback
.slack_max
: Maksimum untuk slack, variabel yang digunakan untuk mewakili proses menunggu waktu di beberapa lokasi. Lihat variabel slack di bawah untuk spesifikasi pendukung. Jika masalahnya tidak terkait waktu tunggu, Anda biasanya dapat menyetelslack_max
menjadi 0.capacity
: Maksimum untuk total jumlah yang terakumulasi di sepanjang setiap rute. Gunakancapacity
untuk membuat batasan seperti yang ada di CVRP. Jika masalah Anda tidak memiliki Anda dapat menetapkancapacity
ke nilai yang cukup besar untuk memberlakukan pembatasan pada rute-rute —misalnya, jumlah semua entri matriks atau array yang digunakan untuk menentukan callback.fix_start_cumulative_to_zero
: Nilai Boolean. Jika benar, nilai kumulatif dari jumlah tersebut dimulai dari 0. Biasanya, parameter ini harus disetel keTrue
. Namun, untuk VRPTW atau masalah dengan batasan sumber daya, beberapa kendaraan mungkin harus dimulai setelah waktu 0 karena batasan jangka waktu, jadi Anda harus tetapkanfix_start_cumulative_to_zero
keFalse
untuk masalah ini.dimension_name
: String untuk nama dimensi, seperti'Distance'
, yang dapat digunakan untuk mengakses variabel di tempat lain dalam program.
Program CVRP membuat jenis dimensi yang sedikit berbeda menggunakan
AddDimensionWithVehicleCapacity
. Metode ini memerlukan array kapasitas, dengan satu entri untuk setiap kendaraan.
(Sebaliknya, AddDimension
menggunakan satu nilai untuk capacity
, jadi semua
kendaraan dianggap memiliki kapasitas yang sama.)
Lihat RoutingModel
halaman referensi untuk metode lain yang membuat dimensi.
Bagian ini Menyimpan periode waktu solusi ke daftar atau array menampilkan fungsi yang menyimpan data kumulatif dalam dimensi dalam daftar atau array.
Variabel Slack
Berikut adalah contoh yang menggambarkan variabel {i> slack <i}untuk masalah yang melibatkan waktu tempuh. Misalkan kendaraan bergerak dari lokasi i ke lokasi j dalam satu langkah rutenya, dan bahwa:
- Waktu perjalanan kumulatif kendaraan di i adalah 100 menit.
- Waktu perjalanan kumulatif kendaraan di j adalah 200 menit.
- Waktu tempuh dari i ke j adalah 75 menit.
Kendaraan tidak dapat meninggalkan lokasi i segera setelah kedatangan, atau biaya kumulatifnya waktu di lokasi j adalah 175. Sebaliknya, kendaraan harus menunggu selama 25 menit di lokasi i sebelum keberangkatan; dengan kata lain, {i>slack <i}di lokasi i adalah 25.
Anda harus menghindari kelonggaran dalam VRPTW karena kendaraan mungkin harus menunggu sebelum
yang mengunjungi suatu lokasi, karena kendala waktu. Pada masalah seperti ini, atur
slack_max
ke jumlah waktu maksimum yang Anda inginkan untuk mengantre kendaraan
sebuah lokasi sebelum melanjutkan ke lokasi berikutnya. Jika tidak penting berapa lama
mereka menunggu, cukup setel slack_max
ke angka yang sangat besar.
Di sisi lain, untuk CVRP, perubahan akumulasi beban dari i
menjadi
j
selalu sama dengan permintaan pada i
, sehingga tidak ada slack. Untuk masalah seperti
ini, Anda dapat menetapkan slack_max
ke 0.
Selanjutnya, kita akan memberikan definisi formal tentang {i>slack<i}. Secara internal, dimensi menyimpan dua jenis variabel yang terkait dengan kuantitas yang terakumulasi sepanjang rute:
- Variabel transportasi umum: Peningkatan atau penurunan jumlah di setiap langkah
rute.
Jika
i -> j
adalah satu langkah dalam rute, variabel transportasi umum adalahi
,j
entri matriks transit (untuk callback transit), atau cukup nilai callback di lokasi i (jika callback hanya bergantung pada satu lokasi). - Variabel kumulatif: Total jumlah akumulasi di setiap lokasi. Anda
dapat mengakses variabel kumulatif di lokasi i dengan
dimension_name.CumulVar(i)
. Misalnya, lihat batasan periode waktu dalam contoh VRPTW.
Dengan asumsi bahwa kendaraan berangkat dari lokasi i
ke lokasi j
dalam satu langkah,
slack berkaitan dengan variabel-variabel ini sebagai berikut:
slack(i) = cumul(j) - cumul(i) - transit(i, j)
Untuk detail selengkapnya tentang dimensi, lihat
RoutingDimension
di bagian referensi.