Method: projects.optimizeTours

Mengirim OptimizeToursRequest yang berisi ShipmentModel dan menampilkan OptimizeToursResponse yang berisi ShipmentRoute, yang merupakan serangkaian rute yang akan dilakukan oleh kendaraan untuk meminimalkan biaya keseluruhan.

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

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

Permintaan HTTP

POST https://routeoptimization.googleapis.com/v1/{parent=projects/*}:optimizeTours

URL ini menggunakan sintaksis gRPC Transcoding.

Parameter jalur

Parameter
parent

string

Wajib. Project atau lokasi target untuk melakukan panggilan.

Format:

  • projects/{project-id}
  • projects/{project-id}/locations/{location-id}

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

Isi permintaan

Isi permintaan memuat data dengan struktur berikut:

Representasi JSON
{
  "timeout": string,
  "model": {
    object (ShipmentModel)
  },
  "solvingMode": enum (SolvingMode),
  "searchMode": enum (SearchMode),
  "injectedFirstSolutionRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "injectedSolutionConstraint": {
    object (InjectedSolutionConstraint)
  },
  "refreshDetailsRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "interpretInjectedSolutionsUsingLabels": boolean,
  "considerRoadTraffic": boolean,
  "populatePolylines": boolean,
  "populateTransitionPolylines": boolean,
  "allowLargeDeadlineDespiteInterruptionRisk": boolean,
  "useGeodesicDistances": boolean,
  "label": string,
  "geodesicMetersPerSecond": number,
  "maxValidationErrors": integer
}
Kolom
timeout

string (Duration format)

Jika waktu tunggu ini ditetapkan, server akan menampilkan respons sebelum periode waktu tunggu berlalu atau batas waktu server untuk permintaan sinkronis tercapai, mana saja yang lebih dulu.

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

Durasi dalam detik dengan maksimal sembilan digit pecahan, yang diakhiri dengan 's'. Contoh: "3.5s".

model

object (ShipmentModel)

Model pengiriman yang akan diselesaikan.

solvingMode

enum (SolvingMode)

Secara default, mode penyelesaiannya adalah DEFAULT_SOLVE (0).

searchMode

enum (SearchMode)

Mode penelusuran yang digunakan untuk menyelesaikan permintaan.

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

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

Model dibatasi saat solusi pertama dibuat. Setiap pengiriman yang tidak dilakukan di rute akan dilewati secara implisit dalam solusi pertama, tetapi dapat dilakukan dalam solusi berikutnya.

Solusi harus memenuhi beberapa asumsi validitas dasar:

  • untuk semua rute, vehicleIndex harus berada dalam rentang dan tidak boleh diduplikasi.
  • untuk semua kunjungan, shipmentIndex dan visitRequestIndex harus berada dalam rentang.
  • pengiriman hanya dapat dirujuk pada satu rute.
  • penjemputan pengiriman dengan opsi ambil di lokasi harus dilakukan sebelum pengiriman.
  • tidak lebih dari satu alternatif pengambilan atau alternatif pengiriman untuk pengiriman dapat dilakukan.
  • untuk semua rute, waktu perjalanan meningkat (yaitu, vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime).
  • pengiriman hanya dapat dilakukan pada kendaraan yang diizinkan. Kendaraan diizinkan jika Shipment.allowed_vehicle_indices kosong atau vehicleIndex-nya disertakan dalam Shipment.allowed_vehicle_indices.

Jika solusi yang disuntikkan tidak layak, error validasi tidak selalu ditampilkan dan error yang menunjukkan ketidaklayakan dapat ditampilkan sebagai gantinya.

injectedSolutionConstraint

object (InjectedSolutionConstraint)

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

Jika solusi yang disuntikkan tidak layak, error validasi tidak selalu ditampilkan dan error yang menunjukkan ketidaklayakan dapat ditampilkan sebagai gantinya.

refreshDetailsRoutes[]

object (ShipmentRoute)

Jika tidak kosong, rute yang diberikan akan diperbarui, tanpa mengubah urutan kunjungan atau waktu perjalanan yang mendasarinya: hanya detail lainnya yang akan diperbarui. Hal ini tidak menyelesaikan model.

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

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

Kolom ini tidak boleh digunakan bersama dengan injectedFirstSolutionRoutes atau injectedSolutionConstraint.

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

interpretInjectedSolutionsUsingLabels

boolean

Jika benar:

Interpretasi ini berlaku untuk kolom injectedFirstSolutionRoutes, injectedSolutionConstraint, dan refreshDetailsRoutes. API ini dapat digunakan saat 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 hanya boleh muncul paling banyak satu kali dalam kategorinya:

Jika vehicleLabel dalam solusi yang disisipkan tidak sesuai dengan kendaraan permintaan, rute yang sesuai akan dihapus dari solusi beserta kunjungan rutenya. Jika shipmentLabel dalam solusi yang disuntikkan tidak sesuai dengan pengiriman permintaan, kunjungan yang sesuai akan dihapus dari solusi. Jika SkippedShipment.label dalam solusi yang disuntikkan tidak sesuai dengan pengiriman permintaan, SkippedShipment akan dihapus dari solusi.

Menghapus kunjungan rute atau seluruh rute dari solusi yang disisipkan dapat memengaruhi batasan tersirat, yang dapat menyebabkan perubahan solusi, error validasi, atau tidak dapat diterapkan.

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

considerRoadTraffic

boolean

Pertimbangkan estimasi traffic dalam menghitung kolom ShipmentRoute Transition.travel_duration, Visit.start_time, dan vehicleEndTime; dalam menetapkan kolom ShipmentRoute.has_traffic_infeasibilities, dan dalam menghitung kolom OptimizeToursResponse.total_cost.

populatePolylines

boolean

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

populateTransitionPolylines

boolean

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

allowLargeDeadlineDespiteInterruptionRisk

boolean

Jika disetel, permintaan dapat memiliki batas waktu (lihat https://grpc.io/blog/deadlines) hingga 60 menit. Jika tidak, batas waktu maksimumnya hanya 30 menit. Perhatikan bahwa permintaan yang berjalan lama memiliki risiko gangguan yang jauh lebih besar (tetapi tetap kecil).

useGeodesicDistances

boolean

Jika benar (true), jarak perjalanan akan dihitung menggunakan jarak geodetik, bukan jarak Google Maps, dan waktu tempuh akan dihitung menggunakan jarak geodetik dengan kecepatan yang ditentukan oleh geodesicMetersPerSecond.

label

string

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

geodesicMetersPerSecond

number

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

maxValidationErrors

integer

Memangkas 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 solvingMode=VALIDATE_ONLY: lihat kolom OptimizeToursResponse.validation_errors. Nilai defaultnya adalah 100 dan dibatasi hingga 10.000.

Isi respons

Jika berhasil, isi respons memuat instance OptimizeToursResponse.

Cakupan otorisasi

Memerlukan cakupan OAuth berikut:

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

Izin IAM

Memerlukan izin IAM berikut pada resource parent:

  • routeoptimization.locations.use

Untuk mengetahui informasi selengkapnya, lihat dokumentasi IAM.