Method: projects.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/*}: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 ซึ่งจะใช้ได้เมื่อดัชนีการจัดส่งหรือยานพาหนะในคำขอมีการเปลี่ยนแปลงนับตั้งแต่สร้างโซลูชัน ซึ่งอาจเป็นเพราะมีการนําการจัดส่งหรือยานพาหนะออกจากหรือเพิ่มลงในคําขอ

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

หาก 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