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)

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

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

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 เป็นต้นมา ฟิลด์นี้จะสร้างเฉพาะเส้นประกอบของเส้นทางที่ไม่ว่างเปล่าและกำหนดให้ 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) เว้นแต่ว่า solvingMode=VALIDATE_ONLY: โปรดดูช่อง OptimizeToursResponse.validation_errors ค่าเริ่มต้นคือ 100 และจำกัดไว้ที่ 10,000

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

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

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

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

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

สิทธิ์ IAM

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

  • routeoptimization.locations.use

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