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)

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

ตั้งแต่ปี 2020/11 เป็นต้นไป ตัวแปรนี้จะเติมเฉพาะโพลีไลน์ของเส้นทางที่ไม่ว่างเปล่าและกำหนดให้ 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 โดยจะใช้ได้เมื่อการจัดส่งหรือดัชนียานพาหนะในคำขอมีการเปลี่ยนแปลงตั้งแต่มีการสร้างโซลูชัน ซึ่งอาจเป็นเพราะมีการนำการจัดส่งหรือยานพาหนะออกจากหรือเพิ่มไปยังคำขอแล้ว

หากจริง ป้ายกำกับในหมวดหมู่ต่อไปนี้ต้องปรากฏมากที่สุดครั้งเดียวในหมวดหมู่ของป้ายกำกับนั้น

หาก 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) ยกเว้น troubleshootingMode=VALIDATE_ONLY: โปรดดูช่อง OptimizeToursResponse.validation_errors ค่าเริ่มต้นคือ 100 และจํากัดอยู่ที่ 10,000 รายการ

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

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

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

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

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

สิทธิ์ IAM

ต้องมีสิทธิ์ IAM ต่อไปนี้ในทรัพยากร parent:

  • routeoptimization.locations.use

ดูข้อมูลเพิ่มเติมได้ในเอกสารประกอบ IAM