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) เว้นแต่ว่า 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