Method: projects.locations.optimizeTours

ส่ง OptimizeToursRequest ที่มี ShipmentModel และส่งคืน OptimizeToursResponse ที่มี ShipmentRoute ซึ่งเป็นชุดเส้นทางที่จะดำเนินการโดยยานพาหนะที่ลดค่าใช้จ่ายโดยรวม

โมเดล ShipmentModel ส่วนใหญ่ประกอบด้วย Shipment ที่ต้องดําเนินการ และ Vehicle ที่ใช้เพื่อส่ง Shipment ShipmentRoute จะกำหนด Shipment ให้กับ Vehicle กล่าวอย่างเจาะจงคือ พวกเขากำหนดชุด Visit ให้กับยานพาหนะแต่ละคัน โดย Visit ตรงกับ VisitRequest ซึ่งเป็นบริการรับสินค้าหรือนำส่งสำหรับ Shipment

โดยมีเป้าหมายเพื่อกำหนด ShipmentRoute ให้กับ Vehicle เพื่อลดต้นทุนรวมโดยที่ต้นทุนมีองค์ประกอบจำนวนมากที่กำหนดไว้ใน ShipmentModel

คำขอ HTTP

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

URL ใช้ไวยากรณ์การแปลง gRPC

พารามิเตอร์เส้นทาง

พารามิเตอร์
parent

string

ต้องระบุ กําหนดเป้าหมายโปรเจ็กต์หรือสถานที่ตั้งเพื่อโทรออก

รูปแบบ: * projects/{project-id} * projects/{project-id}/locations/{location-id}

หากไม่มีการระบุตำแหน่ง ระบบจะเลือกภูมิภาคโดยอัตโนมัติ

เนื้อหาของคำขอ

เนื้อหาของคำขอมีข้อมูลซึ่งมีโครงสร้างต่อไปนี้

การแสดง 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
}
ช่อง
timeout

string (Duration format)

หากตั้งค่าระยะหมดเวลาไว้ เซิร์ฟเวอร์จะส่งคืนการตอบกลับก่อนที่ระยะหมดเวลาจะหมดไป หรือเมื่อถึงกำหนดเวลาของเซิร์ฟเวอร์สำหรับคำขอแบบซิงโครนัส ขึ้นอยู่กับว่ากรณีใดเกิดก่อน

สำหรับคำขอแบบอะซิงโครนัส เซิร์ฟเวอร์จะสร้างโซลูชัน (หากเป็นไปได้) ก่อนจะพ้นระยะหมดเวลา

ระยะเวลาเป็นวินาทีที่มีเลขเศษส่วนไม่เกิน 9 หลัก ลงท้ายด้วย "s" เช่น "3.5s"

model

object (ShipmentModel)

รูปแบบการจัดส่งที่จะแก้ปัญหา

solvingMode

enum (SolvingMode)

โดยค่าเริ่มต้น โหมดการแก้โจทย์คือ DEFAULT_SOLVE (0)

searchMode

enum (SearchMode)

โหมดการค้นหาที่ใช้เพื่อแก้ไขคำขอ

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

แนะนำอัลกอริทึมการเพิ่มประสิทธิภาพในการค้นหาโซลูชันแรกที่คล้ายกับโซลูชันก่อนหน้านี้

โมเดลจะถูกจำกัดเมื่อสร้างโซลูชันแรก การจัดส่งใดๆ ที่ไม่ได้ดำเนินการในเส้นทางจะถูกข้ามโดยนัยในโซลูชันแรก แต่อาจดำเนินการในโซลูชันต่อๆ ไปก็ได้

โซลูชันต้องเป็นไปตามสมมติฐานเกี่ยวกับความถูกต้องพื้นฐานบางประการดังนี้

  • สำหรับเส้นทางทั้งหมด vehicleIndex จะต้องอยู่ในช่วงและต้องไม่ซ้ำซ้อน
  • สำหรับการเข้าชมทั้งหมด shipmentIndexและ visitRequestIndex จะต้องอยู่ในช่วง
  • จะอ้างอิงการจัดส่งได้ในเส้นทางเดียวเท่านั้น
  • การรับสินค้าสำหรับการจัดส่งแบบมารับที่ร้านต้องดำเนินการก่อนการนำส่ง
  • ต้องมีตัวเลือกการรับสินค้าหรือทางเลือกในการจัดส่งไม่เกิน 1 ตัวเลือก
  • สำหรับทุกเส้นทาง เวลาจะเพิ่มขึ้น (เช่น vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime).
  • การจัดส่งจะกระทำได้ในยานพาหนะที่ได้รับอนุญาตเท่านั้น ยานพาหนะได้รับอนุญาตหาก Shipment.allowed_vehicle_indices ว่างเปล่าหรือ vehicleIndex รวมอยู่ใน Shipment.allowed_vehicle_indices

หากโซลูชันที่แทรกไว้ไม่สามารถทำได้ อาจไม่แสดงผลข้อผิดพลาดในการตรวจสอบ และอาจแสดงผลข้อผิดพลาดที่ระบุว่าไม่สามารถดำเนินการได้แทน

injectedSolutionConstraint

object (InjectedSolutionConstraint)

จำกัดอัลกอริทึมการเพิ่มประสิทธิภาพเพื่อค้นหาวิธีแก้ปัญหาสุดท้ายที่คล้ายกับโซลูชันก่อนหน้านี้ ตัวอย่างเช่น อาจมีการตรึงเส้นทางบางส่วนที่สร้างเสร็จสมบูรณ์แล้ว หรือส่วนที่เสร็จสมบูรณ์แล้ว แต่ต้องไม่แก้ไข

หากโซลูชันที่แทรกไว้ไม่สามารถทำได้ อาจไม่แสดงผลข้อผิดพลาดในการตรวจสอบ และอาจแสดงผลข้อผิดพลาดที่ระบุว่าไม่สามารถดำเนินการได้แทน

refreshDetailsRoutes[]

object (ShipmentRoute)

หากเส้นทางนั้นไม่ว่างเปล่า ระบบจะรีเฟรชเส้นทางที่ระบุโดยไม่แก้ไขลำดับการเข้าชมหรือเวลาในการเดินทาง แต่จะอัปเดตเฉพาะรายละเอียดอื่นๆ เท่านั้น ไม่สามารถแก้ไขปัญหาของโมเดลได้

ตั้งแต่วันที่ 11/2020 เป็นต้นไป การดำเนินการนี้จะสร้างเฉพาะโพลีไลน์ของเส้นทางที่ไม่ว่างเปล่า และกําหนดให้ populatePolylines เป็นจริง

ช่อง routePolyline ของเส้นทางที่ผ่านเข้ามาอาจไม่สอดคล้องกับเส้นทาง transitions

ต้องไม่ใช้ฟิลด์นี้ร่วมกับ injectedFirstSolutionRoutes หรือ injectedSolutionConstraint

Shipment.ignore และ Vehicle.ignore ไม่มีผลต่อลักษณะการทำงาน ระบบจะยังคงป้อนข้อมูลโพลีไลน์ระหว่างการเข้าชมทั้งหมดในเส้นทางที่ไม่ว่างเปล่า โดยไม่คำนึงถึงว่าระบบจะไม่สนใจการจัดส่งหรือยานพาหนะที่เกี่ยวข้อง

interpretInjectedSolutionsUsingLabels

boolean

หากจริง:

  • ใช้ ShipmentRoute.vehicle_label แทน vehicleIndex เพื่อจับคู่เส้นทางในโซลูชันที่แทรกกับยานพาหนะในคำขอ ใช้การแมป ShipmentRoute.vehicle_index เดิมกับ ShipmentRoute.vehicle_index ใหม่เพื่ออัปเดต ConstraintRelaxation.vehicle_indices หากไม่ว่างเปล่า แต่การแมปต้องไม่กำกวม (กล่าวคือ ShipmentRoute หลายรายการต้องไม่แชร์ vehicleIndex เดิมร่วมกัน)
  • ใช้ ShipmentRoute.Visit.shipment_label แทน shipmentIndex เพื่อจับคู่การเข้าชมในโซลูชันที่แทรกกับการจัดส่งในคำขอ
  • ใช้ SkippedShipment.label แทน SkippedShipment.index เพื่อจับคู่การจัดส่งที่ข้ามในโซลูชันที่แทรกกับคำขอการจัดส่ง

การตีความนี้ใช้กับช่อง injectedFirstSolutionRoutes, injectedSolutionConstraint และ refreshDetailsRoutes โดยจะใช้ได้เมื่อดัชนีการจัดส่งหรือดัชนียานพาหนะในคำขอมีการเปลี่ยนแปลงนับตั้งแต่ที่มีการสร้างโซลูชัน ซึ่งอาจเป็นเพราะมีการนำการจัดส่งหรือยานพาหนะออกหรือเพิ่มลงในคำขอแล้ว

หากเป็น "จริง" ป้ายกำกับในหมวดหมู่ต่อไปนี้จะต้องปรากฏในหมวดหมู่นั้นอย่างน้อย 1 ครั้ง

หาก vehicleLabel ในโซลูชันที่แทรกไม่ตรงกับยานพาหนะที่ขอ ระบบจะนำเส้นทางที่เกี่ยวข้องออกจากโซลูชันพร้อมกับการเข้าชมของโซลูชันนั้น หาก shipmentLabel ในโซลูชันที่แทรกไม่ตรงกับคำขอการจัดส่ง ระบบจะนำการเข้าชมที่เกี่ยวข้องออกจากโซลูชัน หาก SkippedShipment.label ในโซลูชันที่แทรกไม่ตรงกับคำขอการจัดส่ง ระบบจะนำ SkippedShipment ออกจากโซลูชัน

การนำการเข้าชมเส้นทางหรือทั้งเส้นทางออกจากโซลูชันที่แทรกเข้าไปอาจส่งผลต่อข้อจำกัดโดยนัย ซึ่งอาจทำให้มีการเปลี่ยนแปลงโซลูชัน ข้อผิดพลาดในการตรวจสอบความถูกต้อง หรือความเป็นไปได้

หมายเหตุ: ผู้โทรต้องตรวจสอบว่า Vehicle.label แต่ละรายการ (ตอบกลับ Shipment.label) ระบุเอนทิตียานพาหนะ (การจัดส่งค่าจัดส่ง) ที่ไม่ซ้ำกันที่ใช้ในคำขอที่เกี่ยวข้อง 2 รายการ ได้แก่ คำขอที่ผ่านมาซึ่งสร้าง OptimizeToursResponse ที่ใช้ในโซลูชันที่แทรกไว้ และคำขอปัจจุบันซึ่งมีโซลูชันที่แทรกเข้าไป การตรวจสอบความไม่ซ้ำกันที่อธิบายไว้ข้างต้นไม่เพียงพอที่จะรับประกันข้อกำหนดนี้

considerRoadTraffic

boolean

พิจารณาการประมาณการเข้าชมในการคำนวณ ShipmentRoute ช่อง Transition.travel_duration, Visit.start_time และ vehicleEndTime ในการตั้งค่าช่อง ShipmentRoute.has_traffic_infeasibilities และในการคำนวณช่อง OptimizeToursResponse.total_cost

populatePolylines

boolean

หาก "จริง" ระบบจะป้อนข้อมูลของเส้นประกอบในคำตอบ ShipmentRoute

populateTransitionPolylines

boolean

หาก "จริง" ระบบจะป้อนข้อมูลของเส้นประกอบในคำตอบ ShipmentRoute.transitions

allowLargeDeadlineDespiteInterruptionRisk

boolean

หากตั้งค่านี้ คำขอจะมีกำหนดเวลา (ดู https://grpc.io/blog/deadlines) ได้สูงสุด 60 นาที ไม่เช่นนั้น กำหนดเวลาสูงสุดคือ 30 นาที โปรดทราบว่าคำขอที่มีระยะเวลานานมีความเสี่ยงที่ขนาดใหญ่กว่า (แต่ยังน้อย) ที่จะเกิดการหยุดชะงัก

useGeodesicDistances

boolean

หากเป็นจริง ระยะทางในการเดินทางจะคำนวณโดยใช้ระยะทางตามภูมิสารสนเทศแทนระยะทางใน Google Maps และเวลาเดินทางจะคำนวณโดยใช้ระยะทางทรงกลมด้วยความเร็วที่กำหนดโดย geodesicMetersPerSecond

label

string

ป้ายกำกับที่อาจใช้เพื่อระบุคำขอนี้ โดยจะรายงานกลับมาใน OptimizeToursResponse.request_label

geodesicMetersPerSecond

number

เมื่อ useGeodesicDistances เป็นจริง ช่องนี้จะต้องตั้งค่าและกำหนดความเร็วที่ใช้กับระยะเวลาเดินทางในการคำนวณ โดยมีค่าอย่างน้อย 1.0 เมตร/วินาที

maxValidationErrors

integer

ลดจำนวนข้อผิดพลาดในการตรวจสอบที่ส่งกลับ โดยปกติแล้ว ข้อผิดพลาดเหล่านี้จะแนบอยู่กับเพย์โหลดข้อผิดพลาด INVALID_ARGUMENT เป็นรายละเอียดข้อผิดพลาด BadRequest (https://cloud.google.com/apis/design/errors#error_details) เว้นแต่ว่าจะแก้ไขMode=VALIDATE_ONLY: โปรดดูช่อง OptimizeToursResponse.validation_errors ค่าเริ่มต้นคือ 100 และจํากัดที่ 10,000

เนื้อหาการตอบกลับ

หากทำสำเร็จ เนื้อหาการตอบกลับจะมีอินสแตนซ์ OptimizeToursResponse

ขอบเขตการให้สิทธิ์

ต้องใช้ขอบเขต OAuth ต่อไปนี้

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