Package google.maps.routeoptimization.v1

Indeks

RouteOptimization

Layanan untuk mengoptimalkan tur kendaraan.

Validitas jenis kolom tertentu:

  • google.protobuf.Timestamp
    • Waktu dalam waktu Unix: detik sejak 1970-01-01T00:00:00+00:00.
    • detik harus dalam [0, 253402300799], yaitu dalam [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • nano harus dibatalkan penetapannya atau disetel ke 0.
  • google.protobuf.Duration
    • detik harus dalam [0, 253402300799], yaitu dalam [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • nano harus dibatalkan penetapannya atau disetel ke 0.
  • google.type.LatLng
    • lintang harus dalam [-90.0, 90.0].
    • bujur harus dalam [-180,0, 180,0].
    • setidaknya salah satu lintang dan bujur tidak boleh nol.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

Mengoptimalkan tur kendaraan untuk satu atau beberapa pesan OptimizeToursRequest sebagai batch.

Metode ini adalah Long Running Operation (LRO). Input untuk pengoptimalan (pesan OptimizeToursRequest) dan output (OptimizeToursResponse pesan) dibaca/ditulis dari/ke Cloud Storage dalam format yang ditentukan pengguna. Seperti metode OptimizeTours, setiap OptimizeToursRequest berisi ShipmentModel dan menampilkan OptimizeToursResponse yang berisi ShipmentRoute, yang merupakan kumpulan rute yang akan dilakukan oleh kendaraan yang meminimalkan biaya keseluruhan.

Cakupan otorisasi

Memerlukan cakupan OAuth berikut ini:

  • https://www.googleapis.com/auth/cloud-platform
OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

Mengirim OptimizeToursRequest yang berisi ShipmentModel dan menampilkan OptimizeToursResponse yang berisi ShipmentRoute, yang merupakan kumpulan rute yang akan dilakukan dengan kendaraan yang meminimalkan biaya keseluruhan.

Model ShipmentModel sebagian besar terdiri dari Shipment yang perlu dilakukan dan Vehicle yang dapat digunakan untuk memindahkan Shipment. ShipmentRoute menetapkan Shipment ke Vehicle. Lebih khusus lagi, mereka menetapkan serangkaian Visit untuk setiap kendaraan, dengan Visit sesuai dengan VisitRequest, yang merupakan layanan pengambilan atau pengiriman untuk Shipment.

Tujuannya adalah untuk memberikan penetapan ShipmentRoute ke Vehicle yang meminimalkan total biaya ketika biaya memiliki banyak komponen yang ditentukan di ShipmentModel.

Cakupan otorisasi

Memerlukan cakupan OAuth berikut ini:

  • https://www.googleapis.com/auth/cloud-platform

AggregatedMetrics

Metrik gabungan untuk ShipmentRoute (respons untuk OptimizeToursResponse atas semua elemen Transition dan/atau Visit (respons atas semua ShipmentRoute).

Kolom
performed_shipment_count

int32

Jumlah pengiriman yang dilakukan. Perhatikan bahwa pasangan pengambilan dan pengantaran hanya dihitung satu kali.

travel_duration

Duration

Total durasi perjalanan untuk rute atau solusi.

wait_duration

Duration

Total durasi tunggu untuk rute atau solusi.

delay_duration

Duration

Total durasi keterlambatan untuk rute atau solusi.

break_duration

Duration

Total durasi jeda untuk rute atau solusi.

visit_duration

Duration

Total durasi kunjungan untuk rute atau solusi.

total_duration

Duration

Total durasi harus sama dengan jumlah dari semua durasi di atas. Untuk rute, parameter ini juga sesuai dengan:

[ShipmentRoute.vehicle_end_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_end_time] - [ShipmentRoute.vehicle_start_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_start_time]
travel_distance_meters

double

Total jarak perjalanan untuk rute atau solusi.

max_loads

map<string, VehicleLoad>

Beban maksimum yang dicapai pada seluruh rute (solusi responsif), untuk setiap kuantitas pada rute ini (solusi reservasi), dihitung sebagai beban maksimum untuk seluruh Transition.vehicle_loads (resp. ShipmentRoute.metrics.max_loads.

BatchOptimizeToursMetadata

Jenis ini tidak memiliki kolom.

Metadata operasi untuk panggilan BatchOptimizeToursRequest.

BatchOptimizeToursRequest

Permintaan untuk mengoptimalkan tur dalam batch sebagai operasi asinkron. Setiap file input harus berisi satu OptimizeToursRequest, dan setiap file output akan berisi satu OptimizeToursResponse. Permintaan berisi informasi untuk membaca/menulis dan mengurai file. Semua file input dan output harus berada di project yang sama.

Kolom
parent

string

Wajib. Project target dan lokasi untuk melakukan panggilan.

Format: * projects/{project-id} * projects/{project-id}/locations/{location-id}

Jika tidak ada lokasi yang ditentukan, wilayah akan dipilih secara otomatis.

model_configs[]

AsyncModelConfig

Wajib. Informasi Input/Output setiap model pembelian, seperti jalur file dan format data.

AsyncModelConfig

Informasi untuk menyelesaikan satu model pengoptimalan secara asinkron.

Kolom
display_name

string

Opsional. Nama model yang ditetapkan pengguna, dapat digunakan sebagai alias oleh pengguna untuk melacak model.

input_config

InputConfig

Wajib. Informasi tentang model input.

output_config

OutputConfig

Wajib. Informasi lokasi output yang diinginkan.

BatchOptimizeToursResponse

Jenis ini tidak memiliki kolom.

Respons terhadap BatchOptimizeToursRequest. Ini ditampilkan dalam Operasi yang Berjalan Lama setelah operasi selesai.

BreakRule

Aturan untuk memberikan waktu istirahat bagi kendaraan (misalnya istirahat makan siang). Istirahat adalah periode waktu yang berdampingan saat kendaraan tetap tidak ada aktivitas pada posisinya saat ini dan tidak dapat melakukan kunjungan apa pun. Jeda data dapat terjadi:

  • selama perjalanan di antara dua kunjungan (yang mencakup waktu sebelum atau tepat setelah kunjungan, tetapi tidak di tengah kunjungan), yang akan memperpanjang waktu transit di antara kunjungan tersebut,
  • atau sebelum kendaraan dimulai (kendaraan tidak boleh menyala di tengah istirahat), dalam hal ini tidak memengaruhi waktu mulai kendaraan.
  • atau setelah kendaraan berakhir (ditto, dengan waktu berakhir kendaraan).
Kolom
break_requests[]

BreakRequest

Urutan jeda. Lihat pesan BreakRequest.

frequency_constraints[]

FrequencyConstraint

Beberapa FrequencyConstraint mungkin berlaku. Semuanya harus dipenuhi oleh BreakRequest dari BreakRule ini. Lihat FrequencyConstraint.

BreakRequest

Urutan jeda (yaitu jumlah dan urutannya) yang berlaku untuk setiap kendaraan harus diketahui sebelumnya. BreakRequest berulang menentukan urutan tersebut, sesuai dengan urutan kemunculannya. Rentang waktu (earliest_start_time / latest_start_time) mungkin tumpang tindih, tetapi harus kompatibel dengan urutan (ini dicentang).

Kolom
earliest_start_time

Timestamp

Wajib. Batas bawah (inklusif) pada awal jeda.

latest_start_time

Timestamp

Wajib. Batas atas (inklusif) pada awal batas.

min_duration

Duration

Wajib. Durasi jeda minimum. Harus positif.

FrequencyConstraint

Salah satunya dapat lebih membatasi frekuensi dan durasi jeda yang ditentukan di atas, dengan menerapkan frekuensi jeda minimum, seperti "Harus ada jeda minimal 1 jam setiap 12 jam". Dengan asumsi bahwa hal ini dapat ditafsirkan sebagai "Dalam rentang waktu geser ke 12 jam, harus ada setidaknya satu jeda setidaknya satu jam", contoh tersebut akan diterjemahkan ke FrequencyConstraint berikut:

{
   min_break_duration { seconds: 3600 }         # 1 hour.
   max_inter_break_duration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

Waktu dan durasi jeda dalam solusi akan mengikuti semua batasan tersebut, selain jangka waktu dan durasi minimum yang telah ditentukan dalam BreakRequest.

Dalam praktiknya, FrequencyConstraint dapat berlaku untuk jeda yang tidak berturut-turut. Misalnya, jadwal berikut mengikuti contoh "1j setiap 12j":

  04:00 vehicle start
   .. performing travel and visits ..
  09:00 1 hour break
  10:00 end of the break
   .. performing travel and visits ..
  12:00 20-min lunch break
  12:20 end of the break
   .. performing travel and visits ..
  21:00 1 hour break
  22:00 end of the break
   .. performing travel and visits ..
  23:59 vehicle end
Kolom
min_break_duration

Duration

Wajib. Durasi jeda minimum untuk batasan ini. Tidak negatif. Lihat deskripsi FrequencyConstraint.

max_inter_break_duration

Duration

Wajib. Rentang maksimum yang diizinkan pada interval waktu apa pun dalam rute yang tidak menyertakan setidaknya sebagian jeda duration >= min_break_duration. Harus positif.

DataFormat

Format data untuk file input dan output.

Enum
DATA_FORMAT_UNSPECIFIED Nilai tidak valid, format tidak boleh UNSPECIFIED.
JSON Notasi Objek JavaScript.
PROTO_TEXT Format teks Protocol Buffers. Lihat https://protobuf.dev/reference/protobuf/textformat-spec/

DistanceLimit

Batas yang menentukan jarak maksimum yang dapat ditempuh. Sinyalnya bisa keras atau lunak.

Jika batas yang dapat dilewati ditentukan, soft_max_meters dan cost_per_kilometer_above_soft_max harus ditentukan dan tidak negatif.

Kolom
max_meters

int64

Batas keras yang membatasi jarak maksimal_max_meters. Batasnya tidak boleh negatif.

soft_max_meters

int64

Batas lunak tidak menerapkan batas jarak maksimum, tetapi jika dilanggar, Anda akan dikenai biaya yang berjumlah total biaya lain yang ditentukan dalam model, dengan unit yang sama.

Jika soft_max_meters yang ditentukan harus kurang dari max_meters dan tidak boleh negatif.

cost_per_kilometer_above_soft_max

double

Biaya per kilometer yang dikenakan jika jarak melebihi batas soft_max_meters. Biaya tambahannya adalah 0 jika jarak berada di bawah batas, jika tidak, formula yang digunakan untuk menghitung biaya adalah sebagai berikut:

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

Biayanya tidak boleh negatif.

GcsDestination

Lokasi Google Cloud Storage tempat file output akan ditulis.

Kolom
uri

string

Wajib. URI Google Cloud Storage.

GcsSource

Lokasi Google Cloud Storage tempat file input akan dibaca.

Kolom
uri

string

Wajib. URI objek Google Cloud Storage dengan format gs://bucket/path/to/object.

InjectedSolutionConstraint

Solusi yang dimasukkan dalam permintaan termasuk informasi tentang kunjungan mana yang harus dibatasi dan bagaimana kunjungan tersebut harus dibatasi.

Kolom
routes[]

ShipmentRoute

Rute solusi yang akan diinjeksi. Beberapa rute mungkin dihilangkan dari solusi asli. Rute dan pengiriman yang dilewati harus memenuhi asumsi validitas dasar yang tercantum untuk injected_first_solution_routes.

skipped_shipments[]

SkippedShipment

Melewati pengiriman solusi yang akan dimasukkan. Beberapa solusi mungkin dihilangkan dari solusi asli. Lihat kolom routes.

constraint_relaxations[]

ConstraintRelaxation

Untuk nol kelompok kendaraan atau lebih, tentukan waktu dan frekuensi untuk melonggarkan batasan. Jika kolom ini kosong, semua rute kendaraan yang tidak kosong akan sepenuhnya dibatasi.

ConstraintRelaxation

Untuk grup kendaraan, tentukan pada batas minimum berapakah batasan kunjungan akan dilonggarkan dan pada tingkat mana. Pengiriman yang tercantum dalam kolom skipped_shipment dibatasi untuk dilewati; artinya, pengiriman tersebut tidak dapat dilakukan.

Kolom
relaxations[]

Relaxation

Semua relaksasi membatasi kunjungan yang akan berlaku untuk kunjungan pada rute dengan kendaraan di vehicle_indices.

vehicle_indices[]

int32

Menentukan indeks kendaraan yang menerapkan batasan kunjungan relaxations. Jika kosong, ini dianggap sebagai default dan relaxations berlaku untuk semua kendaraan yang tidak ditentukan di constraint_relaxations lainnya. Hanya boleh ada maksimal satu default, yaitu maksimal satu kolom relaksasi batasan diizinkan kosong vehicle_indices. Indeks kendaraan hanya dapat dicantumkan sekali, bahkan dalam beberapa constraint_relaxations.

Indeks kendaraan dipetakan sama seperti ShipmentRoute.vehicle_index, jika interpret_injected_solutions_using_labels bernilai benar (lihat komentar fields).

Relaksasi

Jika relaxations kosong, waktu mulai dan urutan semua kunjungan di routes akan sepenuhnya dibatasi dan tidak ada kunjungan baru yang dapat disisipkan atau ditambahkan ke rute tersebut. Selain itu, waktu mulai dan berakhir kendaraan di routes sepenuhnya dibatasi, kecuali jika kendaraan kosong (yaitu, tidak memiliki kunjungan dan memiliki used_if_route_is_empty yang ditetapkan ke salah pada model).

relaxations(i).level menentukan tingkat relaksasi batasan yang diterapkan pada kunjungan #j yang memenuhi:

  • route.visits(j).start_time >= relaxations(i).threshold_time DAN
  • j + 1 >= relaxations(i).threshold_visit_count

Demikian pula, start kendaraan akan dilonggarkan ke relaxations(i).level jika memenuhi:

  • vehicle_start_time >= relaxations(i).threshold_time DAN
  • relaxations(i).threshold_visit_count == 0 dan ujung kendaraan dilonggarkan menjadi relaxations(i).level jika memenuhi:
  • vehicle_end_time >= relaxations(i).threshold_time DAN
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

Untuk menerapkan tingkat relaksasi jika kunjungan memenuhi threshold_visit_count ATAU threshold_time, tambahkan dua relaxations dengan level yang sama: satu dengan hanya threshold_visit_count yang ditetapkan dan yang lainnya dengan threshold_time yang ditetapkan. Jika kunjungan memenuhi kondisi beberapa relaxations, tingkat yang paling longgar akan berlaku. Akibatnya, dari awal kendaraan hingga kunjungan rute hingga ke akhir kendaraan, tingkat relaksasi menjadi lebih santai: yaitu, tingkat relaksasi tidak menurun saat rute berlangsung.

Waktu dan urutan kunjungan rute yang tidak memenuhi ketentuan ambang batas relaxations sepenuhnya dibatasi dan tidak ada kunjungan yang dapat disisipkan ke dalam urutan ini. Selain itu, jika titik awal atau akhir kendaraan tidak memenuhi kondisi relaksasi apa pun, waktu akan tetap, kecuali jika kendaraan kosong.

Kolom
level

Level

Tingkat relaksasi batasan yang berlaku saat kondisi pada atau setelah threshold_time DAN setidaknya threshold_visit_count terpenuhi.

threshold_time

Timestamp

Waktu saat atau setelah relaksasi level dapat diterapkan.

threshold_visit_count

int32

Jumlah kunjungan saat atau setelah relaksasi level dapat diterapkan. Jika threshold_visit_count adalah 0 (atau tidak disetel), level dapat langsung diterapkan saat kendaraan dinyalakan.

Jika yang ditetapkan adalah route.visits_size() + 1, level hanya dapat diterapkan ke akhir kendaraan. Jika lebih dari route.visits_size() + 1, level tidak diterapkan sama sekali untuk rute tersebut.

Tingkat

Menunjukkan berbagai tingkat relaksasi batasan, yang diterapkan untuk kunjungan dan yang mengikuti saat memenuhi kondisi batas.

Enumerasi di bawah ini bertujuan untuk meningkatkan relaksasi.

Enum
LEVEL_UNSPECIFIED

Tingkat relaksasi default implisit: tidak ada batasan yang dilonggarkan, artinya, semua kunjungan sepenuhnya dibatasi.

Nilai ini tidak boleh digunakan secara eksplisit di level.

RELAX_VISIT_TIMES_AFTER_THRESHOLD Waktu mulai kunjungan dan waktu mulai/berakhir kendaraan akan santai, tetapi setiap kunjungan tetap terikat pada kendaraan yang sama dan urutan kunjungan harus diperhatikan: tidak ada kunjungan yang dapat disisipkan di antara keduanya atau sebelumnya.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD Sama seperti RELAX_VISIT_TIMES_AFTER_THRESHOLD, tetapi urutan kunjungan juga longgar: kunjungan tetap terikat dengan kendaraan mereka.
RELAX_ALL_AFTER_THRESHOLD Sama seperti RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD, tetapi kendaraan juga santai: kunjungan sepenuhnya gratis pada atau setelah waktu ambang batas dan berpotensi tidak dapat dilakukan.

InputConfig

Tentukan input untuk [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours].

Kolom
data_format

DataFormat

Wajib. Format data input.

Kolom union source. Wajib. source hanya ada berupa salah satu diantara berikut:
gcs_source

GcsSource

Lokasi Google Cloud Storage. Objek ini harus berupa objek tunggal (file).

Lokasi

Mengenkapsulasi lokasi (titik geografis, dan judul opsional).

Kolom
lat_lng

LatLng

Koordinat geografis titik jalan.

heading

int32

Judul kompas yang terkait dengan arah arus lalu lintas. Nilai ini digunakan untuk menentukan sisi jalan yang akan digunakan untuk pengambilan dan penurunan. Nilai arah dapat berkisar dari 0 hingga 360, di mana 0 menunjukkan arah tujuan Utara, 90 menunjukkan arah Timur, dll.

OptimizeToursRequest

Permintaan untuk diberikan kepada pemecah pengoptimalan tur yang menentukan model pengiriman yang akan dipecahkan, serta parameter pengoptimalannya.

Kolom
parent

string

Wajib. Targetkan project atau lokasi untuk melakukan panggilan.

Format: * projects/{project-id} * projects/{project-id}/locations/{location-id}

Jika tidak ada lokasi yang ditentukan, wilayah akan dipilih secara otomatis.

timeout

Duration

Jika waktu tunggu ini disetel, server akan menampilkan respons sebelum periode waktu tunggu berlalu atau batas waktu server untuk permintaan sinkron tercapai, mana saja yang lebih cepat.

Untuk permintaan asinkron, server akan membuat solusi (jika memungkinkan) sebelum waktu tunggu berlalu.

model

ShipmentModel

Model pengiriman yang harus diselesaikan.

solving_mode

SolvingMode

Secara default, mode penyelesaiannya adalah DEFAULT_SOLVE (0).

search_mode

SearchMode

Mode penelusuran yang digunakan untuk menyelesaikan permintaan.

injected_first_solution_routes[]

ShipmentRoute

Memandu algoritma pengoptimalan dalam menemukan solusi pertama yang mirip dengan solusi sebelumnya.

Model dibatasi saat solusi pertama dibuat. Setiap pengiriman yang tidak dilakukan di suatu rute secara implisit dilewati pada solusi pertama, tetapi pengiriman tersebut dapat dilakukan secara berturut-turut.

Solusi ini harus memenuhi beberapa asumsi validitas dasar:

  • untuk semua rute, vehicle_index harus berada dalam jangkauan dan tidak diduplikasi.
  • untuk semua kunjungan, shipment_index dan visit_request_index harus berada dalam rentang.
  • pengiriman hanya dapat dirujuk pada satu rute.
  • pengambilan dengan pengiriman dengan pengantaran harus dilakukan sebelum pengantaran.
  • tidak lebih dari satu alternatif pengambilan atau alternatif pengiriman yang dapat dilakukan.
  • untuk semua rute, waktu akan bertambah (misalnya, vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • pengiriman hanya dapat dilakukan dengan kendaraan yang diizinkan. Kendaraan diizinkan jika Shipment.allowed_vehicle_indices kosong atau vehicle_index miliknya disertakan dalam Shipment.allowed_vehicle_indices.

Jika solusi yang dimasukkan tidak memungkinkan, error validasi belum tentu ditampilkan dan error yang menunjukkan ketidaklayakan dapat ditampilkan.

injected_solution_constraint

InjectedSolutionConstraint

Membatasi algoritma pengoptimalan untuk menemukan solusi akhir yang mirip dengan solusi sebelumnya. Misalnya, perintah ini dapat digunakan untuk membekukan bagian rute yang telah selesai atau yang harus diselesaikan tetapi tidak boleh diubah.

Jika solusi yang dimasukkan tidak memungkinkan, error validasi belum tentu ditampilkan dan error yang menunjukkan ketidaklayakan dapat ditampilkan.

refresh_details_routes[]

ShipmentRoute

Jika tidak kosong, rute yang ditentukan akan diperbarui, tanpa mengubah urutan kunjungan atau waktu perjalanan yang mendasarinya: hanya detail lain yang akan diperbarui. Ini tidak menyelesaikan model.

Mulai 2020/11, kode ini hanya mengisi polyline rute yang tidak kosong dan mengharuskan populate_polylines bernilai benar (true).

Kolom route_polyline dari rute yang diteruskan mungkin tidak konsisten dengan rute transitions.

Kolom ini tidak boleh digunakan bersama dengan injected_first_solution_routes atau injected_solution_constraint.

Shipment.ignore dan Vehicle.ignore tidak berpengaruh pada perilaku tersebut. Polyline masih diisi di antara semua kunjungan di semua rute yang tidak kosong, terlepas dari apakah pengiriman atau kendaraan terkait diabaikan.

interpret_injected_solutions_using_labels

bool

Jika true (benar):

Penafsiran ini berlaku untuk kolom injected_first_solution_routes, injected_solution_constraint, dan refresh_details_routes. Solusi ini dapat digunakan jika indeks pengiriman atau kendaraan dalam permintaan telah berubah sejak solusi dibuat, mungkin karena pengiriman atau kendaraan telah dihapus dari atau ditambahkan ke permintaan.

Jika benar, label dalam kategori berikut harus muncul paling banyak sekali dalam kategorinya:

Jika vehicle_label dalam solusi yang dimasukkan tidak sesuai dengan kendaraan permintaan, rute yang sesuai akan dihapus dari solusi bersama dengan kunjungannya. Jika shipment_label dalam solusi yang dimasukkan tidak sesuai dengan pengiriman permintaan, kunjungan yang sesuai akan dihapus dari solusi. Jika SkippedShipment.label dalam solusi yang dimasukkan tidak sesuai dengan pengiriman permintaan, SkippedShipment akan dihapus dari solusi.

Menghapus kunjungan rute atau seluruh rute dari solusi yang dimasukkan dapat berpengaruh pada batasan tersirat, yang dapat menyebabkan perubahan pada solusi, error validasi, atau ketidaklayakan.

CATATAN: Pemanggil harus memastikan bahwa setiap Vehicle.label (respons Shipment.label) secara unik mengidentifikasi entity kendaraan (pengiriman responsif) yang digunakan di dua permintaan yang relevan: permintaan sebelumnya yang menghasilkan OptimizeToursResponse yang digunakan dalam solusi yang dimasukkan dan permintaan saat ini yang menyertakan solusi yang dimasukkan. Pemeriksaan keunikan yang dijelaskan di atas tidak cukup untuk menjamin persyaratan ini.

consider_road_traffic

bool

Pertimbangkan estimasi lalu lintas saat menghitung kolom ShipmentRoute Transition.travel_duration, Visit.start_time, dan vehicle_end_time; saat menetapkan kolom ShipmentRoute.has_traffic_infeasibilities, serta saat menghitung kolom OptimizeToursResponse.total_cost.

populate_polylines

bool

Jika true (benar), polyline akan diisi dalam ShipmentRoute respons.

populate_transition_polylines

bool

Jika true (benar), polyline akan diisi dalam ShipmentRoute.transitions respons.

allow_large_deadline_despite_interruption_risk

bool

Jika kebijakan ini disetel, permintaan dapat memiliki batas waktu (lihat https://grpc.io/blog/deadlines) hingga 60 menit. Jika tidak, batas waktu maksimum hanya 30 menit. Perlu diketahui bahwa permintaan yang telah berlangsung lama memiliki risiko gangguan yang lebih besar (tetapi masih kecil) secara signifikan.

use_geodesic_distances

bool

Jika benar, jarak perjalanan akan dihitung menggunakan jarak geodesi, bukan jarak Google Maps, dan waktu perjalanan akan dihitung menggunakan jarak geodesi dengan kecepatan yang ditentukan oleh geodesic_meters_per_second.

label

string

Label yang dapat digunakan untuk mengidentifikasi permintaan ini, dilaporkan kembali di OptimizeToursResponse.request_label.

geodesic_meters_per_second

double

Jika use_geodesic_distances bernilai benar (true), kolom ini harus ditetapkan dan menentukan kecepatan yang diterapkan untuk menghitung waktu perjalanan. Nilainya harus setidaknya 1,0 meter/detik.

max_validation_errors

int32

Memotong jumlah error validasi yang ditampilkan. Error ini biasanya dilampirkan ke payload error INVALID_ARGUMENT sebagai detail error BadRequest (https://cloud.google.com/apis/design/errors#error_details), kecuali jika solving_mode=VALIDATE_ONLY: lihat kolom OptimizeToursResponse.validation_errors. Nilai defaultnya adalah 100 dan dibatasi hingga 10.000.

SearchMode

Mode yang menentukan perilaku penelusuran, yang mengorbankan latensi versus kualitas solusi. Di semua mode, batas waktu permintaan global diterapkan.

Enum
SEARCH_MODE_UNSPECIFIED Mode penelusuran tidak ditentukan, setara dengan RETURN_FAST.
RETURN_FAST Hentikan penelusuran setelah menemukan solusi pertama yang tepat.
CONSUME_ALL_AVAILABLE_TIME Luangkan semua waktu yang tersedia untuk menelusuri solusi yang lebih baik.

SolvingMode

Menentukan cara pemecah masalah akan menangani permintaan. Di semua mode kecuali VALIDATE_ONLY, jika permintaan tidak valid, Anda akan menerima error INVALID_REQUEST. Lihat max_validation_errors untuk membatasi jumlah error yang ditampilkan.

Enum
DEFAULT_SOLVE Selesaikan modelnya.
VALIDATE_ONLY Hanya memvalidasi model tanpa menyelesaikannya: mengisi OptimizeToursResponse.validation_errors sebanyak mungkin.
DETECT_SOME_INFEASIBLE_SHIPMENTS

Hanya mengisi OptimizeToursResponse.validation_errors atau OptimizeToursResponse.skipped_shipments, dan tidak benar-benar menyelesaikan sisa permintaan (status dan routes tidak ditetapkan dalam respons). Jika terdeteksi infeksi di rute injected_solution_constraint, rute tersebut akan diisi di kolom OptimizeToursResponse.validation_errors dan OptimizeToursResponse.skipped_shipments akan dibiarkan kosong.

PENTING: tidak semua pengiriman yang tidak memungkinkan akan dikembalikan di sini, namun hanya pengiriman yang terdeteksi tidak memungkinkan selama pra-pemrosesan.

OptimizeToursResponse

Respons setelah menyelesaikan masalah pengoptimalan tur yang berisi rute yang diikuti oleh setiap kendaraan, pengiriman yang telah dilewati, dan biaya keseluruhan solusi.

Kolom
routes[]

ShipmentRoute

Rute dihitung untuk setiap kendaraan; rute ke-i sesuai dengan kendaraan ke-i pada model.

request_label

string

Salinan OptimizeToursRequest.label, jika label ditentukan dalam permintaan.

skipped_shipments[]

SkippedShipment

Daftar semua pengiriman dilewati.

validation_errors[]

OptimizeToursValidationError

Daftar semua error validasi yang dapat kami deteksi secara independen. Lihat penjelasan "MULTIPLE ERRORS" untuk pesan OptimizeToursValidationError.

metrics

Metrics

Metrik durasi, jarak, dan penggunaan untuk solusi ini.

Metrik

Metrik keseluruhan, yang digabungkan dari semua rute.

Kolom
aggregated_route_metrics

AggregatedMetrics

Digabungkan berdasarkan rute. Setiap metrik adalah jumlah (atau jumlah maksimum, untuk pemuatan) di seluruh kolom ShipmentRoute.metrics dengan nama yang sama.

skipped_mandatory_shipment_count

int32

Jumlah pengiriman wajib dilewati.

used_vehicle_count

int32

Jumlah kendaraan yang digunakan. Catatan: jika rute kendaraan kosong dan Vehicle.used_if_route_is_empty bernilai benar, kendaraan akan dianggap sebagai digunakan.

earliest_vehicle_start_time

Timestamp

Waktu mulai paling awal untuk kendaraan bekas, dihitung sebagai waktu minimum untuk semua kendaraan bekas ShipmentRoute.vehicle_start_time.

latest_vehicle_end_time

Timestamp

Waktu berakhir terbaru untuk kendaraan bekas, dihitung sebagai waktu berakhir maksimum untuk semua kendaraan bekas sebesar ShipmentRoute.vehicle_end_time.

costs

map<string, double>

Biaya solusi, dikelompokkan berdasarkan kolom permintaan terkait biaya. Kuncinya adalah jalur proto, relatif terhadap input OptimizeToursRequest, misalnya "model.shipments.pickups.cost", dan nilainya adalah total biaya yang dihasilkan oleh kolom biaya yang sesuai, yang digabungkan dari keseluruhan solusi. Dengan kata lain, biaya["model.shipments.pickups.cost"] adalah jumlah semua biaya pengambilan atas solusi tersebut. Semua biaya yang ditentukan dalam model dilaporkan secara mendetail di sini, kecuali biaya yang terkait dengan TransitionAttributes yang hanya dilaporkan secara agregat mulai 2022/01.

total_cost

double

Total biaya solusi. Jumlah semua nilai di peta biaya.

OptimizeToursValidationError

Menjelaskan error yang terjadi saat memvalidasi OptimizeToursRequest.

Kolom
code

int32

Error validasi ditentukan oleh pasangan (code, display_name) yang selalu ada.

Kolom lain (di bawah) memberikan konteks selengkapnya tentang error.

BEBERAPA KESALAHAN: Jika ada beberapa error, proses validasi akan mencoba menghasilkan beberapa error. Mirip seperti compiler, ini adalah proses yang tidak sempurna. Beberapa error validasi akan bersifat "fatal", yang berarti error tersebut menghentikan seluruh proses validasi. Hal ini antara lain berlaku untuk error display_name="UNSPECIFIED". Beberapa kesalahan mungkin menyebabkan proses validasi melewatkan kesalahan lainnya.

Stabilitas: code dan display_name harus sangat stabil. Namun, kode dan nama tampilan baru dapat muncul seiring waktu, yang dapat menyebabkan permintaan (tidak valid) tertentu untuk menghasilkan pasangan (code, display_name) yang berbeda karena error baru menyembunyikan yang lama (lihat "MULTIPLE KESALAHAN").

REFERENSI: Daftar semua pasangan (kode, nama):

  • TIDAK DITENTUKAN = 0;
  • VALIDATION_TIMEOUT_ERROR = 10; Validasi tidak dapat diselesaikan dalam batas waktu.
  • REQUEST_OPTIONS_ERROR = 12;

    • REQUEST_OPTIONS_INVALID_SOLVING_MODE = 1201;
    • REQUEST_OPTIONS_INVALID_MAX_VALIDATION_ERRORS = 1203;
    • REQUEST_OPTIONS_INVALID_GEODESIC_METERS_PER_SECOND = 1.204;
    • REQUEST_OPTIONS_GEODESIC_METERS_PER_SECOND_TOO_SMALL = 1.205;
    • REQUEST_OPTIONS_ kegunaan_GEODESIC_METERS_PER_SECOND = 1.206;
    • REQUEST_OPTIONS_POPULATE_PATHFINDER_tripS_AND_GEODESIC_LENGTH = 1.207;
    • REQUEST_OPTIONS_ tahun_MODEL_OPTIONS_AND_GEODESIC_DISTANCE = 1.208;
    • REQUEST_OPTIONS_TRAVEL_MODE_INCOMPATIBLE_WITH_TRAFFIC = 1211;
    • REQUEST_OPTIONS_MULTIPLE_TRAFFIC_FLAVORS = 1212;
    • REQUEST_OPTIONS_INVALID_TRAFFIC_FLAVOR = 1213;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITHOUT_GLOBAL_START_TIME = 1214;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITH_PRECEDENCES = 1215;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_MODE_INVALID = 1216;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_ENABLED_WITHOUT_TRAFFIC = 1217;
  • INJECTED_SOLUTION_ERROR = 20;
    • INJECTED_SOLUTION_TIDAK_MENYERTAKAN_LABEL = 2000;
    • INJECTED_SOLUTION_DUPLICATE_LABEL = 2001;
    • INJECTED_SOLUTION_AMBIGUOUS_INDEX = 2002;
    • INJECTED_SOLUTION_INFEASIBLE_After_GETTING_TRAVEL_TIMES = 2003;
    • INJECTED_SOLUTION_TRANSITION_INCONSISTENT_WITH_ACTUAL_TRAVEL = 2004;
    • INJECTED_SOLUTION_CONCURRENT_SOLUTION_TYPES = 2005;
    • INJECTED_SOLUTION_MORE_THAN_ONE_PER_TYPE = 2006;
    • INJECTED_SOLUTION_REFRESH_WITHOUT_POPULATE = 2008;
    • INJECTED_SOLUTION_CONStrainerED_ROUTE_PORTION_INFEASIBLE = 2010;
  • SHIPMENT_MODEL_ERROR = 22;
    • PENGIRIMAN_MODEL_TERLALU_BESAR = 2200;
    • SHIPMENT_MODEL_TOO_MANY_CAPACITY_TYPES = 2201;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_NEGATIVE_OR_NAN = 2202;
    • SHIPMENT_MODEL_GLOBAL_END_TIME_TOO_LARGE_OR_NAN = 2203;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_After_GLOBAL_END_TIME = 2.204;
    • SHIPMENT_MODEL_GLOBAL_DURATION_TOO_LONG = 2205;
    • SHIPMENT_MODEL_MAX_ACTIVE_VEHICLES_NOT_POSITIVE = 2206;
    • SHIPMENT_MODEL_DURATION_MATRIX_TOO_LARGE = 2207;
  • INDEX_ERROR = 24;
  • TAG_ERROR = 26;
  • TIME_WINDOW_ERROR = 28;
    • TIME_WINDOW_INVALID_START_TIME = 2800;
    • TIME_WINDOW_INVALID_END_TIME = 2801;
    • TIME_WINDOW_INVALID_SOFT_START_TIME = 2802;
    • TIME_WINDOW_INVALID_SOFT_END_TIME = 2803;
    • TIME_WINDOW_OUTSIDE_GLOBAL_TIME_WINDOW = 2804;
    • TIME_WINDOW_START_TIME_After_END_TIME = 2805;
    • TIME_WINDOW_INVALID_cost_PER_HOUR_BEFORE_SOFT_START_TIME = 2806;
    • TIME_WINDOW_INVALID_PRICE_PER_HOUR_After_SOFT_END_TIME = 2807;
    • TIME_WINDOW_PRICE_BEFORE_SOFT_START_TIME_WITHOUT_SOFT_START_TIME = 2808;
    • TIME_WINDOW_PRICE_Setelah_SOFT_END_TIME_WITHOUT_SOFT_END_TIME = 2809;
    • TIME_WINDOW_SOFT_START_TIME_WITHOUT_ tahun_BEFORE_SOFT_START_TIME = 2810;
    • TIME_WINDOW_SOFT_END_TIME_WITHOUT_ tahun_Setelah_SOFT_END_TIME = 2811;
    • TIME_WINDOW_OVERLAPPING_ADJACENT_OR_EARLIER_THAN_PREVIOUS = 2812;
    • TIME_WINDOW_START_TIME_After_SOFT_START_TIME = 2813;
    • TIME_WINDOW_SOFT_START_TIME_After_END_TIME = 2814;
    • TIME_WINDOW_START_TIME_Setelah_SOFT_END_TIME = 2815;
    • TIME_WINDOW_SOFT_END_TIME_Setelah_END_TIME = 2816;
    • TIME_WINDOW_PRICE_BEFORE_SOFT_START_TIME_SET_AND_MULTIPLE_WINDOWS = 2817;
    • TIME_WINDOW_ tahun_Setelah_SOFT_END_TIME_SET_AND_MULTIPLE_WINDOWS = 2818;
    • TRANSITION_ATTRIBUTES_ERROR = 30;
    • TRANSITION_ATTRIBUTES_INVALID_cost = 3.000;
    • TRANSITION_ATTRIBUTES_INVALID_cost_PER_KILOMETER = 3.001;
    • TRANSITION_ATTRIBUTES_DUPLICATE_TAG_PAIR = 3002;
    • TRANSITION_ATTRIBUTES_LENGTH_LIMIT_MAX_METERS_UNSUPPORTED = 3003;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_SOURCE_TAGS = 3.004;
    • TRANSITION_ATTRIBUTES_calendarING_SOURCE_TAGS_FIELDS = 3.005;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_DESTINATION_TAGS = 3006;
    • TRANSITION_ATTRIBUTES_PLAYLISTING_DESTINATION_TAGS_FIELDS = 3.007;
    • TRANSITION_ATTRIBUTES_threshold_DURATION_NEGATIVE_OR_NAN = 3008;
    • TRANSITION_ATTRIBUTES_DURATION_DURATION_EXCEEDS_GLOBAL_DURATION = 3.009;
  • AMOUNT_ERROR = 31;
    • AMOUNT_NEGATIVE_VALUE = 3100;
  • LOAD_LIMIT_ERROR = 33;
    • LOAD_LIMIT_INVALID_cost_ABOVE_SOFT_MAX = 3.303;
    • LOAD_LIMIT_SOFT_MAX_WITHOUT_cost_ABOVE_SOFT_MAX = 3304;
    • LOAD_LIMIT_Cost_ABOVE_SOFT_MAX_WITHOUT_SOFT_MAX = 3.305;
    • LOAD_LIMIT_NEGATIVE_SOFT_MAX = 3306;
    • LOAD_LIMIT_MIXED_DEMAND_TYPE = 3307;
    • LOAD_LIMIT_MAX_LOAD_NEGATIVE_VALUE = 3308;
    • LOAD_LIMIT_SOFT_MAX_ABOVE_MAX = 3.309;
  • INTERVAL_ERROR = 34;
    • INTERVAL_MIN_EXCEEDS_MAX = 3.401;
    • INTERVAL_NEGATIVE_MIN = 3402;
    • INTERVAL_NEGATIVE_MAX = 3403;
    • INTERVAL_MIN_EXCEEDS_CAPACITY = 3.404;
    • INTERVAL_MAX_EXCEEDS_CAPACITY = 3.405;
  • LENGTH_LIMIT_ERROR = 36;
    • DISTANCE_LIMIT_INVALID_cost_Setelah_SOFT_MAX = 3.601;
    • DISTANCE_LIMIT_SOFT_MAX_WITHOUT_Cost_After_SOFT_MAX = 3.602;
    • DISTANCE_LIMIT_cost_After_SOFT_MAX_WITHOUT_SOFT_MAX = 3.603;
    • DISTANCE_LIMIT_NEGATIVE_MAX = 3604;
    • LENGTH_LIMIT_NEGATIVE_SOFT_MAX = 3.605;
    • distance_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3.606;
  • DURATION_LIMIT_ERROR = 38;
    • DURATION_LIMIT_MAX_DURATION_NEGATIVE_OR_NAN = 3800;
    • DURATION_LIMIT_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3801;
    • DURATION_LIMIT_INVALID_CUSTOMER_PER_HOUR_ setelah_SOFT_MAX = 3.802;
    • DURATION_LIMIT_SOFT_MAX_WITHOUT_PRICE_Setelah_SOFT_MAX = 3.803;
    • DURATION_LIMIT_cost_After_SOFT_MAX_WITHOUT_SOFT_MAX = 3.804;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3805;
    • DURATION_LIMIT_INVALID_cost_Setelah_QUADRATIC_SOFT_MAX = 3.806;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_Cost_PER_Square_HOUR = 3807;
    • DURATION_LIMIT_ tahun_PER_Square_HOUR_WITHOUT_QUADRATIC_SOFT_MAX = 3808;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_MAX = 3.809;
    • DURATION_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3.810;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_LARGER_THAN_MAX = 3811;
    • DURATION_LIMIT_DISTINCT_BETWEEN_MAX_AND_QUADRATIC_SOFT_MAX_TOO_LARGE = 3.812;
    • DURATION_LIMIT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3.813;
    • DURATION_LIMIT_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3.814;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3815;
  • SHIPMENT_ERROR = 40;
    • SHIPMENT_PD_LIMIT_WITHOUT_PICKUP_AND_Delivery = 4014;
    • SHIPMENT_PD_AB4_DETOUR_LIMIT_DURATION_NEGATIVE_OR_NAN = 4.000;
    • SHIPMENT_PD_AB4_DETOUR_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4.001;
    • SHIPMENT_PD_RELATIVE_DETOUR_LIMIT_INVALID = 4015;
    • SHIPMENT_PD_DETOUR_LIMIT_AND_EXTRA_VISIT_DURATION = 4016;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_NEGATIVE_OR_NAN = 4002;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4.003;
    • SHIPMENT_EMPTY_SHIPMENT_TYPE = 4004;
    • SHIPMENT_NO_PICKUP_NO_ ditolak = 4005;
    • SHIPMENT_INVALID_PENALTY_Cost = 4.006;
    • SHIPMENT_ALLOWED_VEHICLE_INDEX_OUT_OF_BOUNDS = 4.007;
    • SHIPMENT_DUPLICATE_ALLOWED_VEHICLE_INDEX = 4008;
    • SHIPMENT_INCONSISTENT_cost_FOR_VEHICLE_SIZE_WITHOUT_INDEX = 4009;
    • SHIPMENT_INCONSISTENT_cost_FOR_VEHICLE_SIZE_WITH_INDEX = 4.010;
    • SHIPMENT_INVALID_PRICE_FOR_VEHICLE = 4011;
    • SHIPMENT_cost_FOR_VEHICLE_INDEX_OUT_OF_BOUNDS = 4.012;
    • SHIPMENT_DUPLICATE_cost_FOR_VEHICLE_INDEX = 4013;
  • VEHICLE_ERROR = 42;
    • VEHICLE_EMPTY_REQUIRED_OPERATOR_TYPE = 4200;
    • VEHICLE_DUPLICATE_REQUIRED_OPERATOR_TYPE = 4201;
    • VEHICLE_NO_OPERATOR_WITH_REQUIRED_OPERATOR_TYPE = 4202;
    • VEHICLE_EMPTY_START_TAG = 4203;
    • VEHICLE_DUPLICATE_START_TAG = 4204;
    • VEHICLE_EMPTY_END_TAG = 4205;
    • VEHICLE_DUPLICATE_END_TAG = 4206;
    • VEHICLE_EXTRA_VISIT_DURATION_NEGATIVE_OR_NAN = 4207;
    • VEHICLE_EXTRA_VISIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4.208;
    • VEHICLE_EXTRA_VISIT_DURATION_EMPTY_KEY = 4209;
    • VEHICLE_FIRST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4.210;
    • VEHICLE_FIRST_SHIPMENT_IGNORED = 4211;
    • VEHICLE_FIRST_SHIPMENT_NOT_BOUND = 4212;
    • VEHICLE_last_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4.213;
    • VEHICLE_last_SHIPMENT_IGNORED = 4214;
    • VEHICLE_last_SHIPMENT_NOT_BOUND = 4215;
    • VEHICLE_IGNORED_WITH_used_IF_ROUTE_IS_EMPTY = 4216;
    • VEHICLE_INVALID_cost_PER_KILOMETER = 4217;
    • VEHICLE_INVALID_cost_PER_HOUR = 4218;
    • VEHICLE_INVALID_cost_PER_TRAVELED_HOUR = 4219;
    • VEHICLE_INVALID_FIXED_cost = 4220;
    • VEHICLE_INVALID_TRAVEL_DURATION_MULTIPLE = 4221;
    • VEHICLE_TRAVEL_DURATION_MULTIPLE_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4.223;
    • VEHICLE_MATRIX_INDEX_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4224;
    • VEHICLE_MINIMUM_DURATION_LONGER_THAN_DURATION_LIMIT = 4222;
  • VISIT_REQUEST_ERROR = 44;
    • VISIT_REQUEST_EMPTY_TAG = 4400;
    • VISIT_REQUEST_DUPLICATE_TAG = 4401;
    • VISIT_REQUEST_DURATION_NEGATIVE_OR_NAN = 4404;
    • VISIT_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4.405;
  • PRECEDENCE_ERROR = 46;
  • BREAK_ERROR = 48;
    • BREAK_Rules_EMPTY = 4800;
    • BREAK_REQUEST_UNSPECIFIED_DURATION = 4801;
    • BREAK_REQUEST_UNSPECIFIED_EARLIEST_START_TIME = 4802;
    • BREAK_REQUEST_UNSPECIFIED_LATEST_START_TIME = 4803;
    • BREAK_REQUEST_DURATION_NEGATIVE_OR_NAN = 4804; = 4804;
    • BREAK_REQUEST_LATEST_START_TIME_BEFORE_EARLIEST_START_TIME = 4805;
    • BREAK_REQUEST_EARLIEST_START_TIME_BEFORE_GLOBAL_START_TIME = 4806;
    • BREAK_REQUEST_LATEST_END_TIME_After_GLOBAL_END_TIME = 4.807;
    • BREAK_REQUEST_NON_SCHEDULABLE = 4808;
    • BREAK_Frequency_MAX_INTER_BREAK_DURATION_NEGATIVE_OR_NAN = 4809;
    • BREAK_Frequency_MIN_BREAK_DURATION_NEGATIVE_OR_NAN = 4.810;
    • BREAK_Frequency_MIN_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4.811;
    • BREAK_Frequency_MAX_INTER_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4.812;
    • BREAK_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4.813;
    • BREAK_Frequency_EXIST_MAX_INTER_BREAK_DURATION = 4814;
    • BREAK_Frekuensi_TIDAK_MENYERTAKAN_MIN_BREAK_DURATION = 4.815;
  • SHIPMENT_TYPE_INCOMPATIBILITY_ERROR = 50;
    • SHIPMENT_TYPE_INCOMPATIBILITY_EMPTY_TYPE = 5.001;
    • SHIPMENT_TYPE_INCOMPATIBILITY_LESS_THAN_TWO_TYPES = 5.002;
    • SHIPMENT_TYPE_INCOMPATIBILITY_DUPLICATE_TYPE = 5.003;
    • MODE_JENIS_INCOMPATIBILITY_TIDAK_TIDAK_VALID = 5004;
    • SHIPMENT_TYPE_INCOMPATIBILITY_TOO_MANY_INCOMPATIBILITIES = 5.005;
  • SHIPMENT_TYPE_REQUIREMENT_ERROR = 52;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE = 52001;
    • SHIPMENT_TYPE_REQUIREMENT_NO_DEPENDENT_TYPE = 52.002;
    • SHIPMENT_TYPE_REQUIREMENT_INVALID_REQUIREMENT_MODE = 52003;
    • SHIPMENT_TYPE_REQUIREMENT_TOO_MANY_REQUIREMENTS = 52004;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_REQUIRED_TYPE = 52005;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_REQUIRED_TYPE = 52006;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE_FOUND = 52.007;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_DEPENDENT_TYPE = 52.008;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_DEPENDENT_TYPE = 52.009;
    • SHIPMENT_TYPE_REQUIREMENT_SELF_DEPENDENT_TYPE = 52.010;
    • SHIPMENT_TYPE_REQUIREMENT_GRAPH_HAS_CYCLES = 52011;
  • VEHICLE_OPERATOR_ERROR = 54;
    • VEHICLE_OPERATOR_EMPTY_TYPE = 5.400;
    • VEHICLE_OPERATOR_MULTIPLE_START_TIME_WINDOWS = 5401;
    • VEHICLE_OPERATOR_SOFT_START_TIME_WINDOW = 5402;
    • VEHICLE_OPERATOR_MULTIPLE_END_TIME_WINDOWS = 5403;
    • VEHICLE_OPERATOR_SOFT_END_TIME_WINDOW = 5404;
  • DURATION_SECONDS_MATRIX_ERROR = 56;
    • DURATION_SECONDS_MATRIX_DURATION_NEGATIVE_OR_NAN = 5.600;
    • DURATION_SECONDS_MATRIX_DURATION_EXCEEDS_GLOBAL_DURATION = 5.601;
display_name

string

Nama tampilan error.

fields[]

FieldReference

Konteks error dapat melibatkan 0, 1 (sering kali) atau beberapa kolom. Misalnya, mengacu pada kendaraan #4 dan pengambilan pertama pengiriman #2 dapat dilakukan sebagai berikut:

fields { name: "vehicles" index: 4}
fields { name: "shipments" index: 2 sub_field {name: "pickups" index: 0} }

Namun, perlu diperhatikan bahwa kardinalitas fields tidak boleh berubah untuk kode error tertentu.

error_message

string

String yang menjelaskan error dan dapat dibaca manusia. Ada pemetaan 1:1 antara code dan error_message (jika kode != "UNSPECIFIED").

Stabilitas: Tidak stabil: pesan error yang terkait dengan code tertentu dapat berubah (semoga dapat memperjelasnya) dari waktu ke waktu. Sebagai gantinya, gunakan display_name dan code.

offending_values

string

Dapat berisi nilai kolom. Fitur ini tidak selalu tersedia. Anda tidak boleh mengandalkannya dan hanya menggunakannya untuk proses debug model manual.

FieldReference

Menentukan konteks untuk error validasi. FieldReference selalu merujuk pada kolom tertentu dalam file ini dan mengikuti struktur hierarki yang sama. Misalnya, kami dapat menentukan elemen #2 dari start_time_windows kendaraan #5 menggunakan:

name: "vehicles" index: 5 sub_field { name: "end_time_windows" index: 2 }

Namun, kami menghilangkan entity level teratas seperti OptimizeToursRequest atau ShipmentModel untuk menghindari pesan berdesakan.

Kolom
name

string

Nama kolom, misalnya, "kendaraan".

sub_field

FieldReference

Sub-kolom bertingkat secara rekursif, jika diperlukan.

Kolom union index_or_key.

index_or_key hanya dapat berupa salah satu dari yang berikut:

index

int32

Indeks kolom jika diulang.

key

string

Kunci jika kolom adalah peta.

OutputConfig

Tentukan tujuan untuk hasil [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours].

Kolom
data_format

DataFormat

Wajib. Format data output.

Kolom union destination. Wajib. destination hanya ada berupa salah satu diantara berikut:
gcs_destination

GcsDestination

Lokasi Google Cloud Storage yang akan menjadi tujuan penulisan output.

Pengiriman

Pengiriman satu item, dari salah satu pengambilannya hingga salah satu pengirimannya. Agar pengiriman dianggap dilakukan, kendaraan unik harus mengunjungi salah satu lokasi pengambilannya (dan mengurangi kapasitas cadangannya), lalu mengunjungi salah satu lokasi pengirimannya di kemudian hari (dan oleh karena itu meningkatkan kembali kapasitas cadangannya sesuai).

Kolom
display_name

string

Nama tampilan pengiriman yang ditentukan pengguna. Panjang teks dapat mencapai 63 karakter dan dapat menggunakan karakter UTF-8.

pickups[]

VisitRequest

Kumpulan alternatif pengambilan yang terkait dengan pengiriman. Jika tidak ditentukan, kendaraan hanya perlu mengunjungi lokasi yang sesuai dengan pengiriman.

deliveries[]

VisitRequest

Kumpulan alternatif pengiriman yang terkait dengan pengiriman. Jika tidak ditentukan, kendaraan hanya perlu mengunjungi lokasi yang sesuai dengan pengambilan.

load_demands

map<string, Load>

Memuat permintaan pengiriman (misalnya berat, volume, jumlah palet, dll.). Kunci dalam peta harus berupa ID yang menjelaskan jenis beban yang sesuai, idealnya juga menyertakan unit. Misalnya: "weight_kg", "volume_gallons", "pallet_count", dll. Jika kunci yang diberikan tidak muncul di peta, beban yang sesuai dianggap sebagai null.

allowed_vehicle_indices[]

int32

Kumpulan kendaraan yang dapat melakukan pengiriman ini. Jika kosong, semua kendaraan dapat melakukannya. Kendaraan diberikan berdasarkan indeksnya dalam daftar vehicles ShipmentModel.

costs_per_vehicle[]

double

Menentukan biaya yang timbul saat pengiriman ini dikirimkan oleh setiap kendaraan. Jika ditentukan, ID harus memiliki SALAH SATU:

  • jumlah elemen yang sama dengan costs_per_vehicle_indices. costs_per_vehicle[i] sesuai dengan kendaraan costs_per_vehicle_indices[i] dari model.
  • jumlah elemen yang sama dengan adanya kendaraan dalam model. Elemen ke-i sesuai dengan kendaraan #i pada model.

Biaya ini harus berada dalam unit yang sama dengan penalty_cost dan tidak boleh negatif. Kosongkan kolom ini, jika tidak ada biaya tersebut.

costs_per_vehicle_indices[]

int32

Indeks kendaraan tempat costs_per_vehicle berlaku. Jika tidak kosong, nilai elemen harus sama dengan costs_per_vehicle. Indeks kendaraan tidak boleh ditentukan lebih dari sekali. Jika kendaraan dikecualikan dari costs_per_vehicle_indices, biayanya adalah nol.

pickup_to_delivery_absolute_detour_limit

Duration

Menentukan waktu putar balik absolut maksimum dibandingkan dengan jalur terpendek dari pengambilan hingga pengantaran. Jika ditentukan, ID ini harus positif, dan pengiriman harus berisi setidaknya layanan pengambilan dan pengantaran.

Misalnya, t menjadi waktu tersingkat yang dibutuhkan untuk beralih dari alternatif pengambilan yang dipilih langsung ke alternatif pengiriman yang dipilih. Kemudian, menyetel pickup_to_delivery_absolute_detour_limit akan menerapkan:

start_time(delivery) - start_time(pickup) <=
t + pickup_to_delivery_absolute_detour_limit

Jika batas relatif dan absolut ditentukan pada pengiriman yang sama, batas yang lebih ketat akan digunakan untuk setiap kemungkinan pasangan pengambilan/pengiriman. Mulai tahun 2017/10, putar balik hanya didukung jika durasi perjalanan tidak bergantung pada kendaraan.

pickup_to_delivery_time_limit

Duration

Menentukan durasi maksimum dari awal pengambilan hingga awal pengiriman pengiriman. Jika ditentukan, ID ini harus positif, dan pengiriman harus berisi setidaknya layanan pengambilan dan pengantaran. Hal ini tidak bergantung pada alternatif yang dipilih untuk pengambilan dan pengiriman, atau kecepatan kendaraan. Nilai ini dapat ditentukan di samping batasan putar balik maksimum: solusi akan mengikuti kedua spesifikasi tersebut.

shipment_type

string

String tidak kosong yang menentukan "jenis" untuk pengiriman ini. Fitur ini dapat digunakan untuk menentukan inkompatibilitas atau persyaratan antara shipment_types (lihat shipment_type_incompatibilities dan shipment_type_requirements di ShipmentModel).

Berbeda dari visit_types yang ditentukan untuk satu kunjungan: Semua pengambilan/pengiriman dari pengiriman yang sama memiliki shipment_type yang sama.

label

string

Menentukan label untuk pengiriman ini. Label ini dilaporkan dalam respons dalam shipment_label dari ShipmentRoute.Visit yang sesuai.

ignore

bool

Jika benar, lewati pengiriman ini, tetapi jangan terapkan penalty_cost.

Mengabaikan pengiriman akan menghasilkan error validasi jika ada shipment_type_requirements dalam model.

Mengabaikan pengiriman yang dilakukan di injected_first_solution_routes atau injected_solution_constraint diizinkan; pemecah masalah menghapus kunjungan pengambilan/pengiriman terkait dari rute penjualan. precedence_rules pengiriman yang mengabaikan referensi tersebut juga akan diabaikan.

penalty_cost

double

Jika pengiriman tidak selesai, penalti ini akan ditambahkan ke biaya keseluruhan rute. Pengiriman dianggap selesai jika salah satu alternatif pengambilan dan pengantaran dikunjungi. Biaya dapat dinyatakan dalam unit yang sama yang digunakan untuk semua kolom terkait biaya lainnya dalam model dan harus positif.

PENTING: Jika penalti ini tidak ditentukan, maka dianggap tidak terbatas, yaitu pengiriman harus diselesaikan.

pickup_to_delivery_relative_detour_limit

double

Menentukan waktu putar balik relatif maksimum dibandingkan dengan jalur terpendek dari pengambilan hingga pengantaran. Jika ditentukan, ID ini harus positif, dan pengiriman harus berisi setidaknya layanan pengambilan dan pengantaran.

Misalnya, t menjadi waktu tersingkat yang dibutuhkan untuk beralih dari alternatif pengambilan yang dipilih langsung ke alternatif pengiriman yang dipilih. Kemudian, menyetel pickup_to_delivery_relative_detour_limit akan menerapkan:

start_time(delivery) - start_time(pickup) <=
std::ceil(t * (1.0 + pickup_to_delivery_relative_detour_limit))

Jika batas relatif dan absolut ditentukan pada pengiriman yang sama, batas yang lebih ketat akan digunakan untuk setiap kemungkinan pasangan pengambilan/pengiriman. Mulai tahun 2017/10, putar balik hanya didukung jika durasi perjalanan tidak bergantung pada kendaraan.

Muat

Saat melakukan kunjungan, jumlah yang telah ditentukan mungkin ditambahkan ke beban kendaraan jika berupa pengambilan, atau dikurangi jika layanan tersebut merupakan pengiriman. Pesan ini menjelaskan jumlah tersebut. Lihat load_demands.

Kolom
amount

int64

Jumlah beban kendaraan yang melakukan kunjungan yang sesuai akan bervariasi. Karena berupa bilangan bulat, pengguna disarankan untuk memilih unit yang sesuai untuk menghindari hilangnya presisi. Harus ≥ 0.

VisitRequest

Permintaan kunjungan yang dapat dilakukan dengan kendaraan: memiliki geolokasi (atau dua, lihat di bawah), waktu buka dan tutup yang diwakili oleh jangka waktu, dan waktu durasi layanan (waktu yang dihabiskan oleh kendaraan saat tiba untuk mengambil atau menurunkan barang).

Kolom
arrival_location

LatLng

Lokasi geografis tempat kendaraan tiba saat melakukan VisitRequest ini. Jika model pengiriman memiliki matriks jarak durasi, arrival_location tidak boleh ditentukan.

arrival_waypoint

Waypoint

Titik jalan tempat kendaraan tiba saat melakukan VisitRequest ini. Jika model pengiriman memiliki matriks jarak durasi, arrival_waypoint tidak boleh ditentukan.

departure_location

LatLng

Lokasi geografis tempat kendaraan berangkat setelah menyelesaikan VisitRequest ini. Dapat dihapus jika sama dengan arrival_location. Jika model pengiriman memiliki matriks jarak durasi, departure_location tidak boleh ditentukan.

departure_waypoint

Waypoint

Titik jalan kendaraan berangkat setelah menyelesaikan VisitRequest ini. Dapat dihapus jika sama dengan arrival_waypoint. Jika model pengiriman memiliki matriks jarak durasi, departure_waypoint tidak boleh ditentukan.

tags[]

string

Menentukan tag yang disertakan pada permintaan kunjungan. String kosong atau duplikat tidak diizinkan.

time_windows[]

TimeWindow

Jendela waktu yang membatasi waktu kedatangan pada suatu kunjungan. Perhatikan bahwa kendaraan dapat berangkat di luar jangka waktu kedatangan. Dengan kata lain, waktu kedatangan + durasi tidak harus berada dalam jangka waktu kedatangan. Hal ini dapat menyebabkan waktu tunggu jika kendaraan tiba sebelum TimeWindow.start_time.

Tidak adanya TimeWindow berarti kendaraan dapat melakukan kunjungan ini kapan saja.

Jendela waktu harus terpisah, artinya tidak ada jangka waktu yang harus tumpang tindih atau berdekatan dengan yang lain, dan harus dalam urutan yang meningkat.

cost_per_hour_after_soft_end_time dan soft_end_time hanya dapat disetel jika ada satu jangka waktu.

duration

Duration

Durasi kunjungan, yaitu waktu yang dihabiskan oleh kendaraan antara kedatangan dan keberangkatan (ditambahkan ke kemungkinan waktu tunggu; lihat time_windows).

cost

double

Biaya untuk melayani permintaan kunjungan ini di rute kendaraan. Paket ini dapat digunakan untuk membayar biaya yang berbeda untuk setiap pengambilan atau pengiriman alternatif dari suatu pengiriman. Biaya ini harus berada dalam unit yang sama dengan Shipment.penalty_cost dan tidak boleh negatif.

load_demands

map<string, Load>

Memuat permintaan dari permintaan kunjungan ini. Kolom ini sama seperti kolom Shipment.load_demands, kecuali bahwa kolom ini hanya berlaku untuk VisitRequest ini, bukan seluruh Shipment. Permintaan yang tercantum di sini ditambahkan ke permintaan yang tercantum di Shipment.load_demands.

visit_types[]

string

Menentukan jenis kunjungan. Informasi ini dapat digunakan untuk mengalokasikan waktu tambahan yang diperlukan oleh kendaraan untuk menyelesaikan kunjungan ini (lihat Vehicle.extra_visit_duration_for_visit_type).

Jenis hanya dapat muncul sekali.

label

string

Menentukan label untuk VisitRequest ini. Label ini dilaporkan dalam respons sebagai visit_label dalam ShipmentRoute.Visit yang sesuai.

ShipmentModel

Model pengiriman berisi satu set pengiriman yang harus dilakukan oleh satu set kendaraan, sekaligus meminimalkan biaya keseluruhan, yaitu jumlah dari:

  • biaya pemilihan rute kendaraan (jumlah biaya per total waktu, biaya per waktu perjalanan, dan biaya tetap untuk semua kendaraan).
  • penalti pengiriman yang tidak dilakukan.
  • biaya durasi global pengiriman
Kolom
shipments[]

Shipment

Kumpulan pengiriman yang harus dilakukan dalam model.

vehicles[]

Vehicle

Kumpulan kendaraan yang dapat digunakan untuk melakukan kunjungan.

global_start_time

Timestamp

Waktu mulai dan berakhir global model: tidak ada waktu di luar rentang ini yang dapat dianggap valid.

Rentang waktu model harus kurang dari satu tahun, yaitu global_end_time dan global_start_time harus berada dalam 31536000 detik satu sama lain.

Saat menggunakan kolom cost_per_*hour, Anda dapat menyetel periode ini ke interval yang lebih kecil untuk meningkatkan performa (misalnya, jika Anda membuat model satu hari, Anda harus menetapkan batas waktu global ke hari tersebut). Jika tidak disetel, 00:00:00 UTC, 1 Januari 1970 (yaitu detik: 0, nano: 0) akan digunakan sebagai default.

global_end_time

Timestamp

Jika tidak disetel, 00:00:00 UTC, 1 Januari 1971 (yaitu detik: 31536000, nanos: 0) akan digunakan sebagai default.

global_duration_cost_per_hour

double

"Durasi global" dari keseluruhan rencana adalah perbedaan antara waktu mulai efektif paling awal dan waktu berakhir efektif terbaru dari semua kendaraan. Pengguna dapat menetapkan biaya per jam untuk kuantitas tersebut, misalnya, untuk mencoba dan mengoptimalkan penyelesaian tugas paling awal. Biaya ini harus berada dalam unit yang sama dengan Shipment.penalty_cost.

duration_distance_matrices[]

DurationDistanceMatrix

Menentukan matriks durasi dan jarak yang digunakan dalam model. Jika kolom ini kosong, Google Maps atau jarak geodesi akan digunakan, bergantung pada nilai kolom use_geodesic_distances. Jika tidak kosong, use_geodesic_distances tidak boleh benar dan duration_distance_matrix_src_tags atau duration_distance_matrix_dst_tags tidak boleh kosong.

Contoh penggunaan:

  • Ada dua lokasi: locA dan locB.
  • 1 kendaraan memulai rutenya di locA dan mengakhirinya di locA.
  • 1 permintaan kunjungan pengambilan di locB.
model {
  vehicles { start_tags: "locA"  end_tags: "locA" }
  shipments { pickups { tags: "locB" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_dst_tags: "locA"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • Ada tiga lokasi: locA, locB, dan locC.
  • 1 kendaraan memulai rutenya di locA dan mengakhirinya di locB, menggunakan matriks "cepat".
  • 1 kendaraan memulai rutenya di lokb dan mengakhirinya di lokB, menggunakan matriks "lambat".
  • 1 kendaraan memulai rutenya di lokB dan mengakhirinya di lokB, menggunakan matriks "cepat".
  • 1 permintaan kunjungan pengambilan di locC.
model {
  vehicles { start_tags: "locA" end_tags: "locB" start_tags: "fast" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "slow" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "fast" }
  shipments { pickups { tags: "locC" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_src_tags: "locC"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrix_dst_tags: "locC"
  duration_distance_matrices {
    vehicle_start_tag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  duration_distance_matrices {
    vehicle_start_tag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
duration_distance_matrix_src_tags[]

string

Tag yang menentukan sumber matriks durasi dan jarak; duration_distance_matrices(i).rows(j) menentukan durasi dan jarak dari kunjungan dengan tag duration_distance_matrix_src_tags(j) ke kunjungan lain dalam matriks i.

Tag sesuai dengan VisitRequest.tags atau Vehicle.start_tags. VisitRequest atau Vehicle yang ditentukan harus cocok persis dengan satu tag di kolom ini. Perhatikan bahwa tag sumber, tujuan, dan matriks Vehicle mungkin sama; tag sumber dan tujuan VisitRequest mungkin sama. Semua tag harus berbeda dan tidak boleh berupa string kosong. Jika kolom ini tidak kosong, duration_distance_matrices wajib diisi.

duration_distance_matrix_dst_tags[]

string

Tag yang menentukan tujuan matriks durasi dan jarak; duration_distance_matrices(i).rows(j).durations(k) (resp. duration_distance_matrices(i).rows(j).meters(k)) menentukan durasi (resp. jarak) perjalanan dari kunjungan dengan tag duration_distance_matrix_src_tags(j) hingga kunjungan dengan tag duration_distance_matrix_dst_tags(k) dalam matriks i.

Tag sesuai dengan VisitRequest.tags atau Vehicle.start_tags. VisitRequest atau Vehicle yang ditentukan harus cocok persis dengan satu tag di kolom ini. Perhatikan bahwa tag sumber, tujuan, dan matriks Vehicle mungkin sama; tag sumber dan tujuan VisitRequest mungkin sama. Semua tag harus berbeda dan tidak boleh berupa string kosong. Jika kolom ini tidak kosong, duration_distance_matrices wajib diisi.

transition_attributes[]

TransitionAttributes

Atribut transisi ditambahkan ke model.

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

Kumpulan pengiriman_types yang tidak kompatibel (lihat ShipmentTypeIncompatibility).

shipment_type_requirements[]

ShipmentTypeRequirement

Kumpulan persyaratan shipment_type (lihat ShipmentTypeRequirement).

precedence_rules[]

PrecedenceRule

Kumpulan aturan prioritas yang harus diterapkan dalam model.

max_active_vehicles

int32

Membatasi jumlah maksimum kendaraan aktif. Kendaraan tetap aktif jika rutenya melakukan setidaknya satu pengiriman. Solusi ini dapat digunakan untuk membatasi jumlah rute jika jumlah pengemudi lebih sedikit daripada kendaraan dan armada kendaraannya heterogen. Pengoptimalan tersebut kemudian akan memilih subset kendaraan terbaik untuk digunakan. Harus benar-benar positif.

DurationDistanceMatrix

Menentukan matriks durasi dan jarak dari lokasi kunjungan dan awal kendaraan yang akan dikunjungi dan lokasi akhir kendaraan.

Kolom
rows[]

Row

Menentukan baris matriks durasi dan jarak. Elemen ini harus memiliki sebanyak ShipmentModel.duration_distance_matrix_src_tags.

vehicle_start_tag

string

Tag yang menentukan kendaraan mana yang menggunakan matriks jarak dan durasi ini. Jika kosong, ini berlaku untuk semua kendaraan, dan hanya boleh ada satu matriks.

Setiap start kendaraan harus sama persis dengan satu matriks, yaitu tepat satu dari kolom start_tags-nya harus cocok dengan vehicle_start_tag matriks (dan hanya dari matriks tersebut).

Semua matriks harus memiliki vehicle_start_tag yang berbeda.

Baris

Menentukan baris matriks durasi dan jarak.

Kolom
durations[]

Duration

Nilai durasi untuk baris tertentu. Elemen ini harus memiliki sebanyak ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

double

Nilai jarak untuk baris tertentu. Jika tidak ada biaya atau batasan yang merujuk pada jarak dalam model, nilai ini dapat dibiarkan kosong; jika tidak, model harus memiliki sebanyak durations elemen.

PrecedenceRule

Aturan prioritas antara dua peristiwa (setiap peristiwa adalah pengambilan atau pengiriman pengiriman): peristiwa "kedua" harus dimulai setidaknya offset_duration setelah "pertama" dimulai.

Beberapa prioritas dapat merujuk ke peristiwa yang sama (atau terkait), misalnya, "pengambilan B terjadi setelah pengiriman A" dan "pengambilan C terjadi setelah pengambilan B".

Selain itu, prioritas hanya berlaku jika kedua pengiriman dilakukan dan jika tidak, diabaikan.

Kolom
first_is_delivery

bool

Menunjukkan apakah peristiwa "pertama" adalah pengiriman.

second_is_delivery

bool

Menunjukkan apakah peristiwa "kedua" adalah pengiriman.

offset_duration

Duration

Offset antara peristiwa "pertama" dan "kedua". Bisa negatif.

first_index

int32

Indeks pengiriman peristiwa "pertama". Kolom ini harus ditentukan.

second_index

int32

Indeks pengiriman peristiwa "kedua". Kolom ini harus ditentukan.

ShipmentRoute

Rute kendaraan dapat diuraikan, di sepanjang sumbu waktu, seperti ini (kami berasumsi ada n kunjungan):

  |            |            |          |       |  T[2], |        |      |
  | Transition |  Visit #0  |          |       |  V[2], |        |      |
  |     #0     |    aka     |   T[1]   |  V[1] |  ...   | V[n-1] | T[n] |
  |  aka T[0]  |    V[0]    |          |       | V[n-2],|        |      |
  |            |            |          |       | T[n-1] |        |      |
  ^            ^            ^          ^       ^        ^        ^      ^
vehicle    V[0].start   V[0].end     V[1].   V[1].    V[n].    V[n]. vehicle
 start     (arrival)   (departure)   start   end      start    end     end

Perhatikan bahwa kami membuat perbedaan antara:

  • "peristiwa tepat waktu", seperti awal dan akhir kendaraan serta awal dan akhir setiap kunjungan (alias kedatangan dan keberangkatan). Terjadi pada detik tertentu.
  • "interval waktu", seperti kunjungan itu sendiri, dan transisi antar kunjungan. Meskipun interval waktu terkadang dapat memiliki durasi nol, yaitu dimulai dan berakhir pada detik yang sama, interval waktu sering kali memiliki durasi positif.

Invarian:

  • Jika ada n kunjungan, berarti terdapat transisi n+1.
  • Kunjungan selalu dikelilingi oleh transisi sebelum (indeks yang sama) dan transisi setelahnya (indeks + 1).
  • Awal kendaraan selalu diikuti dengan transisi #0.
  • Bagian akhir kendaraan selalu didahului oleh transisi #n.

Memperbesar, berikut adalah hal yang terjadi selama Transition dan Visit:

---+-------------------------------------+-----------------------------+-->
   |           TRANSITION[i]             |           VISIT[i]          |
   |                                     |                             |
   |  * TRAVEL: the vehicle moves from   |      PERFORM the visit:     |
   |    VISIT[i-1].departure_location to |                             |
   |    VISIT[i].arrival_location, which |  * Spend some time:         |
   |    takes a given travel duration    |    the "visit duration".    |
   |    and distance                     |                             |
   |                                     |  * Load or unload           |
   |  * BREAKS: the driver may have      |    some quantities from the |
   |    breaks (e.g. lunch break).       |    vehicle: the "demand".   |
   |                                     |                             |
   |  * WAIT: the driver/vehicle does    |                             |
   |    nothing. This can happen for     |                             |
   |    many reasons, for example when   |                             |
   |    the vehicle reaches the next     |                             |
   |    event's destination before the   |                             |
   |    start of its time window         |                             |
   |                                     |                             |
   |  * DELAY: *right before* the next   |                             |
   |    arrival. E.g. the vehicle and/or |                             |
   |    driver spends time unloading.    |                             |
   |                                     |                             |
---+-------------------------------------+-----------------------------+-->
   ^                                     ^                             ^
V[i-1].end                           V[i].start                    V[i].end

Terakhir, berikut ini cara PERJALANAN, JEDA, TUNDA, dan WAIT dapat diatur selama transisi.

  • Mereka tidak tumpang tindih.
  • Currents bersifat unik dan harus berupa jangka waktu yang berurutan tepat sebelum kunjungan berikutnya (atau waktu berakhir kendaraan). Dengan demikian, Anda cukup mengetahui durasi keterlambatan untuk mengetahui waktu mulai dan waktu berakhirnya.
  • BREAKS adalah periode waktu yang berurutan dan tidak tumpang-tindih. Respons menentukan waktu mulai dan durasi setiap jeda.
  • PERJALANAN dan WAIT "dapat di-preempt": keduanya dapat terganggu beberapa kali selama transisi ini. Klien dapat berasumsi bahwa perjalanan terjadi "sesegera mungkin" dan "menunggu" mengisi sisa waktu.

Contoh (kompleks):

                               TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
  ||     |       |           |       |           |         |         ||
  ||  T  |   B   |     T     |       |     B     |         |    D    ||
  ||  r  |   r   |     r     |   W   |     r     |    W    |    e    ||
  ||  a  |   e   |     a     |   a   |     e     |    a    |    l    ||
  ||  v  |   a   |     v     |   i   |     a     |    i    |    a    ||
  ||  e  |   k   |     e     |   t   |     k     |    t    |    y    ||
  ||  l  |       |     l     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
Kolom
vehicle_index

int32

Kendaraan yang melakukan rute, yang diidentifikasi dengan indeksnya di sumber ShipmentModel.

vehicle_label

string

Label kendaraan yang melakukan rute ini, sama dengan ShipmentModel.vehicles(vehicle_index).label, jika ditentukan.

vehicle_start_time

Timestamp

Waktu saat kendaraan memulai rutenya.

vehicle_end_time

Timestamp

Waktu saat kendaraan menyelesaikan rutenya.

visits[]

Visit

Urutan kunjungan yang diurutkan mewakili rute. kunjungan[i] adalah kunjungan ke-i dalam rute. Jika kolom ini kosong, kendaraan dianggap tidak digunakan.

transitions[]

Transition

Daftar transisi yang diurutkan untuk rute.

has_traffic_infeasibilities

bool

Jika OptimizeToursRequest.consider_road_traffic disetel ke benar (true), kolom ini menunjukkan bahwa inkonsistensi dalam waktu rute diprediksi menggunakan perkiraan durasi perjalanan berbasis lalu lintas. Waktu untuk menyelesaikan perjalanan yang disesuaikan lalu lintas, keterlambatan, dan jeda antar kunjungan mungkin tidak cukup, sebelum kunjungan pertama, atau setelah kunjungan terakhir, sambil tetap memenuhi periode kunjungan dan waktu kendaraan. Misalnya,

  start_time(previous_visit) + duration(previous_visit) +
  travel_duration(previous_visit, next_visit) > start_time(next_visit)

Kedatangan pada next_visit kemungkinan akan terjadi lebih lambat dari periode waktu saat ini karena estimasi waktu perjalanan travel_duration(previous_visit, next_visit) ditingkatkan karena lalu lintas. Selain itu, jeda mungkin terpaksa tumpang-tindih dengan kunjungan karena peningkatan perkiraan waktu perjalanan dan pembatasan periode kunjungan atau jeda.

route_polyline

EncodedPolyline

Representasi polyline rute yang dienkode. Kolom ini hanya diisi jika OptimizeToursRequest.populate_polylines ditetapkan ke true.

breaks[]

Break

Jeda kendaraan dijadwalkan untuk kendaraan yang melakukan rute ini. Urutan breaks mewakili interval waktu, masing-masing dimulai pada start_time yang sesuai dan berlangsung selama duration detik.

metrics

AggregatedMetrics

Metrik durasi, jarak, dan beban untuk rute ini. Kolom AggregatedMetrics dijumlahkan di seluruh ShipmentRoute.transitions atau ShipmentRoute.visits, bergantung pada konteksnya.

route_costs

map<string, double>

Biaya rute, dikelompokkan berdasarkan kolom permintaan terkait biaya. Kuncinya adalah jalur proto, relatif terhadap input OptimizeToursRequest, misalnya "model.shipments.pickups.cost", dan nilainya adalah total biaya yang dihasilkan oleh kolom biaya yang sesuai, yang digabungkan di seluruh rute. Dengan kata lain, biaya["model.shipments.pickups.cost"] adalah jumlah semua biaya pengambilan selama perjalanan tersebut. Semua biaya yang ditentukan dalam model dilaporkan secara mendetail di sini, kecuali biaya yang terkait dengan TransitionAttributes yang hanya dilaporkan secara agregat mulai 2022/01.

route_total_cost

double

Total biaya rute. Jumlah semua biaya di peta biaya.

Istirahat

Data yang mewakili eksekusi jeda.

Kolom
start_time

Timestamp

Waktu mulai istirahat.

duration

Duration

Durasi istirahat.

EncodedPolyline

Representasi polyline yang dienkode. Informasi selengkapnya tentang encoding polyline dapat ditemukan di sini: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.

Kolom
points

string

String yang mewakili titik yang dienkode dari polyline.

Transisi

Transisi antara dua peristiwa pada rute. Lihat deskripsi ShipmentRoute.

Jika kendaraan tidak memiliki start_location dan/atau end_location, metrik perjalanan yang sesuai adalah 0.

Kolom
travel_duration

Duration

Durasi perjalanan selama transisi ini.

travel_distance_meters

double

Jarak yang ditempuh selama transisi.

traffic_info_unavailable

bool

Jika traffic diminta melalui OptimizeToursRequest.consider_road_traffic, dan info traffic tidak dapat diambil untuk Transition, boolean ini ditetapkan ke true. Hal ini mungkin bersifat sementara (gangguan yang jarang terjadi di server traffic realtime) atau permanen (tidak ada data untuk lokasi ini).

delay_duration

Duration

Jumlah durasi penundaan yang diterapkan untuk transisi ini. Jika ada, keterlambatan akan dimulai tepat delay_duration detik sebelum peristiwa berikutnya (kunjungan atau akhir kendaraan). Lihat TransitionAttributes.delay.

break_duration

Duration

Jumlah durasi jeda yang terjadi selama transisi ini, jika ada. Detail tentang waktu mulai dan durasi setiap jeda disimpan di ShipmentRoute.breaks.

wait_duration

Duration

Waktu yang dihabiskan untuk menunggu selama transisi ini. Durasi tunggu sesuai dengan waktu tidak ada aktivitas dan tidak termasuk waktu istirahat. Perhatikan juga bahwa waktu tunggu ini dapat dibagi menjadi beberapa interval yang tidak berdekatan.

total_duration

Duration

Total durasi transisi, disediakan untuk memudahkan Anda. Sama dengan:

  • kunjungan berikutnya start_time (atau vehicle_end_time jika ini adalah transisi terakhir) - start_time transisi ini;
  • jika ShipmentRoute.has_traffic_infeasibilities bernilai salah, hal tambahan berikut akan berlaku: `total_duration = travel_duration + delay_duration
  • break_duration + wait_duration`.
start_time

Timestamp

Waktu mulai transisi ini.

route_polyline

EncodedPolyline

Representasi polyline yang dienkode dari rute yang diikuti selama transisi. Kolom ini hanya diisi jika populate_transition_polylines ditetapkan ke true.

vehicle_loads

map<string, VehicleLoad>

Muatan kendaraan selama transisi ini, untuk setiap jenis yang muncul di Vehicle.load_limits kendaraan ini, atau yang memiliki Shipment.load_demands bukan nol pada beberapa pengiriman yang dilakukan di rute ini.

Beban selama transisi pertama adalah beban awal rute kendaraan. Kemudian, setelah setiap kunjungan, load_demands kunjungan ditambahkan atau dikurangi untuk mendapatkan beban transisi berikutnya, bergantung pada apakah kunjungan tersebut merupakan pengambilan atau pengiriman.

VehicleLoad

Melaporkan beban kendaraan yang sebenarnya pada beberapa titik di sepanjang rute, untuk jenis tertentu (lihat Transition.vehicle_loads).

Kolom
amount

int64

Jumlah beban pada kendaraan, untuk jenis tertentu. Satuan beban biasanya ditunjukkan oleh jenisnya. Lihat Transition.vehicle_loads.

Kunjungi

Kunjungan yang dilakukan selama rute. Kunjungan ini berkaitan dengan pengambilan atau pengiriman Shipment.

Kolom
shipment_index

int32

Indeks kolom shipments di ShipmentModel sumber.

is_pickup

bool

Jika benar, kunjungan tersebut sesuai dengan pengambilan Shipment. Jika tidak, ini sesuai dengan penayangan.

visit_request_index

int32

Indeks VisitRequest di kolom pengambilan atau pengantaran di Shipment (lihat is_pickup).

start_time

Timestamp

Waktu saat kunjungan dimulai. Perhatikan bahwa kendaraan mungkin tiba lebih awal dari waktu ini di lokasi kunjungan. Waktu konsisten dengan ShipmentModel.

load_demands

map<string, Load>

Total permintaan pemuatan kunjungan sebagai jumlah pengiriman dan permintaan kunjungan load_demands. Nilainya negatif jika kunjungan adalah pengiriman. Permintaan dilaporkan untuk jenis yang sama seperti Transition.loads (lihat kolom ini).

detour

Duration

Waktu putar balik tambahan karena pengiriman yang dikunjungi di rute sebelum kunjungan dan potensi waktu tunggu yang disebabkan oleh rentang waktu. Jika kunjungan adalah pengiriman, putar balik dihitung dari kunjungan pengambilan yang sesuai dan sama dengan:

start_time(delivery) - start_time(pickup)
- (duration(pickup) + travel duration from the pickup location
to the delivery location).

Jika tidak, data ini akan dihitung dari start_location kendaraan dan sama dengan:

start_time - vehicle_start_time - travel duration from
the vehicle's `start_location` to the visit.
shipment_label

string

Salinan Shipment.label terkait, jika ditentukan dalam Shipment.

visit_label

string

Salinan VisitRequest.label terkait, jika ditentukan dalam VisitRequest.

ShipmentTypeIncompatibility

Menentukan ketidaksesuaian antar-pengiriman bergantung pada delivery_type-nya. Pengiriman yang tidak kompatibel di rute yang sama dibatasi berdasarkan mode inkompatibilitas.

Kolom
types[]

string

Daftar jenis yang tidak kompatibel. Dua pengiriman yang memiliki shipment_types berbeda di antara yang tercantum "tidak kompatibel".

incompatibility_mode

IncompatibilityMode

Mode diterapkan ke inkompatibilitas.

IncompatibilityMode

Mode yang menentukan bagaimana tampilan pengiriman yang tidak kompatibel dibatasi di rute yang sama.

Enum
INCOMPATIBILITY_MODE_UNSPECIFIED Mode inkompatibilitas tidak ditentukan. Nilai ini tidak boleh digunakan.
NOT_PERFORMED_BY_SAME_VEHICLE Dalam mode ini, dua pengiriman dengan jenis yang tidak kompatibel tidak akan dapat menggunakan kendaraan yang sama.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

Untuk dua pengiriman dengan jenis yang tidak kompatibel serta mode inkompatibilitas NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY:

  • Jika keduanya hanya merupakan pengambilan (tidak ada pengiriman) atau hanya pesan antar (tanpa pengambilan), keduanya tidak dapat berbagi kendaraan yang sama sama sekali.
  • Jika salah satu pengiriman memiliki pengantaran dan yang lainnya adalah pengambilan, kedua pengiriman dapat berbagi kendaraan yang sama jika pengiriman pertama dikirimkan sebelum pengiriman yang terakhir diambil.

ShipmentTypeRequirement

Menentukan persyaratan antarpengiriman berdasarkan pengiriman_type-nya. Detail persyaratan ditentukan oleh mode persyaratan.

Kolom
required_shipment_type_alternatives[]

string

Daftar jenis pengiriman alternatif yang diwajibkan oleh dependent_shipment_types.

dependent_shipment_types[]

string

Semua pengiriman dengan jenis di kolom dependent_shipment_types memerlukan setidaknya satu pengiriman jenis required_shipment_type_alternatives untuk dikunjungi di rute yang sama.

CATATAN: Rantai persyaratan yang sedemikian rupa sehingga shipment_type bergantung pada dirinya sendiri tidak diizinkan.

requirement_mode

RequirementMode

Mode diterapkan sesuai persyaratan.

RequirementMode

Mode yang menentukan tampilan pengiriman dependen di suatu rute.

Enum
REQUIREMENT_MODE_UNSPECIFIED Mode persyaratan tidak ditentukan. Nilai ini tidak boleh digunakan.
PERFORMED_BY_SAME_VEHICLE Dalam mode ini, semua pengiriman "dependen" harus berbagi kendaraan yang sama dengan setidaknya satu pengiriman "wajib".
IN_SAME_VEHICLE_AT_PICKUP_TIME

Dengan mode IN_SAME_VEHICLE_AT_PICKUP_TIME, semua pengiriman "dependen" harus memiliki setidaknya satu pengiriman "wajib" di kendaraan pada saat pengambilan.

Oleh karena itu, pengambilan dengan pengiriman "dependen" harus memiliki:

  • Pengiriman "wajib" khusus pengiriman yang dikirimkan di rute setelahnya, atau
  • Pengiriman "wajib" diambil di rute sebelumnya, dan jika pengiriman yang "wajib" sudah ada, pengiriman ini harus dilakukan setelah pengambilan kiriman "dependen".
IN_SAME_VEHICLE_AT_DELIVERY_TIME Sama seperti sebelumnya, kecuali pengiriman yang "dependen" harus memiliki pengiriman "wajib" di kendaraan mereka pada saat pengiriman.

SkippedShipment

Menentukan detail pengiriman yang belum dilakukan dalam solusi. Untuk kasus kecil dan/atau jika kami dapat mengidentifikasi penyebab lewati, kami akan melaporkan alasannya di sini.

Kolom
index

int32

Indeks sesuai dengan indeks pengiriman di sumber ShipmentModel.

label

string

Salinan Shipment.label terkait, jika ditentukan dalam Shipment.

reasons[]

Reason

Daftar alasan yang menjelaskan mengapa pengiriman dilewati. Lihat komentar di atas Reason.

Alasan

Jika kami dapat menjelaskan alasan pengiriman dilewati, alasannya akan dicantumkan di sini. Jika alasannya tidak sama untuk semua kendaraan, reason akan memiliki lebih dari 1 elemen. Pengiriman yang dilewati tidak boleh memiliki alasan duplikat, yaitu semua kolom sama kecuali untuk example_vehicle_index. Contoh:

reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 1
  example_exceeded_capacity_type: "Apples"
}
reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 3
  example_exceeded_capacity_type: "Pears"
}
reasons {
  code: CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT
  example_vehicle_index: 1
}

Pengiriman yang dilewati tidak kompatibel dengan semua kendaraan. Alasannya mungkin berbeda untuk semua kendaraan, tetapi setidaknya satu kapasitas "Apel" kendaraan terlampaui (termasuk kendaraan 1), setidaknya satu kapasitas "Pears" kendaraan akan terlampaui (termasuk kendaraan 3), dan batas jarak minimal satu kendaraan akan terlampaui (termasuk kendaraan 1).

Kolom
code

Code

Lihat komentar Kode.

example_exceeded_capacity_type

string

Jika kode alasannya adalah DEMAND_EXCEEDS_VEHICLE_CAPACITY, dokumentasikan satu jenis kapasitas yang terlampaui.

example_vehicle_index

int32

Jika alasannya terkait dengan inkompatibilitas kendaraan pengiriman, kolom ini memberikan indeks satu kendaraan yang relevan.

Code

Kode yang mengidentifikasi jenis alasan. Urutan di sini tidak bermakna. Secara khusus, hasil ini tidak memberikan indikasi apakah alasan tertentu akan muncul sebelum alasan lain dalam solusi, jika keduanya berlaku.

Enum
CODE_UNSPECIFIED Metode ini tidak boleh digunakan. Jika kami tidak dapat memahami alasan pengiriman dilewati, kami hanya akan menampilkan kumpulan alasan kosong.
NO_VEHICLE Tidak ada kendaraan dalam model tersebut yang membuat semua pengiriman menjadi tidak mungkin.
DEMAND_EXCEEDS_VEHICLE_CAPACITY Permintaan pengiriman melebihi kapasitas kendaraan untuk beberapa jenis kapasitas, salah satunya adalah example_exceeded_capacity_type.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

Jarak minimum yang diperlukan untuk melakukan pengiriman ini, yaitu dari start_location kendaraan ke lokasi pengambilan dan/atau pengiriman pengiriman serta ke lokasi akhir kendaraan melebihi route_distance_limit kendaraan.

Perhatikan bahwa untuk komputasi ini, kita menggunakan jarak geodesi.

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

Waktu minimum yang diperlukan untuk melakukan pengiriman ini, termasuk waktu perjalanan, waktu tunggu, dan waktu servis melebihi route_duration_limit kendaraan.

Catatan: waktu tempuh dihitung dalam skenario kasus terbaik, yaitu sebagai jarak geodesi x 36 m/s (sekitar 130 km/jam).

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT Sama seperti di atas, tetapi kita hanya membandingkan waktu perjalanan minimum dan travel_duration_limit kendaraan.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS Kendaraan tidak dapat melakukan pengiriman ini dalam skenario kasus terbaik (lihat CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT untuk komputasi waktu) jika dimulai pada waktu mulai paling awal: waktu total akan membuat kendaraan berakhir setelah waktu berakhir yang terakhir.
VEHICLE_NOT_ALLOWED Kolom allowed_vehicle_indices pengiriman tidak kosong dan kendaraan ini bukan bagian darinya.

TimeWindow

Jendela waktu membatasi waktu peristiwa, seperti waktu kedatangan saat kunjungan, atau waktu mulai dan berakhir kendaraan.

Batas periode waktu sulit, start_time dan end_time, menerapkan waktu paling awal dan paling akhir untuk peristiwa, sehingga start_time <= event_time <= end_time. Batas bawah periode waktu lunak, soft_start_time, menyatakan preferensi agar peristiwa terjadi pada atau setelah soft_start_time dengan menimbulkan biaya yang sebanding dengan waktu sebelum soft_start_time peristiwa tersebut terjadi. Batas atas periode waktu lunak, soft_end_time, menyatakan preferensi agar peristiwa terjadi pada atau sebelum soft_end_time dengan menimbulkan biaya yang proporsional dengan durasi waktu setelah soft_end_time peristiwa tersebut terjadi. start_time, end_time, soft_start_time, dan soft_end_time harus berada dalam batas waktu global (lihat ShipmentModel.global_start_time dan ShipmentModel.global_end_time) serta harus mematuhi:

  0 <= `start_time` <= `soft_start_time` <= `end_time` and
  0 <= `start_time` <= `soft_end_time` <= `end_time`.
Kolom
start_time

Timestamp

Waktu mulai periode waktu yang sulit. Jika tidak ditentukan, atribut akan disetel ke ShipmentModel.global_start_time.

end_time

Timestamp

Waktu berakhir periode waktu yang sulit. Jika tidak ditentukan, atribut akan disetel ke ShipmentModel.global_end_time.

soft_start_time

Timestamp

Waktu mulai soft selama jangka waktu.

soft_end_time

Timestamp

Waktu soft end periode waktu.

cost_per_hour_before_soft_start_time

double

Biaya per jam yang ditambahkan ke biaya lain dalam model jika peristiwa terjadi sebelum soft_start_time, dihitung sebagai:

   max(0, soft_start_time - t.seconds)
                          * cost_per_hour_before_soft_start_time / 3600,
t being the time of the event.

Biaya ini harus positif, dan kolom hanya dapat ditetapkan jika soft_start_time telah ditetapkan.

cost_per_hour_after_soft_end_time

double

Biaya per jam yang ditambahkan ke biaya lain dalam model jika peristiwa terjadi setelah soft_end_time, dihitung sebagai:

   max(0, t.seconds - soft_end_time.seconds)
                    * cost_per_hour_after_soft_end_time / 3600,
t being the time of the event.

Biaya ini harus positif, dan kolom hanya dapat ditetapkan jika soft_end_time telah ditetapkan.

TransitionAttributes

Menentukan atribut transisi antara dua kunjungan berturut-turut di suatu rute. Beberapa TransitionAttributes mungkin berlaku untuk transisi yang sama: dalam hal ini, semua biaya tambahan akan bertambah dan batasan atau batas paling ketat akan berlaku (mengikuti semantik "AND" alami).

Kolom
src_tag

string

Tag yang menentukan kumpulan transisi (src->dst) transisi yang menerapkan atribut ini.

Kunjungan sumber atau awal kendaraan cocok jika VisitRequest.tags atau Vehicle.start_tags-nya berisi src_tag atau tidak berisi excluded_src_tag (bergantung pada kedua kolom mana yang tidak kosong).

excluded_src_tag

string

Lihat src_tag. Tepat satu dari src_tag dan excluded_src_tag tidak boleh kosong.

dst_tag

string

Kunjungan tujuan atau akhir kendaraan cocok jika VisitRequest.tags atau Vehicle.end_tags-nya berisi dst_tag atau tidak berisi excluded_dst_tag (bergantung pada kedua kolom mana yang tidak kosong).

excluded_dst_tag

string

Lihat dst_tag. Tepat satu dari dst_tag dan excluded_dst_tag tidak boleh kosong.

cost

double

Menentukan biaya untuk melakukan transisi ini. Biaya ini berada di unit yang sama dengan semua biaya lain dalam model dan tidak boleh bernilai negatif. Biaya ini diterapkan di atas semua biaya lain yang sudah ada.

cost_per_kilometer

double

Menentukan biaya per kilometer yang diterapkan ke jarak yang ditempuh saat melakukan transisi ini. Ini menambahkan hingga Vehicle.cost_per_kilometer yang ditentukan pada kendaraan.

distance_limit

DistanceLimit

Menentukan batas jarak yang ditempuh saat melakukan transisi ini.

Mulai 6/2021, hanya batas yang dapat dilewati yang didukung.

delay

Duration

Menentukan penundaan yang terjadi saat melakukan transisi ini.

Penundaan ini selalu terjadi setelah menyelesaikan kunjungan sumber dan sebelum memulai kunjungan tujuan.

Kendaraan

Membuat model kendaraan dalam masalah pengiriman. Menyelesaikan masalah pengiriman akan membuat rute mulai dari start_location dan berakhir pukul end_location untuk kendaraan ini. Rute adalah urutan kunjungan (lihat ShipmentRoute).

Kolom
display_name

string

Nama tampilan kendaraan yang ditentukan pengguna. Panjang teks dapat mencapai 63 karakter dan dapat menggunakan karakter UTF-8.

travel_mode

TravelMode

Mode perjalanan yang memengaruhi jalan yang dapat digunakan oleh kendaraan dan kecepatannya. Lihat juga travel_duration_multiple.

start_location

LatLng

Lokasi geografis tempat kendaraan dimulai sebelum mengambil pengiriman. Jika tidak ditentukan, kendaraan akan dimulai saat pengambilan pertamanya. Jika model pengiriman memiliki matriks durasi dan jarak, start_location tidak boleh ditentukan.

start_waypoint

Waypoint

Titik jalan yang mewakili lokasi geografis tempat kendaraan dimulai sebelum mengambil pengiriman. Jika start_waypoint atau start_location tidak ditentukan, kendaraan akan dimulai saat pengambilan pertamanya. Jika model pengiriman memiliki matriks durasi dan jarak, start_waypoint tidak boleh ditentukan.

end_location

LatLng

Lokasi geografis tempat kendaraan berakhir setelah menyelesaikan VisitRequest terakhirnya. Jika tidak ditentukan, ShipmentRoute kendaraan akan langsung berakhir saat menyelesaikan VisitRequest terakhirnya. Jika model pengiriman memiliki matriks durasi dan jarak, end_location tidak boleh ditentukan.

end_waypoint

Waypoint

Titik jalan yang mewakili lokasi geografis tempat kendaraan berakhir setelah menyelesaikan VisitRequest terakhirnya. Jika end_waypoint atau end_location tidak ditentukan, ShipmentRoute kendaraan akan langsung berakhir saat menyelesaikan VisitRequest terakhirnya. Jika model pengiriman memiliki matriks durasi dan jarak, end_waypoint tidak boleh ditentukan.

start_tags[]

string

Menentukan tag yang dilampirkan ke awal rute kendaraan.

String kosong atau duplikat tidak diizinkan.

end_tags[]

string

Menentukan tag yang dilampirkan ke akhir rute kendaraan.

String kosong atau duplikat tidak diizinkan.

start_time_windows[]

TimeWindow

Rentang waktu saat kendaraan dapat meninggalkan lokasi awal. Kolom tersebut harus berada dalam batas waktu global (lihat kolom ShipmentModel.global_*). Jika tidak ditentukan, tidak ada batasan selain batas waktu global tersebut.

Jendela waktu milik kolom berulang yang sama harus terpisah, yaitu tidak ada periode waktu yang dapat tumpang-tindih atau berdekatan dengan yang lain, dan harus dalam urutan kronologis.

cost_per_hour_after_soft_end_time dan soft_end_time hanya dapat disetel jika ada satu jangka waktu.

end_time_windows[]

TimeWindow

Periode waktu saat kendaraan tiba di lokasi akhir. Kolom tersebut harus berada dalam batas waktu global (lihat kolom ShipmentModel.global_*). Jika tidak ditentukan, tidak ada batasan selain batas waktu global tersebut.

Jendela waktu milik kolom berulang yang sama harus terpisah, yaitu tidak ada periode waktu yang dapat tumpang-tindih atau berdekatan dengan yang lain, dan harus dalam urutan kronologis.

cost_per_hour_after_soft_end_time dan soft_end_time hanya dapat disetel jika ada satu jangka waktu.

unloading_policy

UnloadingPolicy

Kebijakan membongkar muatan diterapkan pada kendaraan.

load_limits

map<string, LoadLimit>

Kapasitas kendaraan (misalnya berat, volume, # palet). Kunci dalam peta adalah ID jenis beban, yang konsisten dengan kunci kolom Shipment.load_demands. Jika kunci tertentu tidak ada dalam peta ini, kapasitas yang sesuai dianggap tidak terbatas.

cost_per_hour

double

Biaya kendaraan: semua biaya akan ditambahkan dan harus berada dalam unit yang sama dengan Shipment.penalty_cost.

Biaya per jam untuk rute kendaraan. Biaya ini diterapkan ke total waktu yang dibutuhkan oleh rute, dan mencakup waktu perjalanan, waktu tunggu, dan waktu kunjungan. Menggunakan cost_per_hour, bukan hanya cost_per_traveled_hour, dapat menyebabkan latensi tambahan.

cost_per_traveled_hour

double

Biaya per jam perjalanan untuk rute kendaraan. Biaya ini hanya berlaku untuk waktu perjalanan yang diambil oleh rute (yaitu, yang dilaporkan dalam ShipmentRoute.transitions), dan tidak termasuk waktu tunggu dan waktu kunjungan.

cost_per_kilometer

double

Biaya per kilometer rute kendaraan. Biaya ini diterapkan untuk jarak yang dilaporkan di ShipmentRoute.transitions dan tidak berlaku untuk jarak apa pun yang ditempuh secara implisit dari arrival_location ke departure_location dari satu VisitRequest.

fixed_cost

double

Biaya tetap diterapkan jika kendaraan ini digunakan untuk menangani pengiriman.

used_if_route_is_empty

bool

Kolom ini hanya berlaku untuk kendaraan jika rutenya tidak melayani pengiriman apa pun. Kode ini menunjukkan apakah kendaraan harus dianggap digunakan atau tidak dalam kasus ini.

Jika benar, kendaraan berangkat dari awal ke lokasi akhir meskipun tidak melayani pengiriman apa pun, dan biaya waktu dan jarak yang dihasilkan dari awal --> perjalanan akhir akan diperhitungkan.

Jika tidak, kendaraan tidak akan melakukan perjalanan dari awal hingga lokasi akhirnya, dan tidak ada break_rule atau keterlambatan (dari TransitionAttributes) yang dijadwalkan untuk kendaraan ini. Dalam hal ini, ShipmentRoute kendaraan tidak berisi informasi apa pun kecuali indeks dan label kendaraan.

route_duration_limit

DurationLimit

Batas diterapkan pada total durasi rute kendaraan. Dalam OptimizeToursResponse tertentu, durasi rute kendaraan adalah selisih antara vehicle_end_time dan vehicle_start_time.

travel_duration_limit

DurationLimit

Batas diterapkan pada durasi perjalanan rute kendaraan. Dalam OptimizeToursResponse tertentu, durasi perjalanan rute adalah jumlah dari semua transitions.travel_duration-nya.

route_distance_limit

DistanceLimit

Batas diterapkan ke total jarak rute kendaraan. Dalam OptimizeToursResponse tertentu, jarak rute adalah jumlah dari semua transitions.travel_distance_meters-nya.

extra_visit_duration_for_visit_type

map<string, Duration>

Menentukan peta dari string visit_types hingga durasi. Durasi adalah waktu selain VisitRequest.duration yang akan diambil pada kunjungan dengan visit_types yang ditentukan. Durasi kunjungan ekstra ini menambahkan biaya jika cost_per_hour ditentukan. Kunci (misalnya, visit_types) tidak boleh berupa string kosong.

Jika permintaan kunjungan memiliki beberapa jenis, durasi akan ditambahkan untuk setiap jenis di peta.

break_rule

BreakRule

Menjelaskan jadwal istirahat yang akan ditegakkan pada kendaraan ini. Jika kosong, tidak ada jeda yang akan dijadwalkan untuk kendaraan ini.

label

string

Menentukan label untuk kendaraan ini. Label ini dilaporkan dalam respons sebagai vehicle_label dari ShipmentRoute yang sesuai.

ignore

bool

Jika benar, used_if_route_is_empty harus salah, dan kendaraan ini akan tetap tidak digunakan.

Jika pengiriman dilakukan oleh kendaraan yang diabaikan di injected_first_solution_routes, pengiriman akan dilewati pada solusi pertama, tetapi gratis untuk dilakukan dalam respons.

Jika pengiriman dilakukan oleh kendaraan yang diabaikan di injected_solution_constraint dan pengambilan/pengiriman terkait dibatasi agar tetap berada di kendaraan (yaitu, tidak longgar ke level RELAX_ALL_AFTER_THRESHOLD), pengiriman akan dilewati dalam respons. Jika pengiriman memiliki kolom allowed_vehicle_indices yang tidak kosong dan semua kendaraan yang diizinkan diabaikan, kolom tersebut akan dilewati dalam respons.

travel_duration_multiple

double

Menentukan faktor multiplikatif yang dapat digunakan untuk menambah atau mengurangi waktu tempuh kendaraan ini. Misalnya, menyetel setelan ini ke 2,0 berarti kendaraan ini lebih lambat dan memiliki waktu tempuh yang dua kali lebih besar dari kendaraan standar. Jumlah tersebut tidak memengaruhi durasi kunjungan. Hal ini memengaruhi biaya jika cost_per_hour atau cost_per_traveled_hour ditentukan. Nilainya harus dalam rentang [0,001, 1000,0]. Jika tidak disetel, kendaraan akan dianggap standar, dan kelipatan ini dianggap 1.0.

PERINGATAN: Waktu perjalanan akan dibulatkan ke detik terdekat setelah kelipatan ini diterapkan, tetapi sebelum menjalankan operasi numerik apa pun, karena itu, kelipatan kecil dapat menyebabkan hilangnya presisi.

Lihat juga extra_visit_duration_for_visit_type di bawah.

DurationLimit

Batas yang menentukan durasi maksimum rute kendaraan. Sinyalnya bisa keras atau lunak.

Jika kolom soft limit ditentukan, nilai minimum soft max dan biaya yang terkait harus ditentukan bersama.

Kolom
max_duration

Duration

Batas pasti yang membatasi durasi agar maksimal max_duration.

soft_max_duration

Duration

Batas yang bisa dilewati tidak menerapkan batas durasi maksimum, tetapi jika dilanggar, rute akan dikenai biaya. Biaya ini bertambah dengan biaya lain yang ditentukan dalam model, dengan unit yang sama.

Jika ditentukan, soft_max_duration tidak boleh negatif. Jika max_duration juga ditentukan, soft_max_duration harus kurang dari max_duration.

quadratic_soft_max_duration

Duration

Batas yang bisa dilewati tidak menerapkan batas durasi maksimum, tetapi jika dilanggar, rute akan dikenai biaya, berupa kuadrat dari durasi. Biaya ini bertambah dengan biaya lain yang ditentukan dalam model, dengan unit yang sama.

Jika ditentukan, quadratic_soft_max_duration tidak boleh negatif. Jika max_duration juga ditentukan, quadratic_soft_max_duration harus lebih kecil dari max_duration, dan selisihnya tidak boleh lebih dari satu hari:

max_duration - quadratic_soft_max_duration <= 86400 seconds

cost_per_hour_after_soft_max

double

Biaya per jam yang timbul jika nilai minimum soft_max_duration dilanggar. Biaya tambahan adalah 0 jika durasi berada di bawah nilai minimum, jika tidak, biaya akan bergantung pada durasi sebagai berikut:

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

Biayanya tidak boleh negatif.

cost_per_square_hour_after_quadratic_soft_max

double

Biaya per jam persegi yang timbul jika nilai minimum quadratic_soft_max_duration dilanggar.

Biaya tambahan adalah 0 jika durasi berada di bawah nilai minimum, jika tidak, biaya akan bergantung pada durasi sebagai berikut:

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

Biayanya tidak boleh negatif.

LoadLimit

Menentukan batas beban yang diterapkan pada kendaraan, mis. "truk ini hanya dapat membawa hingga 3.500 kg". Lihat load_limits.

Kolom
soft_max_load

int64

Batas lunak dari beban. Lihat cost_per_unit_above_soft_max.

cost_per_unit_above_soft_max

double

Jika beban melebihi soft_max_load di sepanjang rute kendaraan ini, penalti biaya berikut akan berlaku (hanya sekali per kendaraan): (beban - soft_max_load) * cost_per_unit_above_soft_max. Semua biaya akan bertambah dan harus berada dalam unit yang sama dengan Shipment.penalty_cost.

start_load_interval

Interval

Interval beban kendaraan yang dapat diterima di awal rute.

end_load_interval

Interval

Interval beban kendaraan yang dapat diterima di akhir rute.

max_load

int64

Jumlah beban maksimum yang dapat diterima.

Interval

Interval jumlah muatan yang dapat diterima.

Kolom
min

int64

Beban minimum yang dapat diterima. Harus ≥ 0. Jika keduanya ditentukan, min harus ≤ max.

max

int64

Beban maksimum yang dapat diterima. Harus ≥ 0. Jika tidak ditentukan, pemuatan maksimum tidak dibatasi oleh pesan ini. Jika keduanya ditentukan, min harus ≤ max.

TravelMode

Mode perjalanan yang dapat digunakan oleh kendaraan.

Ini harus merupakan bagian dari mode perjalanan Routes Preferred API Google Maps Platform, lihat: https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode.

Enum
TRAVEL_MODE_UNSPECIFIED Mode perjalanan tidak ditetapkan, setara dengan DRIVING.
DRIVING Mode perjalanan yang sesuai dengan rute mobil (mobil, ...).
WALKING Mode perjalanan yang sesuai dengan rute jalan kaki.

UnloadingPolicy

Kebijakan tentang cara menurunkan muatan kendaraan. Hanya berlaku untuk pengiriman yang memiliki layanan pengambilan dan pengantaran.

Pengiriman lainnya gratis untuk dilakukan di mana saja di rute yang terpisah dari unloading_policy.

Enum
UNLOADING_POLICY_UNSPECIFIED Kebijakan bongkar muat tidak ditentukan; pengiriman harus dilakukan setelah penjemputan yang sesuai.
LAST_IN_FIRST_OUT Pengiriman harus dilakukan berdasarkan urutan pengambilan terbalik
FIRST_IN_FIRST_OUT Pengiriman harus dilakukan dalam urutan yang sama dengan pengambilan

Waypoint

Mengenkapsulasi titik jalan. Titik jalan menandai lokasi kedatangan dan keberangkatan VisitRequests, serta lokasi awal dan akhir Kendaraan.

Kolom
side_of_road

bool

Opsional. Menunjukkan bahwa lokasi titik jalan ini dimaksudkan agar kendaraan berhenti di sisi jalan tertentu. Jika Anda menetapkan nilai ini, rute akan melewati lokasi sehingga kendaraan dapat berhenti di sisi jalan yang bias lokasinya dari tengah jalan. Opsi ini tidak berfungsi untuk mode perjalanan 'BERLANJUT'.

Kolom union location_type. Berbagai cara untuk menampilkan lokasi. location_type hanya ada berupa salah satu diantara berikut:
location

Location

Titik yang ditetapkan menggunakan koordinat geografis, termasuk judul opsional.

place_id

string

ID Tempat POI yang terkait dengan titik jalan.