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 (resp. 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