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)

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

ตั้งแต่เดือนพฤศจิกายน 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

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

useGeodesicDistances

boolean

หากเป็นจริง ระบบจะคำนวณระยะทางการเดินทางโดยใช้ระยะทาง Geodesic แทนระยะทางของ Google Maps และจะคำนวณเวลาเดินทางโดยใช้ระยะทาง Geodesic ที่มีความเร็วซึ่งกำหนดโดย 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