Package google.maps.routeoptimization.v1

ดัชนี

RouteOptimization

บริการสำหรับเพิ่มประสิทธิภาพการทัวร์ชมด้วยยานพาหนะ

ระยะเวลาที่ใช้ฟิลด์บางประเภทได้

  • google.protobuf.Timestamp
    • เวลาเป็นเวลา Unix: วินาทีนับตั้งแต่ 1970-01-01T00:00:00+00:00
    • วินาทีต้องอยู่ในช่วง [0, 253402300799] เช่น อยู่ในช่วง [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00]
    • ต้องยกเลิกการตั้งค่า nanos หรือตั้งค่าเป็น 0
  • google.protobuf.Duration
    • วินาทีต้องอยู่ในช่วง [0, 253402300799] เช่น อยู่ในช่วง [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00]
    • ต้องยกเลิกการตั้งค่า nanos หรือตั้งค่าเป็น 0
  • google.type.LatLng
    • ละติจูดต้องอยู่ในช่วง [-90.0, 90.0]
    • ลองจิจูดต้องอยู่ภายใน [-180.0, 180.0]
    • ละติจูดและลองจิจูดต้องไม่เท่ากับ 0 อย่างน้อย 1 ค่า
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

เพิ่มประสิทธิภาพทัวร์ชมยานพาหนะสำหรับข้อความ OptimizeToursRequest อย่างน้อย 1 รายการเป็นกลุ่ม

เมธอดนี้เป็นการดำเนินการที่ใช้เวลานาน (LRO) ระบบจะอ่านอินพุตสำหรับการเพิ่มประสิทธิภาพ (ข้อความ OptimizeToursRequest) และเอาต์พุต (ข้อความ OptimizeToursResponse) จากที่เก็บข้อมูล Cloud Storage และเขียนไปยังที่เก็บข้อมูลดังกล่าวในรูปแบบที่ผู้ใช้ระบุ เช่นเดียวกับเมธอด OptimizeTours OptimizeToursRequest แต่ละรายการจะมี ShipmentModel และแสดงผล OptimizeToursResponse ที่มีช่อง ShipmentRoute ซึ่งเป็นชุดเส้นทางที่ยานพาหนะจะดำเนินการเพื่อลดต้นทุนโดยรวม

ผู้ใช้สามารถตรวจสอบสถานะของ LRO ได้โดยเรียกใช้ operations.get ดังนี้

หากช่อง LRO done เป็นเท็จ แสดงว่ายังมีคำขออย่างน้อย 1 รายการที่อยู่ระหว่างดำเนินการ คำขออื่นๆ อาจดำเนินการเสร็จสมบูรณ์แล้วและผลลัพธ์จะอยู่ใน Cloud Storage

หากฟิลด์ done ของ LRO เป็น "จริง" แสดงว่าระบบประมวลผลคำขอทั้งหมดแล้ว คำขอที่ประมวลผลสำเร็จจะมีผลลัพธ์แสดงอยู่ใน Cloud Storage คำขอที่ดำเนินการไม่สำเร็จจะไม่มีผลลัพธ์ใน Cloud Storage หากมีการตั้งค่าช่อง error ของ LRO ช่องดังกล่าวจะมีข้อผิดพลาดจากคำขอที่ไม่สำเร็จรายการใดรายการหนึ่ง

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

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

  • https://www.googleapis.com/auth/cloud-platform
สิทธิ์ IAM

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

  • routeoptimization.operations.create

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

OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

ส่ง OptimizeToursRequest ที่มี ShipmentModel และแสดงผล OptimizeToursResponse ที่มี ShipmentRoute ซึ่งเป็นชุดเส้นทางที่ยานพาหนะจะดำเนินการเพื่อลดต้นทุนโดยรวม

โมเดล ShipmentModel ประกอบด้วย Shipment ที่ต้องดำเนินการและ Vehicle ที่ใช้ขนส่ง Shipment เป็นหลัก ShipmentRoute จะมอบหมาย Shipment ให้กับ Vehicle กล่าวอย่างเจาะจงคือ จะมีการกําหนดชุด Visit ให้กับยานพาหนะแต่ละคัน โดยที่ Visit หนึ่งๆ จะสอดคล้องกับ VisitRequest ซึ่งก็คือการไปรับหรือนำส่ง Shipment

เป้าหมายคือมอบหมาย ShipmentRoute ให้กับ Vehicle เพื่อลดต้นทุนรวมให้เหลือน้อยที่สุด โดยที่ต้นทุนมีองค์ประกอบหลายอย่างที่กําหนดไว้ใน ShipmentModel

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

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

  • https://www.googleapis.com/auth/cloud-platform
สิทธิ์ IAM

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

  • routeoptimization.locations.use

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

AggregatedMetrics

เมตริกรวมสําหรับองค์ประกอบ ShipmentRoute (สําหรับ OptimizeToursResponse ใน Transition และ/หรือ Visit ทั้งหมดตามลำดับ)ShipmentRoute

ช่อง
performed_shipment_count

int32

จำนวนการจัดส่งที่ดำเนินการ โปรดทราบว่าระบบจะนับคู่การรับและการนำส่งเพียงครั้งเดียว

travel_duration

Duration

ระยะเวลาการเดินทางทั้งหมดสำหรับเส้นทางหรือวิธีแก้ปัญหา

wait_duration

Duration

ระยะเวลารอทั้งหมดสำหรับเส้นทางหรือโซลูชัน

delay_duration

Duration

ระยะเวลาความล่าช้าทั้งหมดของเส้นทางหรือโซลูชัน

break_duration

Duration

ระยะเวลาพักทั้งหมดของเส้นทางหรือโซลูชัน

visit_duration

Duration

ระยะเวลาการเข้าชมทั้งหมดสําหรับเส้นทางหรือโซลูชัน

total_duration

Duration

ระยะเวลาทั้งหมดควรเท่ากับผลรวมของระยะเวลาทั้งหมดข้างต้น สำหรับเส้นทาง ข้อมูลนี้ยังสอดคล้องกับข้อมูลต่อไปนี้ด้วย

[ShipmentRoute.vehicle_end_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_end_time] - [ShipmentRoute.vehicle_start_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_start_time]
travel_distance_meters

double

ระยะทางรวมในการเดินทางสำหรับเส้นทางหรือโซลูชัน

max_loads

map<string, VehicleLoad>

น้ำหนักบรรทุกสูงสุดที่ทำได้ตลอดทั้งเส้นทาง (โซลูชันที่เกี่ยวข้อง) สำหรับปริมาณแต่ละรายการในเส้นทางนี้ (โซลูชันที่เกี่ยวข้อง) ซึ่งคํานวณเป็นค่าสูงสุดของ Transition.vehicle_loads ทั้งหมด (โซลูชันที่เกี่ยวข้อง ShipmentRoute.metrics.max_loads

BatchOptimizeToursMetadata

ประเภทนี้ไม่มีช่อง

ข้อมูลเมตาการดำเนินการสำหรับการเรียก BatchOptimizeToursRequest

BatchOptimizeToursRequest

คำขอเพิ่มประสิทธิภาพทัวร์แบบเป็นกลุ่มเป็นการดำเนินการแบบอะซิงโครนัส ไฟล์อินพุตแต่ละไฟล์ควรมี OptimizeToursRequest 1 รายการ และไฟล์เอาต์พุตแต่ละไฟล์จะมี OptimizeToursResponse 1 รายการ คำขอมีข้อมูลสำหรับการอ่าน/เขียนและแยกวิเคราะห์ไฟล์ ไฟล์อินพุตและเอาต์พุตทั้งหมดควรอยู่ในโปรเจ็กต์เดียวกัน

ช่อง
parent

string

ต้องระบุ กำหนดโปรเจ็กต์และสถานที่ที่จะโทร

รูปแบบ: * projects/{project-id} * projects/{project-id}/locations/{location-id}

หากไม่ได้ระบุสถานที่ ระบบจะเลือกภูมิภาคโดยอัตโนมัติ

model_configs[]

AsyncModelConfig

ต้องระบุ ข้อมูลอินพุต/เอาต์พุตของรูปแบบการซื้อแต่ละรูปแบบ เช่น เส้นทางไฟล์และรูปแบบข้อมูล

AsyncModelConfig

ข้อมูลสำหรับการแก้ปัญหาโมเดลการเพิ่มประสิทธิภาพ 1 รายการแบบไม่พร้อมกัน

ช่อง
display_name

string

ไม่บังคับ ชื่อโมเดลที่ผู้ใช้กําหนด ซึ่งผู้ใช้สามารถใช้เป็นชื่อแทนเพื่อติดตามโมเดล

input_config

InputConfig

ต้องระบุ ข้อมูลเกี่ยวกับโมเดลอินพุต

output_config

OutputConfig

ต้องระบุ ข้อมูลตำแหน่งเอาต์พุตที่ต้องการ

BatchOptimizeToursResponse

ประเภทนี้ไม่มีช่อง

การตอบกลับ BatchOptimizeToursRequest ระบบจะแสดงผลลัพธ์นี้ในการดําเนินการแบบดำเนินอยู่นานหลังจากการดำเนินการเสร็จสมบูรณ์

BreakRule

กฎในการสร้างช่วงพักสำหรับยานพาหนะ (เช่น ช่วงพักกลางวัน) ช่วงพักคือช่วงเวลาต่อเนื่องที่ยานพาหนะไม่ได้ทำงานอยู่ที่ตำแหน่งปัจจุบันและไม่สามารถเข้าชมได้ ช่วงพักอาจเกิดขึ้นในกรณีต่อไปนี้

  • ระหว่างการเดินทางระหว่างการเข้าชม 2 ครั้ง (ซึ่งรวมถึงเวลาก่อนหรือหลังการเข้าชม แต่ไม่ใช่ระหว่างการเข้าชม) ในกรณีนี้ ระบบจะขยายเวลาเดินทางที่เกี่ยวข้องระหว่างการเข้าชม
  • หรือก่อนที่รถจะเริ่มทำงาน (รถอาจไม่สตาร์ทในช่วงพัก) ในกรณีนี้ จะไม่ส่งผลต่อเวลาเริ่มต้นของรถ
  • หรือหลังจากสิ้นสุดการให้บริการของยานพาหนะ (เช่นเดียวกับเวลาสิ้นสุดการให้บริการของยานพาหนะ)
ช่อง
break_requests[]

BreakRequest

ลำดับของช่วงพัก ดูข้อความ BreakRequest

frequency_constraints[]

FrequencyConstraint

อาจมี FrequencyConstraint หลายรายการ รายการทั้งหมดต้องเป็นไปตามBreakRequestของBreakRuleนี้ โปรดดูFrequencyConstraint

BreakRequest

คุณต้องทราบลำดับของช่วงพัก (เช่น จำนวนและลำดับ) ที่มีผลกับยานพาหนะแต่ละคันล่วงหน้า BreakRequest ที่ซ้ำกันจะกำหนดลำดับนั้นตามลำดับที่ต้องทำ กรอบเวลา (earliest_start_time / latest_start_time) อาจทับซ้อนกัน แต่ต้องเข้ากันได้กับคำสั่งซื้อ (ระบบจะตรวจสอบ)

ช่อง
earliest_start_time

Timestamp

ต้องระบุ ขอบเขตล่าง (รวม) ของช่วงพัก

latest_start_time

Timestamp

ต้องระบุ ขอบเขตบน (รวม) ของจุดเริ่มต้นของช่วงพัก

min_duration

Duration

ต้องระบุ ระยะเวลาขั้นต่ำของช่วงพัก ต้องเป็นค่าบวก

FrequencyConstraint

คุณสามารถจำกัดความถี่และระยะเวลาของช่วงพักที่ระบุไว้ข้างต้นเพิ่มเติมได้โดยการบังคับใช้ความถี่ของช่วงพักขั้นต่ำ เช่น "ต้องมีช่วงพักอย่างน้อย 1 ชั่วโมงทุก 12 ชั่วโมง" สมมติว่าสามารถตีความได้ว่า "ภายในกรอบเวลาแบบเลื่อนได้ 12 ชั่วโมง ต้องมีช่วงพักอย่างน้อย 1 ชั่วโมงอย่างน้อย 1 ช่วง" ตัวอย่างดังกล่าวจะแปลเป็น FrequencyConstraint ดังนี้

{
   min_break_duration { seconds: 3600 }         # 1 hour.
   max_inter_break_duration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

ช่วงเวลาและระยะเวลาของช่วงพักในโซลูชันจะเป็นไปตามข้อจำกัดดังกล่าวทั้งหมด นอกเหนือจากกรอบเวลาและระยะเวลาขั้นต่ำที่ระบุไว้ใน BreakRequest แล้ว

ในทางปฏิบัติ FrequencyConstraint อาจใช้กับช่วงพักที่ไม่ต่อเนื่อง ตัวอย่างเช่น กำหนดการต่อไปนี้เป็นไปตามตัวอย่าง "1 ชั่วโมงทุก 12 ชั่วโมง"

  04:00 vehicle start
   .. performing travel and visits ..
  09:00 1 hour break
  10:00 end of the break
   .. performing travel and visits ..
  12:00 20-min lunch break
  12:20 end of the break
   .. performing travel and visits ..
  21:00 1 hour break
  22:00 end of the break
   .. performing travel and visits ..
  23:59 vehicle end
ช่อง
min_break_duration

Duration

ต้องระบุ ระยะเวลาขั้นต่ำของช่วงพักสำหรับข้อจำกัดนี้ มีค่าไม่ติดลบ ดูคำอธิบายของ FrequencyConstraint

max_inter_break_duration

Duration

ต้องระบุ ช่วงเวลาสูงสุดที่อนุญาตของเส้นทางที่ไม่มีช่วงพัก duration >= min_break_duration อย่างน้อยบางส่วน ต้องเป็นค่าบวก

DataFormat

รูปแบบข้อมูลสำหรับไฟล์อินพุตและเอาต์พุต

Enum
DATA_FORMAT_UNSPECIFIED ค่าไม่ถูกต้อง รูปแบบต้องไม่ใช่ "ไม่ได้ระบุ"
JSON รูปแบบออบเจ็กต์ JavaScript
PROTO_TEXT รูปแบบข้อความบัฟเฟอร์โปรโตคอล ดูที่ https://protobuf.dev/reference/protobuf/textformat-spec/

DistanceLimit

ขีดจํากัดที่กําหนดระยะทางสูงสุดที่เดินทางได้ โดยอาจเป็นแบบแข็งหรือแบบอ่อนก็ได้

หากกําหนดขีดจํากัดสูงสุดที่อนุญาตไว้ จะต้องกําหนดทั้ง soft_max_meters และ cost_per_kilometer_above_soft_max และต้องไม่เป็นค่าลบ

ช่อง
max_meters

int64

ขีดจํากัดสูงสุดที่กําหนดระยะทางได้ไม่เกิน max_meters ขีดจํากัดต้องไม่ติดลบ

soft_max_meters

int64

ขีดจํากัดแบบไม่บังคับจะไม่บังคับใช้ขีดจํากัดระยะทางสูงสุด แต่หากมีการละเมิด ค่าใช้จ่ายจะเพิ่มขึ้นตามค่าใช้จ่ายอื่นๆ ที่กําหนดไว้ในรูปแบบเดียวกัน

หากมีการกําหนด soft_max_meters ต้องน้อยกว่า max_meters และต้องไม่เป็นค่าลบ

cost_per_kilometer_below_soft_max

double

ค่าใช้จ่ายต่อกิโลเมตรที่เกิดขึ้น ซึ่งเพิ่มขึ้นสูงสุด soft_max_meters โดยสูตรคำนวณดังนี้

  min(distance_meters, soft_max_meters) / 1000.0 *
  cost_per_kilometer_below_soft_max.

route_distance_limit ไม่รองรับค่าใช้จ่ายนี้

cost_per_kilometer_above_soft_max

double

ค่าใช้จ่ายต่อกิโลเมตรที่เกิดขึ้นหากระยะทางเกินขีดจำกัด soft_max_meters ค่าใช้จ่ายเพิ่มเติมจะเป็น 0 หากระยะทางต่ำกว่าขีดจำกัด มิเช่นนั้นสูตรที่ใช้คำนวณค่าใช้จ่ายจะเป็นดังนี้

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

ค่าใช้จ่ายต้องไม่ติดลบ

GcsDestination

ตำแหน่งใน Google Cloud Storage ที่ระบบจะเขียนไฟล์เอาต์พุต

ช่อง
uri

string

ต้องระบุ URI ของ Google Cloud Storage

GcsSource

ตำแหน่ง Google Cloud Storage ที่ระบบจะอ่านไฟล์อินพุต

ช่อง
uri

string

ต้องระบุ URI ของออบเจ็กต์ Google Cloud Storage ที่มีรูปแบบ gs://bucket/path/to/object

InjectedSolutionConstraint

โซลูชันที่แทรกในคําขอ รวมถึงข้อมูลเกี่ยวกับการเข้าชมที่ต้องจํากัดและวิธีจํากัด

ช่อง
routes[]

ShipmentRoute

เส้นทางของโซลูชันที่จะแทรก ระบบอาจละเว้นเส้นทางบางเส้นทางจากโซลูชันเดิม เส้นทางและการจัดส่งที่ข้ามต้องเป็นไปตามสมมติฐานพื้นฐานเกี่ยวกับความถูกต้องที่ระบุไว้สำหรับ injected_first_solution_routes

skipped_shipments[]

SkippedShipment

ข้ามการจัดส่งโซลูชันที่จะแทรก บางรายการอาจไม่รวมอยู่ในโซลูชันต้นฉบับ ดูที่ช่อง routes

constraint_relaxations[]

ConstraintRelaxation

สำหรับกลุ่มยานพาหนะตั้งแต่ 0 กลุ่มขึ้นไป ให้ระบุเวลาและจำนวนที่จะผ่อนคลายข้อจำกัด หากช่องนี้ว่างเปล่า เส้นทางยานพาหนะที่ไม่ใช่ค่าว่างทั้งหมดจะถูกจำกัดอย่างสมบูรณ์

ConstraintRelaxation

สําหรับกลุ่มยานพาหนะ ให้ระบุเกณฑ์ที่ระบบจะผ่อนคลายข้อจํากัดการเข้าชมและระดับที่ผ่อนคลาย ระบบจะข้ามการจัดส่งที่แสดงในช่อง skipped_shipment กล่าวคือ การดำเนินการดังกล่าวจะดำเนินการไม่ได้

ช่อง
relaxations[]

Relaxation

การผ่อนคลายข้อจำกัดการเข้าชมทั้งหมดที่จะมีผลกับการเข้าชมในเส้นทางที่มียานพาหนะใน vehicle_indices

vehicle_indices[]

int32

ระบุดัชนียานพาหนะที่ข้อจำกัดการเข้าชม relaxations มีผล หากว่างเปล่า ระบบจะถือว่าค่านี้เป็นค่าเริ่มต้นและ relaxations จะมีผลกับยานพาหนะทั้งหมดที่ไม่ได้ระบุไว้ใน constraint_relaxations อื่นๆ มีค่าเริ่มต้นได้สูงสุด 1 ค่าเท่านั้น เช่น อนุญาตให้ช่องการผ่อนคลายข้อจำกัดว่างได้สูงสุด 1 ช่อง vehicle_indices ดัชนียานพาหนะจะแสดงได้เพียงครั้งเดียว แม้ว่าจะอยู่ใน constraint_relaxations หลายรายการก็ตาม

ดัชนียานพาหนะจะแมปเหมือนกับ ShipmentRoute.vehicle_index หาก interpret_injected_solutions_using_labels เป็นจริง (ดูความคิดเห็น fields)

การพักผ่อน

หาก relaxations ว่างเปล่า ระบบจะจำกัดเวลาเริ่มต้นและลําดับการเข้าชมทั้งหมดใน routes อย่างสมบูรณ์ และจะไม่แทรกหรือเพิ่มการเข้าชมใหม่ลงในเส้นทางเหล่านั้น นอกจากนี้ เวลาเริ่มต้นและสิ้นสุดของยานพาหนะใน routes จะถูกจำกัดอย่างสมบูรณ์ เว้นแต่ยานพาหนะจะว่างเปล่า (กล่าวคือ ไม่มีการเข้าชมและตั้งค่า used_if_route_is_empty เป็นเท็จในโมเดล)

relaxations(i).level ระบุระดับการผ่อนคลายข้อจำกัดที่ใช้กับการเข้าชม #j ที่ตรงกับเงื่อนไขต่อไปนี้

  • route.visits(j).start_time >= relaxations(i).threshold_time AND
  • j + 1 >= relaxations(i).threshold_visit_count

ในทำนองเดียวกัน ระบบจะผ่อนปรนการสตาร์ทยานพาหนะเป็น relaxations(i).level หากมีคุณสมบัติตรงตามข้อกำหนดต่อไปนี้

  • vehicle_start_time >= relaxations(i).threshold_time AND
  • relaxations(i).threshold_visit_count == 0 และปลายรถจะผ่อนปรนเป็น relaxations(i).level หากเป็นไปตามข้อกำหนดต่อไปนี้
  • vehicle_end_time >= relaxations(i).threshold_time AND
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

หากต้องการใช้ระดับการผ่อนคลายในกรณีที่การเข้าชมตรงกับ threshold_visit_count หรือ threshold_time ให้เพิ่ม relaxations 2 รายการที่มี level เดียวกัน โดยรายการหนึ่งตั้งค่าเป็น threshold_visit_count เท่านั้น และอีกรายการตั้งค่าเป็น threshold_time เท่านั้น หากการเข้าชมตรงตามเงื่อนไขของ relaxations หลายรายการ ระบบจะใช้ระดับที่ผ่อนปรนที่สุด ด้วยเหตุนี้ ตั้งแต่จุดเริ่มต้นของยานพาหนะไปจนถึงจุดสิ้นสุดของยานพาหนะ ระดับความผ่อนคลายจะผ่อนคลายมากขึ้น กล่าวคือ ระดับความผ่อนคลายจะไม่ลดลงเมื่อเส้นทางดำเนินไป

ช่วงเวลาและลําดับการเข้าชมเส้นทางที่ไม่เป็นไปตามเงื่อนไขเกณฑ์ของ relaxations ใดๆ จะถูกจํากัดอย่างสมบูรณ์และจะไม่มีการแทรกการเข้าชมลงในลําดับเหล่านี้ นอกจากนี้ หากการเริ่มต้นหรือสิ้นสุดของยานพาหนะไม่เป็นไปตามเงื่อนไขของการผ่อนปรนใดๆ ระบบจะกำหนดเวลาให้คงที่ เว้นแต่ว่ายานพาหนะจะว่างเปล่า

ช่อง
level

Level

ระดับการผ่อนคลายข้อจำกัดที่มีผลเมื่อเงื่อนไขตั้งแต่ threshold_time ขึ้นไป AND threshold_visit_count เป็นอย่างน้อย

threshold_time

Timestamp

เวลาที่จะใช้การผ่อนปรน level

threshold_visit_count

int32

จํานวนการเข้าชมที่จะเริ่มใช้การผ่อนปรน level หาก threshold_visit_count เป็น 0 (หรือไม่ได้ตั้งค่า) ระบบอาจใช้ level โดยตรงเมื่อยานพาหนะเริ่มทำงาน

หากเป็น route.visits_size() + 1 level จะมีผลกับปลายทางของยานพาหนะเท่านั้น หากมากกว่า route.visits_size() + 1 ระบบจะไม่ใช้ level กับเส้นทางนั้นเลย

ระดับ

แสดงระดับการผ่อนคลายข้อจำกัดต่างๆ ซึ่งมีผลกับการเข้าชมและการเข้าชมที่ตามมาเมื่อเป็นไปตามเงื่อนไขเกณฑ์

การแจกแจงด้านล่างนี้จัดเรียงตามระดับความผ่อนคลายที่เพิ่มขึ้น

Enum
LEVEL_UNSPECIFIED

ระดับการผ่อนคลายเริ่มต้นโดยนัย: ไม่มีการผ่อนคลายข้อจำกัด กล่าวคือ การเข้าชมทั้งหมดถูกจํากัดอย่างเต็มรูปแบบ

ต้องไม่ใช้ค่านี้ใน level

RELAX_VISIT_TIMES_AFTER_THRESHOLD ระบบจะผ่อนปรนเวลาเริ่มต้นของการเข้าชมและเวลาเริ่มต้น/สิ้นสุดของยานพาหนะ แต่การเข้าชมแต่ละครั้งจะยังคงเชื่อมโยงกับยานพาหนะคันเดียวกันและต้องเป็นไปตามลําดับการเข้าชม โดยจะต้องไม่มีการแทรกการเข้าชมระหว่างหรือก่อนการเข้าชม
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD เหมือนกับ RELAX_VISIT_TIMES_AFTER_THRESHOLD แต่ลำดับการเข้าชมจะผ่อนปรนด้วย โดยการเข้าชมจะดำเนินการโดยยานพาหนะคันนี้เท่านั้น แต่อาจไม่ดำเนินการ
RELAX_ALL_AFTER_THRESHOLD เหมือนกับ RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD แต่ยานพาหนะจะผ่อนปรนด้วยเช่นกัน นั่นคือการเข้าชมจะฟรีโดยสมบูรณ์เมื่อถึงหรือหลังจากเวลาที่กำหนด และอาจไม่มีการเรียกใช้

InputConfig

ระบุอินพุตสําหรับ [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours]

ช่อง
data_format

DataFormat

ต้องระบุ รูปแบบข้อมูลอินพุต

ฟิลด์สหภาพ source ต้องระบุ source ต้องเป็นค่าใดค่าหนึ่งต่อไปนี้เท่านั้น
gcs_source

GcsSource

ตำแหน่งของ Google Cloud Storage โดยต้องเป็นออบเจ็กต์ (ไฟล์) รายการเดียว

ตำแหน่ง

บรรจุสถานที่ตั้ง (จุดทางภูมิศาสตร์และส่วนหัวที่ไม่บังคับ)

ช่อง
lat_lng

LatLng

พิกัดทางภูมิศาสตร์ของจุดสังเกต

heading

int32

เข็มทิศที่เชื่อมโยงกับทิศทางของการเข้าชม ค่านี้ใช้เพื่อระบุฝั่งถนนที่จะใช้รับและส่งผู้โดยสาร ค่าทิศทางมีตั้งแต่ 0 ถึง 360 โดยที่ 0 ระบุทิศทางเป็นทิศเหนือ 90 ระบุทิศทางเป็นทิศตะวันออก เป็นต้น

OptimizeToursRequest

คำขอที่จะส่งไปยังโปรแกรมโซลูชันการเพิ่มประสิทธิภาพทัวร์ชม ซึ่งจะกำหนดรูปแบบการจัดส่งที่จะแก้ปัญหา รวมถึงพารามิเตอร์การเพิ่มประสิทธิภาพ

ช่อง
parent

string

ต้องระบุ กำหนดเป้าหมายโปรเจ็กต์หรือสถานที่เพื่อโทร

รูปแบบ: * projects/{project-id} * projects/{project-id}/locations/{location-id}

หากไม่ได้ระบุสถานที่ ระบบจะเลือกภูมิภาคโดยอัตโนมัติ

timeout

Duration

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

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

model

ShipmentModel

รูปแบบการจัดส่งที่จะแก้ปัญหา

solving_mode

SolvingMode

โดยค่าเริ่มต้น โหมดการแก้ปัญหาจะเป็น DEFAULT_SOLVE (0)

search_mode

SearchMode

โหมดการค้นหาที่ใช้เพื่อแก้ปัญหา

injected_first_solution_routes[]

ShipmentRoute

แนะนําอัลกอริทึมการเพิ่มประสิทธิภาพในการค้นหาวิธีแก้ปัญหาแรกซึ่งคล้ายกับวิธีแก้ปัญหาก่อนหน้า

โมเดลถูกจํากัดเมื่อสร้างโซลูชันแรก ระบบจะข้ามการจัดส่งที่ไม่ได้ดำเนินการในเส้นทางหนึ่งๆ โดยปริยายในโซลูชันแรก แต่อาจดำเนินการในโซลูชันต่อๆ ไป

โซลูชันต้องเป็นไปตามสมมติฐานพื้นฐานบางอย่างเกี่ยวกับความถูกต้อง ดังนี้

  • สำหรับทุกเส้นทาง vehicle_index ต้องอยู่ในช่วงและไม่ซ้ำกัน
  • สําหรับการเข้าชมทั้งหมด shipment_index และ visit_request_index ต้องอยู่ในช่วง
  • การจัดส่งจะอ้างอิงในเส้นทางเดียวเท่านั้น
  • คุณต้องดำเนินการรับพัสดุแบบรับและนำส่งก่อนการนำส่ง
  • คุณจะดำเนินการรับสินค้าหรือการนำส่งสินค้าด้วยวิธีอื่นได้ไม่เกิน 1 วิธี
  • สำหรับทุกเส้นทาง เวลาจะเพิ่มขึ้น (เช่น vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time)
  • การจัดส่งจะต้องดำเนินการกับยานพาหนะที่อนุญาตเท่านั้น อนุญาตให้แสดงยานพาหนะได้หาก Shipment.allowed_vehicle_indices ว่างเปล่าหรือ vehicle_index ของยานพาหนะรวมอยู่ใน Shipment.allowed_vehicle_indices

หากโซลูชันที่แทรกไม่สามารถทำได้ ระบบอาจไม่แสดงข้อผิดพลาดในการตรวจสอบและแสดงข้อผิดพลาดที่ระบุว่าไม่สามารถทำได้แทน

injected_solution_constraint

InjectedSolutionConstraint

จำกัดอัลกอริทึมการเพิ่มประสิทธิภาพเพื่อค้นหาวิธีแก้ปัญหาสุดท้ายที่คล้ายกับวิธีแก้ปัญหาก่อนหน้า เช่น สามารถใช้เพื่อหยุดเส้นทางบางส่วนที่เสร็จสมบูรณ์แล้วหรือที่กำลังจะเสร็จสมบูรณ์แต่ต้องไม่แก้ไข

หากโซลูชันที่แทรกไม่สามารถทำได้ ระบบอาจไม่แสดงข้อผิดพลาดในการตรวจสอบและแสดงข้อผิดพลาดที่ระบุว่าไม่สามารถทำได้แทน

refresh_details_routes[]

ShipmentRoute

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

ณ วันที่ 11/2020 การดำเนินการนี้จะสร้างเฉพาะเส้นประกอบของเส้นทางที่ไม่ใช่ "ว่าง" และกำหนดให้ populate_polylines เป็น "จริง"

ฟิลด์ route_polyline ของเส้นทางที่ส่งมาอาจไม่สอดคล้องกับเส้นทาง transitions

ห้ามใช้ช่องนี้ร่วมกับ injected_first_solution_routes หรือ injected_solution_constraint

Shipment.ignore และ Vehicle.ignore ไม่มีผลต่อลักษณะการทํางาน ระบบจะยังคงสร้างเส้นประกอบระหว่างการเข้าชมทั้งหมดในเส้นทางที่ไม่ใช่ "ว่าง" ทั้งหมด ไม่ว่าจะละเว้นการจัดส่งหรือยานพาหนะที่เกี่ยวข้องหรือไม่ก็ตาม

interpret_injected_solutions_using_labels

bool

เงื่อนไข "เป็นจริง"

  • ใช้ ShipmentRoute.vehicle_label แทน vehicle_index เพื่อจับคู่เส้นทางในโซลูชันที่แทรกกับยานพาหนะในคำขอ ใช้การแมป ShipmentRoute.vehicle_index เดิมกับ ShipmentRoute.vehicle_index ใหม่เพื่ออัปเดต ConstraintRelaxation.vehicle_indices หากไม่ใช่ค่าว่าง แต่การแมปต้องไม่คลุมเครือ (นั่นคือ ShipmentRoute หลายรายการต้องไม่ใช้ vehicle_index เดิมเดียวกัน)
  • ใช้ ShipmentRoute.Visit.shipment_label แทน shipment_index เพื่อจับคู่การเข้าชมในโซลูชันที่แทรกกับการจัดส่งในคําขอ
  • ใช้ SkippedShipment.label แทน SkippedShipment.index เพื่อจับคู่การจัดส่งที่ข้ามในโซลูชันที่แทรกกับการจัดส่งคำขอ

การตีความนี้มีผลกับช่อง injected_first_solution_routes, injected_solution_constraint และ refresh_details_routes ซึ่งจะใช้ได้เมื่อดัชนีการจัดส่งหรือยานพาหนะในคำขอมีการเปลี่ยนแปลงนับตั้งแต่สร้างโซลูชัน ซึ่งอาจเป็นเพราะมีการนําการจัดส่งหรือยานพาหนะออกจากหรือเพิ่มลงในคําขอ

หากเป็น "จริง" ป้ายกำกับในหมวดหมู่ต่อไปนี้ต้องปรากฏในหมวดหมู่นั้นๆ ไม่เกิน 1 ครั้ง

หาก vehicle_label ในโซลูชันที่แทรกไม่ตรงกับยานพาหนะที่ขอ ระบบจะนำเส้นทางที่เกี่ยวข้องออกจากโซลูชันพร้อมกับการเข้าชม หาก shipment_label ในโซลูชันที่แทรกไม่ตรงกับการนําส่งคําขอ ระบบจะนำการเข้าชมที่เกี่ยวข้องออกจากโซลูชัน หาก SkippedShipment.label ในโซลูชันที่แทรกไม่ตรงกับคำขอจัดส่ง ระบบจะนำ SkippedShipment ออกจากโซลูชัน

การนําการเข้าชมเส้นทางหรือทั้งเส้นทางออกจากโซลูชันที่แทรกอาจส่งผลต่อข้อจํากัดโดยนัย ซึ่งอาจทําให้เกิดการเปลี่ยนแปลงโซลูชัน ข้อผิดพลาดในการตรวจสอบ หรือความเป็นไปไม่ได้

หมายเหตุ: ผู้โทรต้องตรวจสอบว่า Vehicle.label (resp. Shipment.label) ระบุเอนทิตียานพาหนะ (หรือการจัดส่ง) ที่ใช้กับคําขอที่เกี่ยวข้อง 2 รายการ ได้แก่ คําขอที่ผ่านมาซึ่งสร้าง OptimizeToursResponse ที่ใช้กับโซลูชันที่แทรก และคำขอปัจจุบันที่มีโซลูชันที่แทรก การตรวจสอบความเป็นเอกลักษณ์ที่อธิบายไว้ข้างต้นไม่เพียงพอที่จะรับประกันข้อกำหนดนี้

consider_road_traffic

bool

พิจารณาการประมาณการเข้าชมในการคำนวณช่อง ShipmentRoute Transition.travel_duration, Visit.start_time และ vehicle_end_time ในการตั้งค่าช่อง ShipmentRoute.has_traffic_infeasibilities และในการคำนวณช่อง OptimizeToursResponse.total_cost

populate_polylines

bool

หากเป็น "จริง" ระบบจะสร้างเส้นประกอบในShipmentRouteการตอบกลับ

populate_transition_polylines

bool

หากเป็น "จริง" ระบบจะป้อนข้อมูลเส้นประกอบและโทเค็นเส้นทางในการตอบกลับ ShipmentRoute.transitions

allow_large_deadline_despite_interruption_risk

bool

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

use_geodesic_distances

bool

หากเป็นจริง ระบบจะคํานวณระยะทางในการเดินทางโดยใช้ระยะทางตามแนวเส้นโค้งแทนระยะทางของ Google Maps และคำนวณเวลาในการเดินทางโดยใช้ระยะทางตามแนวเส้นโค้งที่มีความเร็วที่กําหนดโดย geodesic_meters_per_second

label

string

ป้ายกำกับที่อาจใช้ระบุคำขอนี้ซึ่งรายงานกลับใน OptimizeToursResponse.request_label

geodesic_meters_per_second

double

เมื่อ use_geodesic_distances เป็นจริง จะต้องตั้งค่าช่องนี้และกำหนดความเร็วที่ใช้คำนวณเวลาเดินทาง ค่าของความเร็วในการส่งข้อมูลต้องไม่ต่ำกว่า 1.0 เมตร/วินาที

max_validation_errors

int32

ตัดจำนวนข้อผิดพลาดในการตรวจสอบที่แสดงผล โดยปกติแล้ว ข้อผิดพลาดเหล่านี้จะแนบไปกับเพย์โหลดข้อผิดพลาด INVALID_ARGUMENT เป็นรายละเอียดข้อผิดพลาด BadRequest (https://cloud.google.com/apis/design/errors#error_details) เว้นแต่ว่า solving_mode=VALIDATE_ONLY: ดูช่อง OptimizeToursResponse.validation_errors ค่าเริ่มต้นคือ 100 และสูงสุด 10,000

SearchMode

โหมดที่กําหนดลักษณะการทํางานของการค้นหา โดยแลกเปลี่ยนเวลาในการตอบสนองกับคุณภาพของโซลูชัน ระบบจะบังคับใช้กำหนดเวลาของคำขอทั่วโลกในทุกโหมด

Enum
SEARCH_MODE_UNSPECIFIED โหมดการค้นหาที่ไม่ระบุ ซึ่งเทียบเท่ากับ RETURN_FAST
RETURN_FAST หยุดการค้นหาหลังจากพบวิธีแก้ปัญหาแรกที่ได้ผล
CONSUME_ALL_AVAILABLE_TIME ใช้เวลาทั้งหมดที่มีเพื่อค้นหาวิธีแก้ปัญหาที่ดีกว่า

SolvingMode

กำหนดวิธีที่โปรแกรมแก้ปัญหาควรจัดการกับคำขอ ในโหมดทั้งหมดยกเว้น VALIDATE_ONLY หากคําขอไม่ถูกต้อง คุณจะได้รับข้อผิดพลาด INVALID_REQUEST ดู max_validation_errors เพื่อจำกัดจำนวนข้อผิดพลาดที่แสดง

Enum
DEFAULT_SOLVE แก้ปัญหาโมเดล ระบบอาจแสดงคำเตือนใน [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.validation_errors]
VALIDATE_ONLY ตรวจสอบโมเดลเท่านั้นโดยไม่แก้: สร้าง OptimizeToursResponse.validation_errors ให้ได้มากที่สุด
DETECT_SOME_INFEASIBLE_SHIPMENTS

แสดงเฉพาะ OptimizeToursResponse.validation_errors หรือ OptimizeToursResponse.skipped_shipments เท่านั้น และไม่ได้แก้ปัญหาที่เหลือ (status และ routes จะไม่ได้รับการตั้งค่าในการตอบกลับ) หากตรวจพบเส้นทาง injected_solution_constraint ที่ใช้ไม่ได้ ระบบจะป้อนข้อมูลในช่อง OptimizeToursResponse.validation_errors และปล่อย OptimizeToursResponse.skipped_shipments ว่างไว้

สำคัญ: ระบบจะไม่แสดงการจัดส่งที่ไม่สามารถทำได้ทั้งหมดที่นี่ แต่เฉพาะการจัดส่งที่ตรวจพบว่าไม่สามารถทำได้ในระหว่างการประมวลผลก่อน

OptimizeToursResponse

การตอบกลับหลังจากแก้ปัญหาการเพิ่มประสิทธิภาพการทัวร์ชมซึ่งมีเส้นทางที่ยานพาหนะแต่ละคันใช้ การจัดส่งที่ข้ามไป และต้นทุนโดยรวมของโซลูชัน

ช่อง
routes[]

ShipmentRoute

เส้นทางที่คำนวณสำหรับยานพาหนะแต่ละคัน โดยเส้นทางที่ i จะสอดคล้องกับยานพาหนะลำดับที่ i ในโมเดล

request_label

string

สําเนาของ OptimizeToursRequest.label หากมีการระบุป้ายกํากับในคําขอ

skipped_shipments[]

SkippedShipment

รายการการจัดส่งทั้งหมดที่ข้าม

validation_errors[]

OptimizeToursValidationError

รายการข้อผิดพลาดทั้งหมดในการตรวจสอบที่เราตรวจพบได้ ดูคำอธิบาย "ข้อผิดพลาดหลายรายการ" สำหรับข้อความ OptimizeToursValidationError ในกรณีนี้ solving_mode จะแสดงคำเตือนแทนข้อผิดพลาดDEFAULT_SOLVE

metrics

Metrics

เมตริกระยะเวลา ระยะทาง และการใช้งานสําหรับโซลูชันนี้

เมตริก

เมตริกโดยรวมที่รวบรวมจากทุกเส้นทาง

ช่อง
aggregated_route_metrics

AggregatedMetrics

รวบรวมจากเส้นทางต่างๆ เมตริกแต่ละรายการคือผลรวม (หรือค่าสูงสุดสําหรับการโหลด) ของช่อง ShipmentRoute.metrics ทั้งหมดที่มีชื่อเดียวกัน

skipped_mandatory_shipment_count

int32

จำนวนการจัดส่งที่ต้องข้าม

used_vehicle_count

int32

จํานวนยานพาหนะที่ใช้งาน หมายเหตุ: หากเส้นทางของยานพาหนะว่างเปล่าและ Vehicle.used_if_route_is_empty เป็น "จริง" ระบบจะถือว่ายานพาหนะดังกล่าวเป็นยานพาหนะที่ใช้แล้ว

earliest_vehicle_start_time

Timestamp

เวลาเริ่มต้นเร็วที่สุดของยานพาหนะมือสอง ซึ่งคํานวณจากค่าต่ำสุดของ ShipmentRoute.vehicle_start_time สำหรับยานพาหนะมือสองทั้งหมด

latest_vehicle_end_time

Timestamp

เวลาสิ้นสุดล่าสุดของยานพาหนะมือสอง ซึ่งคํานวณเป็นค่าสูงสุดของ ShipmentRoute.vehicle_end_time ในยานพาหนะมือสองทั้งหมด

costs

map<string, double>

ค่าใช้จ่ายของโซลูชันที่แจกแจงตามช่องคำขอที่เกี่ยวข้องกับค่าใช้จ่าย คีย์คือเส้นทางโปรโตคอลซึ่งสัมพันธ์กับอินพุต OptimizeToursRequest เช่น "model.shipments.pickups.cost" และค่าคือต้นทุนทั้งหมดที่สร้างขึ้นจากช่องต้นทุนที่เกี่ยวข้อง ซึ่งรวบรวมจากโซลูชันทั้งหมด กล่าวคือ costs["model.shipments.pickups.cost"] คือผลรวมของค่าบริการรับสินค้าทั้งหมดในโซลูชัน ระบบจะรายงานต้นทุนทั้งหมดที่กําหนดไว้ในรูปแบบโดยละเอียดที่นี่ ยกเว้นต้นทุนที่เกี่ยวข้องกับ TransitionAttributes ซึ่งจะรายงานแบบรวมเท่านั้น ณ วันที่ 01/2022

total_cost

double

ต้นทุนรวมของโซลูชัน ผลรวมของค่าทั้งหมดในแผนที่ต้นทุน

OptimizeToursValidationError

อธิบายข้อผิดพลาดหรือคำเตือนที่พบเมื่อตรวจสอบ OptimizeToursRequest

ช่อง
code

int32

ข้อผิดพลาดในการตรวจสอบจะกำหนดโดยคู่ (code, display_name) ซึ่งจะปรากฏอยู่เสมอ

ช่องต่างๆ ที่อยู่ถัดจากส่วนนี้จะให้บริบทเพิ่มเติมเกี่ยวกับข้อผิดพลาด

ข้อผิดพลาดหลายรายการ: เมื่อมีข้อผิดพลาดหลายรายการ กระบวนการตรวจสอบจะพยายามแสดงข้อผิดพลาดหลายรายการ กระบวนการนี้ไม่สมบูรณ์แบบเช่นเดียวกับคอมไพเลอร์ ข้อผิดพลาดในการตรวจสอบบางอย่างจะเป็น "ข้อผิดพลาดร้ายแรง" ซึ่งหมายความว่าจะหยุดกระบวนการตรวจสอบทั้งหมด กรณีนี้รวมถึงข้อผิดพลาด display_name="UNSPECIFIED" และอื่นๆ ข้อผิดพลาดบางรายการอาจทําให้กระบวนการตรวจสอบข้ามข้อผิดพลาดอื่นๆ

ความเสถียร: code และ display_name ควรมีความเสถียรมาก แต่รหัสและชื่อที่แสดงใหม่อาจปรากฏขึ้นเมื่อเวลาผ่านไป ซึ่งอาจทําให้คําขอ (ไม่ถูกต้อง) หนึ่งๆ ให้คู่ (code, display_name) อื่น เนื่องจากข้อผิดพลาดใหม่ซ่อนข้อผิดพลาดเก่าไว้ เช่น ดู "ข้อผิดพลาดหลายรายการ"

display_name

string

ชื่อที่แสดงของข้อผิดพลาด

fields[]

FieldReference

บริบทของข้อผิดพลาดอาจเกี่ยวข้องกับฟิลด์ 0, 1 (ส่วนใหญ่) หรือมากกว่า ตัวอย่างเช่น การอ้างอิงถึงการไปรับรถคันที่ 4 และการจัดส่งที่ 2 ครั้งแรกทำได้ดังนี้

fields { name: "vehicles" index: 4}
fields { name: "shipments" index: 2 sub_field {name: "pickups" index: 0} }

อย่างไรก็ตาม โปรดทราบว่า Cardinality ของ fields ไม่ควรเปลี่ยนแปลงสำหรับรหัสข้อผิดพลาดหนึ่งๆ

error_message

string

สตริงที่มนุษย์อ่านได้ซึ่งอธิบายข้อผิดพลาด มีการแมป 1:1 ระหว่าง code กับ error_message (เมื่อรหัส != "UNSPECIFIED")

ความเสถียร: ไม่เสถียร: ข้อความแสดงข้อผิดพลาดที่เชื่อมโยงกับ code หนึ่งๆ อาจเปลี่ยนแปลงได้ (หวังว่าจะเพื่อชี้แจงให้ชัดเจนขึ้น) เมื่อเวลาผ่านไป โปรดใช้ display_name และ code แทน

offending_values

string

อาจมีค่าของช่อง แต่ฟีเจอร์นี้อาจไม่พร้อมใช้งานเสมอไป คุณไม่ควรใช้ฟีเจอร์นี้และควรใช้เพื่อแก้ไขข้อบกพร่องของโมเดลด้วยตนเองเท่านั้น

FieldReference

ระบุบริบทสําหรับข้อผิดพลาดในการตรวจสอบ FieldReference จะอ้างอิงถึงฟิลด์หนึ่งๆ ในไฟล์นี้เสมอและเป็นไปตามโครงสร้างตามลําดับชั้นเดียวกัน ตัวอย่างเช่น เราอาจระบุองค์ประกอบ #2 ของ start_time_windows ในยานพาหนะ #5 โดยใช้

name: "vehicles" index: 5 sub_field { name: "end_time_windows" index: 2 }

อย่างไรก็ตาม เราจะไม่ใส่เอนทิตีระดับบนสุด เช่น OptimizeToursRequest หรือ ShipmentModel เพื่อไม่ให้ข้อความดูรก

ช่อง
name

string

ชื่อฟิลด์ เช่น "vehicles"

sub_field

FieldReference

ช่องย่อยที่ฝังแบบซ้ำซ้อน หากจำเป็น

ฟิลด์สหภาพ index_or_key

index_or_key ต้องเป็นค่าใดค่าหนึ่งต่อไปนี้เท่านั้น

index

int32

ดัชนีของช่องหากซ้ำ

key

string

คีย์หากช่องเป็นแผนที่

OutputConfig

ระบุปลายทางสำหรับผลลัพธ์ของ [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours]

ช่อง
data_format

DataFormat

ต้องระบุ รูปแบบข้อมูลเอาต์พุต

ฟิลด์สหภาพ destination ต้องระบุ destination ต้องเป็นค่าใดค่าหนึ่งต่อไปนี้เท่านั้น
gcs_destination

GcsDestination

ตำแหน่ง Google Cloud Storage ที่จะเขียนเอาต์พุต

RouteModifiers

บรรจุชุดเงื่อนไขที่ไม่บังคับเพื่อใช้เมื่อคำนวณเส้นทางของยานพาหนะ ซึ่งคล้ายกับ RouteModifiers ใน Routes Preferred API ของ Google Maps Platform โปรดดูที่ https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers

ช่อง
avoid_tolls

bool

ระบุว่าจะหลีกเลี่ยงถนนที่เรียกเก็บค่าผ่านทางหรือไม่ ระบบจะให้ความสำคัญกับเส้นทางที่ไม่มีถนนที่ต้องเสียค่าผ่านทาง ใช้ได้กับโหมดการเดินทางที่ใช้เครื่องยนต์เท่านั้น

avoid_highways

bool

ระบุว่าจะเลี่ยงทางหลวงหรือไม่ ระบบจะให้ความสำคัญกับเส้นทางที่ไม่มีทางหลวง ใช้ได้กับโหมดการเดินทางที่ใช้เครื่องยนต์เท่านั้น

avoid_ferries

bool

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

avoid_indoor

bool

ไม่บังคับ ระบุว่าจะหลีกเลี่ยงการนำทางภายในอาคารหรือไม่ ระบบจะให้ความสำคัญกับเส้นทางที่ไม่มีการนำทางในอาคาร ใช้กับโหมดการเดินทาง WALKING เท่านั้น

การจัดส่ง

การจัดส่งสินค้ารายการเดียว ตั้งแต่การยกขึ้นรถครั้งหนึ่งไปจนถึงการนำส่งครั้งหนึ่ง เพื่อให้ระบบถือว่ามีการจัดส่งเกิดขึ้น รถคันเดียวต้องไปที่จุดรับสินค้าแห่งหนึ่ง (และลดกำลังการผลิตที่เหลือตามนั้น) จากนั้นไปที่จุดนำส่งแห่งหนึ่งในภายหลัง (และเพิ่มกำลังการผลิตที่เหลือตามนั้นอีกครั้ง)

ช่อง
display_name

string

ชื่อที่แสดงของการจัดส่งที่ผู้ใช้กำหนด โดยชื่อมีความยาวได้สูงสุด 63 อักขระ และใช้อักขระ UTF-8 ได้

pickups[]

VisitRequest

ชุดตัวเลือกการรับพัสดุที่เชื่อมโยงกับการจัดส่ง หากไม่ได้ระบุ ยานพาหนะจะต้องไปที่สถานที่ที่สอดคล้องกับการนำส่งเท่านั้น

deliveries[]

VisitRequest

ชุดตัวเลือกการนำส่งที่เชื่อมโยงกับการจัดส่ง หากไม่ได้ระบุ ยานพาหนะจะต้องไปที่สถานที่ที่สอดคล้องกับการรับส่งเท่านั้น

load_demands

map<string, Load>

ความต้องการในการบรรทุกของการจัดส่ง (เช่น น้ำหนัก ปริมาณ จำนวนพาเลต ฯลฯ) คีย์ในแผนที่ควรเป็นตัวระบุที่อธิบายประเภทของโหลดที่เกี่ยวข้อง และควรระบุหน่วยด้วย เช่น "weight_kg", "volume_gallons", "pallet_count" เป็นต้น หากคีย์หนึ่งๆ ไม่ปรากฏในแผนที่ ระบบจะถือว่าการโหลดที่เกี่ยวข้องเป็นค่าว่าง

allowed_vehicle_indices[]

int32

ชุดยานพาหนะที่อาจทำการขนส่งนี้ หากเป็นค่าว่าง หมายความว่ารถทุกรุ่นจะดำเนินการได้ ยานพาหนะจะแสดงตามดัชนีในรายการ vehicles ของ ShipmentModel

costs_per_vehicle[]

double

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

  • มีจำนวนองค์ประกอบเท่ากับ costs_per_vehicle_indices costs_per_vehicle[i] สอดคล้องกับยานพาหนะ costs_per_vehicle_indices[i] ของรุ่น
  • จำนวนองค์ประกอบเท่ากับจำนวนยานพาหนะในโมเดล องค์ประกอบที่ i สอดคล้องกับยานพาหนะ #i ของรุ่น

ค่าใช้จ่ายเหล่านี้ต้องเป็นหน่วยเดียวกับ penalty_cost และต้องไม่เป็นค่าลบ ปล่อยช่องนี้ว่างไว้หากไม่มีค่าใช้จ่ายดังกล่าว

costs_per_vehicle_indices[]

int32

ดัชนีของยานพาหนะที่ costs_per_vehicle มีผล หากไม่ใช่ค่าว่าง costs_per_vehicle ต้องมีจำนวนองค์ประกอบเท่ากับ costs_per_vehicle ระบุดัชนียานพาหนะได้ไม่เกิน 1 ครั้ง หากยานพาหนะไม่รวมอยู่ใน costs_per_vehicle_indices ค่าของยานพาหนะจะเป็น 0

pickup_to_delivery_absolute_detour_limit

Duration

ระบุเวลาอ้อมทางสูงสุดสัมบูรณ์เทียบกับเส้นทางที่สั้นที่สุดตั้งแต่การไปรับจนถึงการนำส่ง หากระบุ ต้องไม่เป็นค่าลบ และการจัดส่งต้องมีการรับสินค้าและการนำส่งอย่างน้อย 1 รายการ

ตัวอย่างเช่น สมมติให้ t เป็นเวลาที่สั้นที่สุดจากทางเลือกการรับสินค้าซึ่งเลือกไว้ไปยังทางเลือกการนำส่งซึ่งเลือกไว้โดยตรง จากนั้นการตั้งค่า pickup_to_delivery_absolute_detour_limit จะบังคับใช้สิ่งต่อไปนี้

start_time(delivery) - start_time(pickup) <=
t + pickup_to_delivery_absolute_detour_limit

หากระบุทั้งขีดจำกัดแบบสัมพัทธ์และแบบสัมบูรณ์ในการจัดส่งเดียวกัน ระบบจะใช้ขีดจำกัดที่จำกัดมากกว่าสำหรับคู่การรับ/การนำส่งที่เป็นไปได้แต่ละคู่ ในเดือนตุลาคม 2017 ระบบรองรับการอ้อมเส้นทางเฉพาะในกรณีที่ระยะเวลาเดินทางไม่ขึ้นอยู่กับยานพาหนะ

pickup_to_delivery_time_limit

Duration

ระบุระยะเวลาสูงสุดตั้งแต่เริ่มรับพัสดุไปจนถึงเริ่มนำส่งพัสดุ หากระบุ ต้องไม่เป็นค่าลบ และการจัดส่งต้องมีการรับสินค้าและการนำส่งอย่างน้อย 1 รายการ ซึ่งไม่ได้ขึ้นอยู่กับว่าเลือกตัวเลือกใดสำหรับการรับและการนำส่ง หรือความเร็วของยานพาหนะ ซึ่งสามารถระบุควบคู่ไปกับข้อจำกัดทางอ้อมสูงสุดได้ โดยโซลูชันจะยึดตามข้อกำหนดทั้ง 2 ข้อ

shipment_type

string

สตริงที่ไม่ใช่ค่าว่างซึ่งระบุ "ประเภท" สำหรับการจัดส่งนี้ ฟีเจอร์นี้ใช้เพื่อกำหนดความเข้ากันไม่ได้หรือข้อกำหนดระหว่าง shipment_types ได้ (ดู shipment_type_incompatibilities และ shipment_type_requirements ใน ShipmentModel)

แตกต่างจาก visit_types ซึ่งระบุไว้สำหรับการเข้าชมครั้งเดียว: การรับ/การนำส่งทั้งหมดที่อยู่ในการจัดส่งเดียวกันจะมี shipment_type เดียวกัน

label

string

ระบุป้ายกำกับสำหรับการจัดส่งนี้ ระบบจะรายงานป้ายกำกับนี้ในการตอบกลับใน shipment_label ของ ShipmentRoute.Visit ที่เกี่ยวข้อง

ignore

bool

หากเป็นจริง ให้ข้ามการจัดส่งนี้ แต่อย่าใช้ penalty_cost

การละเว้นการจัดส่งจะทำให้เกิดข้อผิดพลาดในการตรวจสอบเมื่อมี shipment_type_requirements ในโมเดล

ระบบอนุญาตให้ละเว้นการจัดส่งที่ดำเนินการใน injected_first_solution_routes หรือ injected_solution_constraint โปรแกรมโซลูชันจะนำการเรียกเข้ารับ/การนำส่งที่เกี่ยวข้องออกจากเส้นทางที่ดำเนินการ precedence_rules ที่จะอ้างอิงการจัดส่งที่ละเว้นก็จะไม่ได้รับการสนใจเช่นกัน

penalty_cost

double

หากการจัดส่งไม่เสร็จสมบูรณ์ ระบบจะเพิ่มค่าปรับนี้ลงในต้นทุนโดยรวมของเส้นทาง ระบบจะถือว่าการจัดส่งเสร็จสมบูรณ์หากมีการนำส่งหรือรับสินค้าตามทางเลือกใดทางเลือกหนึ่ง ค่าใช้จ่ายอาจแสดงเป็นหน่วยเดียวกับที่ใช้กับช่องอื่นๆ ทั้งหมดที่เกี่ยวข้องกับต้นทุนในโมเดล และต้องมีค่าเป็นบวก

สำคัญ: หากไม่ได้ระบุค่าปรับนี้ ระบบจะถือว่าไม่มีขีดจำกัด ซึ่งหมายความว่าการจัดส่งต้องเสร็จสมบูรณ์

pickup_to_delivery_relative_detour_limit

double

ระบุเวลาอ้อมสูงสุดแบบสัมพัทธ์เทียบกับเส้นทางที่สั้นที่สุดตั้งแต่การไปรับจนถึงการนำส่ง หากระบุ ต้องไม่เป็นค่าลบ และการจัดส่งต้องมีการรับสินค้าและการนำส่งอย่างน้อย 1 รายการ

ตัวอย่างเช่น สมมติให้ t เป็นเวลาที่สั้นที่สุดจากทางเลือกการรับสินค้าที่เลือกไปยังทางเลือกการนำส่งที่เลือกโดยตรง จากนั้นการตั้งค่า pickup_to_delivery_relative_detour_limit จะบังคับใช้สิ่งต่อไปนี้

start_time(delivery) - start_time(pickup) <=
std::ceil(t * (1.0 + pickup_to_delivery_relative_detour_limit))

หากระบุทั้งขีดจำกัดแบบสัมพัทธ์และแบบสัมบูรณ์ในการจัดส่งเดียวกัน ระบบจะใช้ขีดจำกัดที่จำกัดมากขึ้นสำหรับคู่การรับ/การนำส่งที่เป็นไปได้แต่ละคู่ ในเดือนตุลาคม 2017 ระบบรองรับการอ้อมเส้นทางเฉพาะในกรณีที่ระยะเวลาเดินทางไม่ขึ้นอยู่กับยานพาหนะ

โหลด

เมื่อทำการเข้าชม ระบบอาจเพิ่มน้ำหนักที่กำหนดไว้ล่วงหน้าลงในน้ำหนักบรรทุกของยานพาหนะหากเป็นการไปรับสินค้า หรือหักออกหากเป็นการนำส่ง ข้อความนี้กําหนดจํานวนเงินดังกล่าว ดูload_demands

ช่อง
amount

int64

น้ำหนักบรรทุกของยานพาหนะที่ทำการเข้าชมที่เกี่ยวข้องจะแตกต่างกันไป เนื่องจากเป็นจำนวนเต็ม เราจึงขอแนะนำให้ผู้ใช้เลือกหน่วยที่เหมาะสมเพื่อไม่ให้ความแม่นยำลดลง ต้องมากกว่าหรือเท่ากับ 0

VisitRequest

คำขอเข้าชมที่สามารถทำได้โดยยานพาหนะ: ยานพาหนะมีตำแหน่งทางภูมิศาสตร์ (หรือ 2 ตำแหน่ง โปรดดูด้านล่าง) เวลาเปิดและปิดที่แสดงเป็นกรอบเวลา และระยะเวลาของบริการ (เวลาที่ยานพาหนะใช้ในการรับหรือส่งสินค้าเมื่อมาถึง)

ช่อง
arrival_location

LatLng

ตำแหน่งทางภูมิศาสตร์ที่ยานพาหนะมาถึงเมื่อทำการ VisitRequest นี้ หากรูปแบบการจัดส่งมีเมตริกระยะทางตามระยะเวลา คุณไม่จำเป็นต้องระบุ arrival_location

arrival_waypoint

Waypoint

จุดที่รถมาถึงเมื่อทำ VisitRequest นี้ หากรูปแบบการจัดส่งมีเมตริกระยะทางตามระยะเวลา คุณต้องไม่ระบุ arrival_waypoint

departure_location

LatLng

ตำแหน่งทางภูมิศาสตร์ที่ยานพาหนะออกเดินทางหลังจากทำ VisitRequest นี้เสร็จสิ้น ละเว้นได้หากเหมือนกับ arrival_location หากรูปแบบการจัดส่งมีเมตริกระยะทางตามระยะเวลา คุณต้องไม่ระบุ departure_location

departure_waypoint

Waypoint

จุดสังเกตที่ยานพาหนะออกเดินทางหลังจากทำ VisitRequest นี้เสร็จสมบูรณ์ ละเว้นได้หากเหมือนกับ arrival_waypoint หากรูปแบบการจัดส่งมีเมตริกระยะทางตามระยะเวลา คุณไม่จำเป็นต้องระบุ departure_waypoint

tags[]

string

ระบุแท็กที่แนบมากับคําขอเข้าชม ไม่อนุญาตให้ใช้สตริงที่ว่างเปล่าหรือซ้ำกัน

time_windows[]

TimeWindow

กรอบเวลาที่จํากัดเวลามาถึงในการเข้าชม โปรดทราบว่ายานพาหนะอาจออกเดินทางนอกกรอบเวลาการมาถึง เช่น เวลามาถึง + ระยะเวลาไม่จำเป็นต้องอยู่ภายในกรอบเวลา ซึ่งอาจส่งผลให้ต้องรอหากยานพาหนะมาถึงก่อน TimeWindow.start_time

หากไม่มี TimeWindow หมายความว่ายานพาหนะสามารถเข้าชมได้ทุกเมื่อ

กรอบเวลาต้องไม่ซ้อนทับกัน เช่น กรอบเวลาต้องไม่ซ้อนทับหรืออยู่ติดกับกรอบเวลาอื่น และต้องเป็นลำดับเวลาจากน้อยไปมาก

คุณจะตั้งค่า cost_per_hour_after_soft_end_time และ soft_end_time ได้ก็ต่อเมื่อมีกรอบเวลาเดียวเท่านั้น

duration

Duration

ระยะเวลาในการเข้าชม เช่น เวลาที่ใช้โดยยานพาหนะระหว่างที่มาถึงและออกเดินทาง (จะเพิ่มไปยังเวลารอที่เป็นไปได้ ดู time_windows)

cost

double

ค่าบริการตามคำขอเข้าชมนี้ในเส้นทางของยานพาหนะ รหัสนี้ใช้เพื่อชำระค่าใช้จ่ายที่แตกต่างกันสำหรับการรับหรือการนำส่งพัสดุทางเลือกแต่ละรายการ ค่าใช้จ่ายนี้ต้องเป็นหน่วยเดียวกับ Shipment.penalty_cost และต้องไม่ติดลบ

load_demands

map<string, Load>

โหลดดีมานด์ของคำขอเข้าชมนี้ ช่องนี้เหมือนกับช่อง Shipment.load_demands ยกเว้นว่าจะมีผลกับ VisitRequest นี้เท่านั้น ไม่ใช่ทั้ง Shipment ความต้องการที่ระบุไว้ที่นี่จะเพิ่มไปยังความต้องการที่ระบุไว้ใน Shipment.load_demands

visit_types[]

string

ระบุประเภทการเข้าชม ข้อมูลนี้อาจใช้เพื่อจัดสรรเวลาเพิ่มเติมที่จําเป็นสำหรับยานพาหนะในการเข้าชมนี้ให้เสร็จสมบูรณ์ (ดู Vehicle.extra_visit_duration_for_visit_type)

ประเภทหนึ่งๆ จะปรากฏได้เพียงครั้งเดียว

label

string

ระบุป้ายกำกับสำหรับ VisitRequest นี้ ระบบจะรายงานป้ายกำกับนี้ในการตอบกลับเป็น visit_label ใน ShipmentRoute.Visit ที่เกี่ยวข้อง

ShipmentModel

รูปแบบการจัดส่งประกอบด้วยชุดการจัดส่งที่ต้องดำเนินการโดยชุดยานพาหนะ โดยลดต้นทุนโดยรวมให้เหลือน้อยที่สุด ซึ่งก็คือผลรวมของ

  • ค่าใช้จ่ายในการกำหนดเส้นทางของยานพาหนะ (ผลรวมของต้นทุนต่อเวลาทั้งหมด ต้นทุนต่อเวลาเดินทาง และต้นทุนคงที่สำหรับยานพาหนะทั้งหมด)
  • บทลงโทษสำหรับการไม่ดำเนินการจัดส่ง
  • ค่าใช้จ่ายของระยะเวลาการจัดส่งทั่วโลก
ช่อง
shipments[]

Shipment

ชุดการจัดส่งที่ต้องดำเนินการในโมเดล

vehicles[]

Vehicle

ชุดยานพาหนะที่สามารถใช้เพื่อเข้าชม

global_start_time

Timestamp

เวลาเริ่มต้นและสิ้นสุดแบบรวมของโมเดล: ระบบจะไม่ถือว่าเวลาที่อยู่นอกช่วงนี้ถูกต้อง

ช่วงเวลาของโมเดลต้องน้อยกว่า 1 ปี กล่าวคือ global_end_time และ global_start_time ต้องอยู่ในช่วง 31536000 วินาทีจากกัน

เมื่อใช้ช่อง cost_per_*hour คุณอาจต้องการตั้งค่าช่วงเวลานี้ให้สั้นลงเพื่อเพิ่มประสิทธิภาพ (เช่น หากคุณประมาณ 1 วัน คุณควรตั้งค่าขีดจํากัดเวลาส่วนกลางเป็นวันนั้น) หากไม่ได้ตั้งค่า ระบบจะใช้ 00:00:00 UTC, 1 มกราคม 1970 (เช่น วินาที: 0, นาโนวินาที: 0) เป็นค่าเริ่มต้น

global_end_time

Timestamp

หากไม่ได้ตั้งค่า ระบบจะใช้ 00:00:00 UTC, 1 มกราคม 1971 (เช่น วินาที: 31536000, นีโอน: 0) เป็นค่าเริ่มต้น

global_duration_cost_per_hour

double

"ระยะเวลาโดยรวม" ของแผนโดยรวมคือความแตกต่างระหว่างเวลาเริ่มต้นที่เร็วที่สุดที่มีผลและเวลาสิ้นสุดที่ช้าที่สุดที่มีผลของยานพาหนะทั้งหมด ผู้ใช้สามารถกำหนดต้นทุนต่อชั่วโมงให้กับจำนวนดังกล่าวเพื่อพยายามเพิ่มประสิทธิภาพให้งานเสร็จเร็วที่สุด เป็นต้น ค่าใช้จ่ายนี้ต้องอยู่ในหน่วยเดียวกับ Shipment.penalty_cost

duration_distance_matrices[]

DurationDistanceMatrix

ระบุเมทริกซ์ระยะเวลาและระยะทางที่ใช้ในโมเดล หากช่องนี้ว่างเปล่า ระบบจะใช้ Google Maps หรือระยะทางเชิงเรขาคณิตแทน ทั้งนี้ขึ้นอยู่กับค่าของช่อง use_geodesic_distances หากไม่ได้เป็นค่าว่าง use_geodesic_distances ต้องไม่เป็น "จริง" และ duration_distance_matrix_src_tags หรือ duration_distance_matrix_dst_tags ต้องไม่ว่างเปล่า

ตัวอย่างการใช้งาน

  • มีสถานที่ตั้ง 2 แห่ง ได้แก่ locA และ locB
  • ยานพาหนะ 1 คันที่เริ่มเส้นทางที่ locA และสิ้นสุดที่ locA
  • คำขอรับสินค้า 1 รายการที่ locB
model {
  vehicles { start_tags: "locA"  end_tags: "locA" }
  shipments { pickups { tags: "locB" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_dst_tags: "locA"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • มีสถานที่ตั้ง 3 แห่ง ได้แก่ locA, locB และ locC
  • ยานพาหนะ 1 คันที่เริ่มเส้นทางที่ locA และสิ้นสุดที่ locB โดยใช้เมทริกซ์ "เร็ว"
  • ยานพาหนะ 1 คันที่เริ่มเส้นทางที่ locB และสิ้นสุดที่ locB โดยใช้เมทริกซ์ "ช้า"
  • ยานพาหนะ 1 คันที่เริ่มเส้นทางที่ locB และสิ้นสุดที่ locB โดยใช้เมทริกซ์ "เร็ว"
  • คำขอรับสินค้า 1 รายการที่ locC
model {
  vehicles { start_tags: "locA" end_tags: "locB" start_tags: "fast" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "slow" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "fast" }
  shipments { pickups { tags: "locC" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_src_tags: "locC"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrix_dst_tags: "locC"
  duration_distance_matrices {
    vehicle_start_tag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  duration_distance_matrices {
    vehicle_start_tag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
duration_distance_matrix_src_tags[]

string

แท็กที่กําหนดแหล่งที่มาของเมตริกระยะเวลาและระยะทาง duration_distance_matrices(i).rows(j) กําหนดระยะเวลาและระยะทางจากการเข้าชมที่มีแท็ก duration_distance_matrix_src_tags(j) ไปยังการเข้าชมอื่นๆ ในเมตริก i

แท็กสอดคล้องกับ VisitRequest.tags หรือ Vehicle.start_tags VisitRequest หรือ Vehicle หนึ่งๆ ต้องตรงกับแท็กเดียวในช่องนี้ โปรดทราบว่าแท็กต้นทาง ปลายทาง และเมทริกซ์ของ Vehicle อาจเหมือนกัน และแท็กต้นทางและปลายทางของ VisitRequest ก็อาจเหมือนกัน แท็กทั้งหมดต้องไม่ซ้ำกันและต้องไม่ใช่สตริงว่าง หากช่องนี้ไม่ว่างเปล่า duration_distance_matrices ต้องไม่ว่างเปล่า

duration_distance_matrix_dst_tags[]

string

แท็กที่กําหนดปลายทางของเมตริกระยะเวลาและระยะทาง duration_distance_matrices(i).rows(j).durations(k) (resp. duration_distance_matrices(i).rows(j).meters(k)) กำหนดระยะเวลา (หรือระยะทาง) ของการเดินทางจากการเข้าชมที่มีแท็ก duration_distance_matrix_src_tags(j) ไปยังการเข้าชมที่มีแท็ก duration_distance_matrix_dst_tags(k) ในเมทริกซ์ i

แท็กสอดคล้องกับ VisitRequest.tags หรือ Vehicle.start_tags VisitRequest หรือ Vehicle หนึ่งๆ ต้องตรงกับแท็กเดียวในช่องนี้ โปรดทราบว่าแท็กต้นทาง ปลายทาง และเมทริกซ์ของ Vehicle อาจเหมือนกัน และแท็กต้นทางและปลายทางของ VisitRequest ก็อาจเหมือนกัน แท็กทั้งหมดต้องไม่ซ้ำกันและต้องไม่ใช่สตริงว่าง หากช่องนี้ไม่ว่างเปล่า duration_distance_matrices ต้องไม่ว่างเปล่า

transition_attributes[]

TransitionAttributes

เพิ่มแอตทริบิวต์การเปลี่ยนรูปแบบลงในโมเดลแล้ว

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

ชุดของ shipment_types ที่ใช้ร่วมกันไม่ได้ (ดู ShipmentTypeIncompatibility)

shipment_type_requirements[]

ShipmentTypeRequirement

ชุดข้อกําหนด shipment_type (ดู ShipmentTypeRequirement)

precedence_rules[]

PrecedenceRule

ชุดกฎลําดับความสําคัญที่ต้องบังคับใช้ในโมเดล

max_active_vehicles

int32

จำกัดจำนวนยานพาหนะที่ใช้งานอยู่สูงสุด ยานพาหนะจะถือว่าใช้งานอยู่หากเส้นทางของยานพาหนะมีการจัดส่งอย่างน้อย 1 รายการ สามารถใช้เพื่อจำกัดจำนวนเส้นทางในกรณีที่มีคนขับน้อยกว่ายานพาหนะและกลุ่มยานพาหนะมีความหลากหลาย จากนั้นการเพิ่มประสิทธิภาพจะเลือกกลุ่มย่อยของยานพาหนะที่ดีที่สุดที่จะใช้ ต้องเป็นค่าบวก

DurationDistanceMatrix

ระบุระยะเวลาและเมตริกระยะทางจากสถานที่เริ่มต้นของยานพาหนะและการเข้าชมไปยังสถานที่สิ้นสุดของยานพาหนะและการเข้าชม

ช่อง
rows[]

Row

ระบุแถวของเมทริกซ์ระยะเวลาและระยะทาง โดยต้องมีองค์ประกอบเท่ากับ ShipmentModel.duration_distance_matrix_src_tags

vehicle_start_tag

string

แท็กที่กําหนดว่าเมตริกระยะเวลาและระยะทางนี้มีผลกับยานพาหนะใด หากเป็นค่าว่าง รายการนี้จะมีผลกับยานพาหนะทุกคัน และจะมีได้เพียงเมทริกซ์เดียวเท่านั้น

การเริ่มต้นยานพาหนะแต่ละรายการต้องตรงกับเมทริกซ์เพียงรายการเดียวเท่านั้น กล่าวคือ ช่อง start_tags รายการใดรายการหนึ่งต้องตรงกับ vehicle_start_tag ของเมทริกซ์ (และของเมทริกซ์นั้นเท่านั้น)

เมทริกซ์ทั้งหมดต้องมี vehicle_start_tag ไม่ซ้ำกัน

แถว

ระบุแถวของเมทริกซ์ระยะเวลาและระยะทาง

ช่อง
durations[]

Duration

ค่าระยะเวลาของแถวที่ระบุ โดยต้องมีองค์ประกอบเท่ากับ ShipmentModel.duration_distance_matrix_dst_tags

meters[]

double

ค่าระยะทางของแถวหนึ่งๆ หากไม่มีต้นทุนหรือข้อจำกัดที่อ้างอิงถึงระยะทางในโมเดล คุณก็ปล่อยว่างไว้ได้ แต่หากมี องค์ประกอบต้องมีจำนวนเท่ากับ durations

PrecedenceRule

กฎลําดับความสําคัญระหว่าง 2 เหตุการณ์ (แต่ละเหตุการณ์คือการไปรับหรือการนำส่งการจัดส่ง): เหตุการณ์ "ที่ 2" ต้องเริ่มต้นหลังจากเหตุการณ์ "ที่ 1" เริ่มต้นอย่างน้อย offset_duration

ลําดับความสําคัญหลายรายการอาจอ้างอิงถึงเหตุการณ์เดียวกัน (หรือที่เกี่ยวข้อง) เช่น "การไปรับ B เกิดขึ้นหลังจากการนำส่ง A" และ "การไปรับ C เกิดขึ้นหลังจากการไปรับ B"

นอกจากนี้ ลําดับความสําคัญจะมีผลก็ต่อเมื่อมีการจัดส่งทั้ง 2 รายการเท่านั้น มิเช่นนั้นระบบจะไม่สนใจ

ช่อง
first_is_delivery

bool

ระบุว่าเหตุการณ์ "แรก" เป็นการนําส่งหรือไม่

second_is_delivery

bool

ระบุว่าเหตุการณ์ "ที่ 2" เป็นการแสดงโฆษณาหรือไม่

offset_duration

Duration

ส่วนต่างระหว่างเหตุการณ์ "แรก" กับ "ที่ 2" อาจเป็นค่าลบได้

first_index

int32

ดัชนีการจัดส่งของเหตุการณ์ "แรก" ต้องระบุข้อมูลในช่องนี้

second_index

int32

ดัชนีการจัดส่งของเหตุการณ์ "ที่ 2" ต้องระบุข้อมูลในช่องนี้

ShipmentRoute

เส้นทางของยานพาหนะสามารถแยกวิเคราะห์ตามแกนเวลาได้ดังนี้ (สมมติว่ามีการเข้าชม n ครั้ง)

  |            |            |          |       |  T[2], |        |      |
  | Transition |  Visit #0  |          |       |  V[2], |        |      |
  |     #0     |    aka     |   T[1]   |  V[1] |  ...   | V[n-1] | T[n] |
  |  aka T[0]  |    V[0]    |          |       | V[n-2],|        |      |
  |            |            |          |       | T[n-1] |        |      |
  ^            ^            ^          ^       ^        ^        ^      ^
vehicle    V[0].start   V[0].end     V[1].   V[1].    V[n].    V[n]. vehicle
 start     (arrival)   (departure)   start   end      start    end     end

โปรดทราบว่าเราแยกความแตกต่างระหว่าง

  • "เหตุการณ์ตามเวลา" เช่น จุดเริ่มต้นและจุดสิ้นสุดของยานพาหนะ รวมถึงจุดเริ่มต้นและจุดสิ้นสุดของการเข้าชมแต่ละครั้ง (หรือที่เรียกว่าการมาถึงและการออกเดินทาง) เหตุการณ์เหล่านี้เกิดขึ้นในวินาทีหนึ่งๆ
  • "ช่วงเวลา" เช่น การเข้าชมเอง และการเปลี่ยนระหว่างการเข้าชม แม้ว่าบางครั้งช่วงเวลาอาจมีระยะเวลาเป็น 0 เช่น เริ่มต้นและสิ้นสุดในเวลาวินาทีเดียวกัน แต่มักจะมีระยะเวลาเป็นบวก

อินตัวแปร

  • หากมีการเข้าชม n ครั้ง ก็จะมีการเปลี่ยน n+1 ครั้ง
  • การเข้าชมจะอยู่ระหว่างการเปลี่ยนก่อน (ดัชนีเดียวกัน) และการเปลี่ยนหลังจากนั้น (ดัชนี + 1) เสมอ
  • การเปลี่ยน #0 จะตามหลังการสตาร์ทยานพาหนะเสมอ
  • ส่วน "สิ้นสุดยานพาหนะ" จะมีการเปลี่ยน #n นำหน้าเสมอ

เมื่อซูมเข้า สิ่งที่จะเกิดขึ้นระหว่าง Transition และ Visit มีดังนี้

---+-------------------------------------+-----------------------------+-->
   |           TRANSITION[i]             |           VISIT[i]          |
   |                                     |                             |
   |  * TRAVEL: the vehicle moves from   |      PERFORM the visit:     |
   |    VISIT[i-1].departure_location to |                             |
   |    VISIT[i].arrival_location, which |  * Spend some time:         |
   |    takes a given travel duration    |    the "visit duration".    |
   |    and distance                     |                             |
   |                                     |  * Load or unload           |
   |  * BREAKS: the driver may have      |    some quantities from the |
   |    breaks (e.g. lunch break).       |    vehicle: the "demand".   |
   |                                     |                             |
   |  * WAIT: the driver/vehicle does    |                             |
   |    nothing. This can happen for     |                             |
   |    many reasons, for example when   |                             |
   |    the vehicle reaches the next     |                             |
   |    event's destination before the   |                             |
   |    start of its time window         |                             |
   |                                     |                             |
   |  * DELAY: *right before* the next   |                             |
   |    arrival. E.g. the vehicle and/or |                             |
   |    driver spends time unloading.    |                             |
   |                                     |                             |
---+-------------------------------------+-----------------------------+-->
   ^                                     ^                             ^
V[i-1].end                           V[i].start                    V[i].end

สุดท้ายนี้ มาดูวิธีจัดเรียง TRAVEL, BREAKS, DELAY และ WAIT ระหว่างการเปลี่ยนเส้นทาง

  • โดยไม่ซ้อนทับกัน
  • DELAY จะต้องไม่ซ้ำกันและต้องเป็นระยะเวลาติดต่อกันก่อนการเข้าชมครั้งถัดไป (หรือจุดสิ้นสุดของยานพาหนะ) ดังนั้น คุณก็ทราบเวลาเริ่มต้นและเวลาสิ้นสุดได้จากการทราบระยะเวลาการเลื่อน
  • ช่วงพักคือช่วงเวลาที่ต่อเนื่องกันและไม่ทับซ้อนกัน การตอบกลับจะระบุเวลาเริ่มต้นและระยะเวลาของช่วงพักแต่ละช่วง
  • TRAVEL และ WAIT เป็น "สถานะที่หยุดชั่วคราวได้" ซึ่งอาจถูกขัดจังหวะหลายครั้งในระหว่างการเปลี่ยนสถานะนี้ ลูกค้าจะถือว่าการเดินทางเกิดขึ้น "โดยเร็วที่สุด" และ "รอ" จะแสดงเวลาที่เหลือ

ตัวอย่าง (ที่ซับซ้อน)

                               TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
  ||     |       |           |       |           |         |         ||
  ||  T  |   B   |     T     |       |     B     |         |    D    ||
  ||  r  |   r   |     r     |   W   |     r     |    W    |    e    ||
  ||  a  |   e   |     a     |   a   |     e     |    a    |    l    ||
  ||  v  |   a   |     v     |   i   |     a     |    i    |    a    ||
  ||  e  |   k   |     e     |   t   |     k     |    t    |    y    ||
  ||  l  |       |     l     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
ช่อง
vehicle_index

int32

ยานพาหนะที่วิ่งเส้นทาง ซึ่งระบุด้วยดัชนีในแหล่งที่มา ShipmentModel

vehicle_label

string

ป้ายกํากับของยานพาหนะที่วิ่งเส้นทางนี้ ซึ่งเท่ากับ ShipmentModel.vehicles(vehicle_index).label หากระบุ

vehicle_start_time

Timestamp

เวลารถเริ่มออกเดินทาง

vehicle_end_time

Timestamp

เวลาที่พาหนะวิ่งเส้นทางเสร็จสิ้น

visits[]

Visit

ลําดับการเข้าชมที่เรียงลําดับซึ่งแสดงถึงเส้นทาง โดย visits[i] คือการเข้าชมที่ i ในเส้นทาง หากช่องนี้ว่าง ระบบจะถือว่ายานพาหนะไม่ได้ใช้งาน

transitions[]

Transition

รายการทรานซิชันตามลําดับของเส้นทาง

has_traffic_infeasibilities

bool

เมื่อตั้งค่า OptimizeToursRequest.consider_road_traffic เป็น "จริง" ช่องนี้จะระบุว่าระบบจะคาดการณ์ความไม่สอดคล้องของเวลาในเส้นทางโดยใช้การประมาณระยะเวลาเดินทางตามการจราจร อาจไม่มีเวลาเพียงพอในการเดินทางที่ปรับตามการจราจร ระยะเวลาที่ล่าช้า และช่วงพักระหว่างการเข้าชมก่อนการเข้าชมครั้งแรกหรือหลังการเข้าชมครั้งล่าสุด โดยยังคงเป็นไปตามกรอบเวลาการเข้าชมและเวลาของยานพาหนะ ตัวอย่างเช่น

  start_time(previous_visit) + duration(previous_visit) +
  travel_duration(previous_visit, next_visit) > start_time(next_visit)

เวลาที่มาถึงที่ next_visit มีแนวโน้มที่จะเกิดช้ากว่ากรอบเวลาปัจจุบันเนื่องจากเวลาเดินทางโดยประมาณ travel_duration(previous_visit, next_visit) เพิ่มขึ้นเนื่องจากมีรถติด นอกจากนี้ ระบบอาจบังคับให้ช่วงพักซ้อนทับกับการเข้าชมเนื่องจากเวลาเดินทางโดยประมาณเพิ่มขึ้นและข้อจำกัดของกรอบเวลาการเข้าชมหรือช่วงพัก

route_polyline

EncodedPolyline

การนำเสนอเส้นประกอบที่เข้ารหัสของเส้นทาง ระบบจะป้อนข้อมูลในช่องนี้เฉพาะในกรณีที่ตั้งค่า OptimizeToursRequest.populate_polylines เป็น "จริง"

breaks[]

Break

ช่วงพักที่กำหนดไว้สำหรับยานพาหนะที่วิ่งเส้นทางนี้ ลำดับ breaks แสดงถึงช่วงเวลา โดยแต่ละช่วงเวลาจะเริ่มต้นที่ start_time ที่เกี่ยวข้องและยาว duration วินาที

metrics

AggregatedMetrics

เมตริกระยะเวลา ระยะทาง และน้ำหนักบรรทุกของเส้นทางนี้ ระบบจะรวมช่อง AggregatedMetrics ของ ShipmentRoute.transitions หรือ ShipmentRoute.visits ทั้งหมดเข้าด้วยกัน โดยขึ้นอยู่กับบริบท

route_costs

map<string, double>

ค่าใช้จ่ายของเส้นทางที่แจกแจงตามช่องคำขอที่เกี่ยวข้องกับค่าใช้จ่าย คีย์คือเส้นทางโปรโตคอลซึ่งสัมพันธ์กับอินพุต OptimizeToursRequest เช่น "model.shipments.pickups.cost" และค่าคือต้นทุนทั้งหมดที่สร้างขึ้นจากช่องค่าใช้จ่ายที่เกี่ยวข้อง ซึ่งรวบรวมจากทั่วทั้งเส้นทาง กล่าวคือ costs["model.shipments.pickups.cost"] คือผลรวมของค่าใช้จ่ายในการรับสินค้าทั้งหมดในเส้นทาง ระบบจะรายงานต้นทุนทั้งหมดที่กําหนดไว้ในรูปแบบโดยละเอียดที่นี่ ยกเว้นต้นทุนที่เกี่ยวข้องกับ TransitionAttributes ซึ่งจะรายงานแบบรวมเท่านั้น ณ วันที่ 01/2022

route_total_cost

double

ต้นทุนรวมของเส้นทาง ผลรวมของค่าใช้จ่ายทั้งหมดในแผนที่ต้นทุน

พัก

ข้อมูลที่แสดงถึงการดำเนินการของช่วงพัก

ช่อง
start_time

Timestamp

เวลาเริ่มต้นของช่วงพัก

duration

Duration

ระยะเวลาของช่วงพัก

EncodedPolyline

การนำเสนอที่เข้ารหัสของเส้นประกอบ ดูข้อมูลเพิ่มเติมเกี่ยวกับการเข้ารหัสเส้นประกอบได้ที่ https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding

ช่อง
points

string

สตริงที่แสดงจุดที่เข้ารหัสของเส้นประกอบ

ทรานซิชัน

การเปลี่ยนระหว่างเหตุการณ์ 2 รายการในเส้นทาง ดูคำอธิบายของ ShipmentRoute

หากยานพาหนะไม่มี start_location และ/หรือ end_location เมตริกการเดินทางที่เกี่ยวข้องจะเป็น 0

ช่อง
travel_duration

Duration

ระยะเวลาการเดินทางระหว่างการเปลี่ยนผ่านนี้

travel_distance_meters

double

ระยะทางที่เดินทางระหว่างการเปลี่ยน

traffic_info_unavailable

bool

เมื่อมีการขอข้อมูลการเข้าชมผ่าน OptimizeToursRequest.consider_road_traffic และดึงข้อมูลการเข้าชมสําหรับ Transition ไม่ได้ ระบบจะตั้งค่าบูลีนนี้เป็น "จริง" ปัญหานี้อาจเกิดขึ้นชั่วคราว (เซิร์ฟเวอร์ข้อมูลการจราจรแบบเรียลไทม์ทำงานขัดข้องเป็นครั้งคราว) หรือถาวร (ไม่มีข้อมูลสำหรับสถานที่นี้)

delay_duration

Duration

ผลรวมของระยะเวลาการเลื่อนเวลาที่ใช้กับทรานซิชันนี้ หากมี หน่วงเวลาจะเริ่มขึ้น delay_duration วินาทีก่อนเหตุการณ์ถัดไป (การเข้าชมหรือยานพาหนะสิ้นสุด) ดู TransitionAttributes.delay

break_duration

Duration

ผลรวมของระยะเวลาของช่วงพักที่เกิดขึ้นระหว่างการเปลี่ยนนี้ หากมี ระบบจะจัดเก็บรายละเอียดเกี่ยวกับเวลาเริ่มต้นและระยะเวลาของช่วงพักแต่ละช่วงไว้ใน ShipmentRoute.breaks

wait_duration

Duration

เวลาที่ใช้ในการรอระหว่างการเปลี่ยนนี้ ระยะเวลารอจะสอดคล้องกับเวลาที่ไม่ได้ใช้งาน และไม่รวมเวลาพัก และโปรดทราบว่าเวลารอนี้อาจแบ่งออกเป็นหลายช่วงเวลาที่ไม่ต่อเนื่องกัน

total_duration

Duration

ระยะเวลาทั้งหมดของการเปลี่ยน ซึ่งระบุไว้เพื่อความสะดวก ซึ่งมีค่าเท่ากับ

  • การเข้าชมครั้งถัดไป start_time (หรือ vehicle_end_time หากเป็นการเปลี่ยนครั้งล่าสุด) - start_time ของการเปลี่ยนนี้
  • if ShipmentRoute.has_traffic_infeasibilities is false, the following additionally holds: `total_duration = travel_duration + delay_duration
  • break_duration + wait_duration`
start_time

Timestamp

เวลาเริ่มต้นของการเปลี่ยนนี้

route_polyline

EncodedPolyline

การนําเสนอเส้นประกอบที่เข้ารหัสของเส้นทางที่ไปตามการเปลี่ยน ระบบจะป้อนข้อมูลในช่องนี้เฉพาะในกรณีที่ตั้งค่า populate_transition_polylines เป็น "จริง"

route_token

string

เอาต์พุตเท่านั้น โทเค็นแบบทึบที่สามารถส่งไปยัง Navigation SDK เพื่อสร้างเส้นทางใหม่ระหว่างการนําทาง และในกรณีที่มีการเปลี่ยนเส้นทาง ให้ยึดตามเจตนาเดิมเมื่อสร้างเส้นทาง ถือว่าโทเค็นนี้เป็น Blob แบบทึบ อย่าเปรียบเทียบค่าของเส้นทางนี้ในคำขอต่างๆ เนื่องจากค่าอาจเปลี่ยนแปลงได้แม้ว่าบริการจะแสดงผลเส้นทางเดียวกันทุกประการก็ตาม ระบบจะป้อนข้อมูลในช่องนี้เฉพาะในกรณีที่ตั้งค่า populate_transition_polylines เป็น "จริง"

vehicle_loads

map<string, VehicleLoad>

น้ำหนักบรรทุกของยานพาหนะในระหว่างการเปลี่ยนผ่านนี้สำหรับแต่ละประเภทที่ปรากฏใน Vehicle.load_limits ของยานพาหนะนี้ หรือมี Shipment.load_demands ที่ไม่ใช่ 0 ในการจัดส่งบางรายการที่ดำเนินการในเส้นทางนี้

น้ำหนักบรรทุกระหว่างการเปลี่ยนเส้นทางครั้งแรกคือน้ำหนักบรรทุกเริ่มต้นของเส้นทางยานพาหนะ จากนั้นหลังจากการเข้าชมแต่ละครั้ง ระบบจะเพิ่มหรือลบ load_demands ของการเข้าชมนั้นเพื่อรับการโหลดของการเปลี่ยนเส้นทางถัดไป ทั้งนี้ขึ้นอยู่กับว่าการเข้าชมเป็นการไปรับหรือการนำส่ง

VehicleLoad

รายงานน้ำหนักบรรทุกจริงของยานพาหนะ ณ จุดหนึ่งๆ บนเส้นทางสำหรับประเภทหนึ่งๆ (ดู Transition.vehicle_loads)

ช่อง
amount

int64

น้ำหนักบรรทุกของยานพาหนะสำหรับประเภทที่ระบุ โดยปกติแล้ว ประเภทของน้ำหนักบรรทุกจะระบุหน่วยของน้ำหนักบรรทุก ดูTransition.vehicle_loads

ไปที่

การเข้าชมที่เกิดขึ้นระหว่างเส้นทาง การเข้าชมนี้สอดคล้องกับการรับหรือการนำส่ง Shipment

ช่อง
shipment_index

int32

ดัชนีของช่อง shipments ในแหล่งที่มา ShipmentModel

is_pickup

bool

หากเป็นจริง การเข้าชมจะสอดคล้องกับการรับ Shipment มิฉะนั้น ระบบจะถือว่าคำสั่งซื้อนั้นเกี่ยวข้องกับการนำส่ง

visit_request_index

int32

ดัชนีของ VisitRequest ในช่องการรับสินค้าหรือการนำส่งของ Shipment (ดู is_pickup)

start_time

Timestamp

เวลาที่การเข้าชมเริ่มต้น โปรดทราบว่ายานพาหนะอาจมาถึงสถานที่เข้าชมเร็วกว่านี้ เวลาสอดคล้องกับ ShipmentModel

load_demands

map<string, Load>

ดีมานด์การโหลดการเข้าชมทั้งหมดเป็นผลรวมของการจัดส่งและคำขอเข้าชม load_demands ค่าจะเป็นลบหากการเข้าชมเป็นการนําส่ง ระบบจะรายงานดีมานด์สำหรับประเภทเดียวกับ Transition.loads (ดูในช่องนี้)

detour

Duration

เวลาอ้อมทางเพิ่มเติมเนื่องจากมีการเข้าชมการจัดส่งในเส้นทางก่อนการเข้าชม และเวลารอที่อาจเกิดขึ้นเนื่องจากกรอบเวลา หากการเข้าชมเป็นการนําส่ง ระบบจะคํานวณการอ้อมเส้นทางจากการเข้าชมเพื่อรับสินค้าที่เกี่ยวข้องและเท่ากับ

start_time(delivery) - start_time(pickup)
- (duration(pickup) + travel duration from the pickup location
to the delivery location).

มิเช่นนั้น ระบบจะคํานวณจากยานพาหนะ start_location และมีค่าเท่ากับ

start_time - vehicle_start_time - travel duration from
the vehicle's `start_location` to the visit.
shipment_label

string

สําเนาของ Shipment.label ที่เกี่ยวข้อง หากระบุไว้ใน Shipment

visit_label

string

สําเนาของ VisitRequest.label ที่เกี่ยวข้อง หากระบุไว้ใน VisitRequest

ShipmentTypeIncompatibility

ระบุความเข้ากันไม่ได้ระหว่างการจัดส่งโดยขึ้นอยู่กับ shipment_type ระบบจะจำกัดการแสดงการจัดส่งที่เข้ากันไม่ได้ในเส้นทางเดียวกันตามโหมดที่เข้ากันไม่ได้

ช่อง
types[]

string

รายการประเภทที่ใช้ร่วมกันไม่ได้ การจัดส่ง 2 รายการที่มี shipment_types ต่างกันในรายการที่แสดงจะถือว่า "เข้ากันไม่ได้"

incompatibility_mode

IncompatibilityMode

โหมดที่ใช้กับการทำงานร่วมกันไม่ได้

IncompatibilityMode

โหมดที่กําหนดวิธีจํากัดลักษณะที่ปรากฏของการจัดส่งที่เข้ากันไม่ได้ในเส้นทางเดียวกัน

Enum
INCOMPATIBILITY_MODE_UNSPECIFIED โหมดที่เข้ากันไม่ได้ซึ่งไม่ได้ระบุ คุณไม่ควรใช้ค่านี้
NOT_PERFORMED_BY_SAME_VEHICLE ในโหมดนี้ การจัดส่ง 2 รายการที่มีประเภทเข้ากันไม่ได้จะแชร์ยานพาหนะคันเดียวกันไม่ได้
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

สำหรับการจัดส่ง 2 รายการที่มีประเภทที่ใช้ร่วมกันไม่ได้กับโหมดการทำงานร่วมกันไม่ได้ของ NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY ให้ทำดังนี้

  • หากทั้ง 2 รายการเป็นการไปรับสินค้าเท่านั้น (ไม่มีการนำส่ง) หรือการนําส่งเท่านั้น (ไม่มีการไปรับสินค้า) รายการดังกล่าวจะใช้ยานพาหนะคันเดียวกันไม่ได้เลย
  • หากการจัดส่งรายการหนึ่งเป็นการนําส่งและอีกรายการเป็นการไปรับ การจัดส่งทั้ง 2 รายการจะใช้ยานพาหนะคันเดียวกันได้ก็ต่อเมื่อมีการนําส่งการจัดส่งรายการแรกก่อนมีการไปรับการจัดส่งรายการที่ 2

ShipmentTypeRequirement

ระบุข้อกำหนดระหว่างการจัดส่งตาม shipment_type ข้อมูลจำเพาะของข้อกำหนดจะกำหนดโดยโหมดข้อกำหนด

ช่อง
required_shipment_type_alternatives[]

string

รายการประเภทการจัดส่งทางเลือกที่ dependent_shipment_types กำหนด

dependent_shipment_types[]

string

การจัดส่งทั้งหมดที่มีประเภทในช่อง dependent_shipment_types ต้องมีการจัดส่งประเภท required_shipment_type_alternatives อย่างน้อย 1 รายการที่จะเข้าชมในเส้นทางเดียวกัน

หมายเหตุ: ไม่อนุญาตให้ใช้เชนข้อกําหนด เช่น shipment_type ขึ้นอยู่กับตัวเอง

requirement_mode

RequirementMode

โหมดที่ใช้กับข้อกําหนด

RequirementMode

โหมดที่กําหนดลักษณะของการจัดส่งแบบขึ้นต่อกันในเส้นทาง

Enum
REQUIREMENT_MODE_UNSPECIFIED โหมดข้อกำหนดที่ไม่ได้ระบุ คุณไม่ควรใช้ค่านี้
PERFORMED_BY_SAME_VEHICLE ในโหมดนี้ การจัดส่ง "ที่ต้องอาศัย" ทั้งหมดต้องใช้ยานพาหนะเดียวกันกับการจัดส่ง "ที่ต้องใช้" อย่างน้อย 1 รายการ
IN_SAME_VEHICLE_AT_PICKUP_TIME

เมื่อใช้โหมด IN_SAME_VEHICLE_AT_PICKUP_TIME การจัดส่ง "ที่ต้องอาศัย" ทั้งหมดต้องมีการจัดส่ง "ที่ต้องดำเนินการ" อย่างน้อย 1 รายการในยานพาหนะ ณ เวลาที่รับ

ดังนั้นการรับพัสดุ "แบบมีเงื่อนไข" จึงต้องมีอย่างใดอย่างหนึ่งต่อไปนี้

  • การจัดส่ง "ต้องระบุ" สำหรับการนำส่งเท่านั้นซึ่งนำส่งในเส้นทางหลังจากหรือ
  • การจัดส่ง "ที่ต้องนำส่ง" ซึ่งรับในเส้นทางก่อนหน้า และหากการจัดส่ง "ที่ต้องนำส่ง" มีการนำส่ง การนำส่งนี้จะต้องดำเนินการหลังจากการไปรับการจัดส่ง "ที่ต้องนำส่ง"
IN_SAME_VEHICLE_AT_DELIVERY_TIME เช่นเดียวกับก่อนหน้านี้ ยกเว้นการจัดส่งที่ "ขึ้นอยู่กับ" จะต้องมีการจัดส่งที่ "ต้องระบุ" ในยานพาหนะ ณ เวลาที่นำส่ง

SkippedShipment

ระบุรายละเอียดของการจัดส่งที่ไม่ได้ดำเนินการในโซลูชัน สำหรับกรณีที่ไม่สำคัญและ/หรือหากเราระบุสาเหตุของการข้ามได้ เราจะรายงานสาเหตุที่นี่

ช่อง
index

int32

ดัชนีนี้สอดคล้องกับดัชนีของการจัดส่งในแหล่งที่มา ShipmentModel

label

string

สําเนาของ Shipment.label ที่เกี่ยวข้อง หากระบุไว้ใน Shipment

reasons[]

Reason

รายการเหตุผลที่อธิบายสาเหตุที่ข้ามการจัดส่ง ดูความคิดเห็นด้านบน Reason หากเราไม่ทราบสาเหตุที่ข้ามการจัดส่ง เราจะไม่ตั้งค่าเหตุผล

เหตุผล

หากอธิบายสาเหตุที่ข้ามการจัดส่งได้ ระบบจะแสดงเหตุผลไว้ที่นี่ หากเหตุผลไม่เหมือนกันสำหรับยานพาหนะทั้งหมด reason จะมีองค์ประกอบมากกว่า 1 รายการ การจัดส่งที่ข้ามต้องไม่มีเหตุผลที่ซ้ำกัน เช่น ฟิลด์ทั้งหมดเหมือนกันยกเว้น example_vehicle_index ตัวอย่าง

reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 1
  example_exceeded_capacity_type: "Apples"
}
reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 3
  example_exceeded_capacity_type: "Pears"
}
reasons {
  code: CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT
  example_vehicle_index: 1
}

การจัดส่งที่ข้ามไม่รองรับยานพาหนะบางรุ่น เหตุผลอาจแตกต่างกันไปสำหรับยานพาหนะทุกคัน แต่จะมียานพาหนะอย่างน้อย 1 คันที่มีจำนวน "แอปเปิล" เกินขีดจำกัด (รวมถึงยานพาหนะ 1) จะมียานพาหนะอย่างน้อย 1 คันที่มีจำนวน "ลูกแพร์" เกินขีดจำกัด (รวมถึงยานพาหนะ 3) และจะมียานพาหนะอย่างน้อย 1 คันที่มีระยะทางเกินขีดจำกัด (รวมถึงยานพาหนะ 1)

ช่อง
code

Code

โปรดดูความคิดเห็นของโค้ด

example_exceeded_capacity_type

string

หากรหัสเหตุผลคือ DEMAND_EXCEEDS_VEHICLE_CAPACITY ให้แสดงเอกสารประเภทความจุที่เกินขีดจำกัด 1 ประเภท

example_vehicle_index

int32

หากเหตุผลเกี่ยวข้องกับความเข้ากันไม่ได้ของยานพาหนะกับการจัดส่ง ฟิลด์นี้จะแสดงดัชนีของยานพาหนะที่เกี่ยวข้อง 1 คัน

รหัส

โค้ดที่ระบุประเภทเหตุผล ลําดับนี้ไม่มีความหมาย โดยเฉพาะอย่างยิ่ง จะไม่มีการแสดงว่าเหตุผลหนึ่งๆ จะปรากฏก่อนเหตุผลอื่นในโซลูชันหรือไม่ หากมีเหตุผลทั้ง 2 รายการ

Enum
CODE_UNSPECIFIED ไม่ควรใช้
NO_VEHICLE ไม่มียานพาหนะในโมเดล ทำให้การจัดส่งทั้งหมดเป็นไปไม่ได้
DEMAND_EXCEEDS_VEHICLE_CAPACITY ดีมานด์ของการจัดส่งเกินความจุของยานพาหนะสำหรับความจุบางประเภท ซึ่งหนึ่งในนั้นคือ example_exceeded_capacity_type
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

ระยะทางขั้นต่ำที่จำเป็นในการดำเนินการจัดส่งนี้ เช่น จากstart_locationของยานพาหนะไปยังสถานที่รับและ/หรือนำส่งของการจัดส่ง และไปยังสถานที่ปลายทางของยานพาหนะเกินroute_distance_limitของยานพาหนะ

โปรดทราบว่าเราใช้ระยะทางเชิงเรขาคณิตในการคํานวณนี้

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

เวลาขั้นต่ำที่จำเป็นในการดำเนินการจัดส่งนี้ รวมถึงเวลาเดินทาง เวลารอ และเวลาบริการนานกว่า route_duration_limit ของยานพาหนะ

หมายเหตุ: ระบบจะคำนวณเวลาเดินทางในสถานการณ์ที่ดีที่สุด ซึ่งก็คือระยะทางตามแนวเส้นโค้ง x 36 เมตร/วินาที (ประมาณ 130 กิโลเมตร/ชั่วโมง)

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT เหมือนกับด้านบน แต่เราจะเปรียบเทียบเฉพาะเวลาเดินทางขั้นต่ำและtravel_duration_limitของยานพาหนะ
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS ยานพาหนะไม่สามารถทำการขนส่งนี้ในสถานการณ์ที่ดีที่สุด (ดูCANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMITสำหรับการคํานวณเวลา) หากเริ่มในเวลาเริ่มต้นที่เร็วที่สุด เนื่องจากเวลาทั้งหมดจะทำให้ยานพาหนะสิ้นสุดหลังจากเวลาสิ้นสุดล่าสุด
VEHICLE_NOT_ALLOWED ช่อง allowed_vehicle_indices ของการจัดส่งไม่ได้ว่างเปล่าและรถคันนี้ไม่ได้อยู่ในการจัดส่งดังกล่าว

TimeWindow

กรอบเวลาจะจำกัดเวลาของเหตุการณ์ เช่น เวลามาถึงที่จุดแวะพัก หรือเวลาเริ่มต้นและสิ้นสุดของยานพาหนะ

ขอบเขตกรอบเวลาแบบบังคับ start_time และ end_time จะบังคับใช้เวลาเริ่มต้นเร็วที่สุดและช้าสุดของเหตุการณ์ เช่น start_time <= event_time <= end_time ขอบเขตล่างของกรอบเวลาแบบยืดหยุ่น soft_start_time แสดงค่ากําหนดให้เหตุการณ์เกิดขึ้นตั้งแต่หรือหลังจาก soft_start_time โดยจะมีต้นทุนตามสัดส่วนกับระยะเวลาก่อนที่เหตุการณ์จะเกิดขึ้นก่อน soft_start_time ขอบบนของกรอบเวลาแบบยืดหยุ่น soft_end_time แสดงถึงค่ากําหนดให้เหตุการณ์เกิดขึ้นในหรือก่อนวันที่ soft_end_time โดยจะมีต้นทุนตามสัดส่วนกับระยะเวลาหลังจากที่เกิดเหตุการณ์หลังจากวันที่ soft_end_time start_time, end_time, soft_start_time และ soft_end_time ควรอยู่ภายในขีดจำกัดเวลาส่วนกลาง (ดู ShipmentModel.global_start_time และ ShipmentModel.global_end_time) และควรเป็นไปตามข้อกำหนดต่อไปนี้

  0 <= `start_time` <= `end_time` and
  0 <= `start_time` <= `soft_start_time` and
  0 <= `soft_end_time` <= `end_time`.
ช่อง
start_time

Timestamp

เวลาเริ่มต้นของกรอบเวลาที่เจาะจง หากไม่ระบุ ระบบจะตั้งค่าเป็น ShipmentModel.global_start_time

end_time

Timestamp

เวลาสิ้นสุดของกรอบเวลาที่เจาะจง หากไม่ได้ระบุ ระบบจะตั้งค่าเป็น ShipmentModel.global_end_time

soft_start_time

Timestamp

เวลาเริ่มต้นแบบค่อยเป็นค่อยไปของกรอบเวลา

soft_end_time

Timestamp

เวลาสิ้นสุดโดยประมาณของกรอบเวลา

cost_per_hour_before_soft_start_time

double

ค่าใช้จ่ายต่อชั่วโมงที่เพิ่มลงในค่าใช้จ่ายอื่นๆ ในโมเดลหากเหตุการณ์เกิดขึ้นก่อน soft_start_time โดยคํานวณดังนี้

   max(0, soft_start_time - t.seconds)
                          * cost_per_hour_before_soft_start_time / 3600,
t being the time of the event.

ค่าจัดส่งนี้ต้องเป็นค่าบวก และคุณจะตั้งค่าช่องนี้ได้ก็ต่อเมื่อมีการตั้งค่า soft_start_time ไว้เท่านั้น

cost_per_hour_after_soft_end_time

double

ค่าใช้จ่ายต่อชั่วโมงที่เพิ่มลงในค่าใช้จ่ายอื่นๆ ในโมเดลหากเหตุการณ์เกิดขึ้นหลังจาก soft_end_time โดยคํานวณดังนี้

   max(0, t.seconds - soft_end_time.seconds)
                    * cost_per_hour_after_soft_end_time / 3600,
t being the time of the event.

ต้นทุนนี้ต้องเป็นค่าบวก และคุณจะตั้งค่าช่องนี้ได้ก็ต่อเมื่อตั้งค่า soft_end_time แล้วเท่านั้น

TransitionAttributes

ระบุแอตทริบิวต์ของการเปลี่ยนระหว่างการเข้าชม 2 ครั้งติดต่อกันในเส้นทาง TransitionAttributes หลายรายการอาจใช้กับการเปลี่ยนผ่านเดียวกันได้ ในกรณีนี้ ระบบจะรวมค่าใช้จ่ายเพิ่มเติมทั้งหมดเข้าด้วยกันและใช้ข้อจำกัดหรือขีดจำกัดที่เข้มงวดที่สุด (ตามความหมายของ "AND" ที่เป็นธรรมชาติ)

ช่อง
src_tag

string

แท็กที่กําหนดชุดการเปลี่ยน (src->dst) ที่แอตทริบิวต์เหล่านี้มีผล

การเข้าชมแหล่งที่มาหรือจุดเริ่มต้นของยานพาหนะจะตรงกันก็ต่อเมื่อ VisitRequest.tags หรือ Vehicle.start_tags มี src_tag หรือไม่มี excluded_src_tag (ขึ้นอยู่กับว่าช่องใดใน 2 ช่องนี้ไม่ว่างเปล่า)

excluded_src_tag

string

ดูsrc_tag src_tag และ excluded_src_tag ต้องไม่ว่างเปล่าอย่างใดอย่างหนึ่ง

dst_tag

string

การเข้าชมปลายทางหรือจุดสิ้นสุดของยานพาหนะจะตรงกันก็ต่อเมื่อ VisitRequest.tags หรือ Vehicle.end_tags มี dst_tag หรือไม่มี excluded_dst_tag (ขึ้นอยู่กับว่าช่องใดใน 2 ช่องนี้ว่างเปล่า)

excluded_dst_tag

string

ดูdst_tag dst_tag และ excluded_dst_tag ต้องไม่ว่างเปล่าอย่างใดอย่างหนึ่ง

cost

double

ระบุค่าใช้จ่ายในการเปลี่ยนผ่านนี้ ค่านี้อยู่ในรูปแบบเดียวกับค่าใช้จ่ายอื่นๆ ทั้งหมดในโมเดลและต้องไม่ติดลบ โดยจะมีผลเพิ่มเติมจากค่าใช้จ่ายอื่นๆ ทั้งหมดที่มีอยู่

cost_per_kilometer

double

ระบุต้นทุนต่อกิโลเมตรที่ใช้กับระยะทางที่เดินทางขณะทำการเปลี่ยนนี้ ซึ่งจะรวมกับ Vehicle.cost_per_kilometer ที่ระบุไว้ในยานพาหนะ

distance_limit

DistanceLimit

ระบุขีดจํากัดของระยะทางที่เดินทางขณะทําการเปลี่ยนนี้

ในเดือนมิถุนายน 2021 ระบบจะรองรับเฉพาะขีดจำกัดที่ไม่บังคับเท่านั้น

delay

Duration

ระบุความล่าช้าที่เกิดขึ้นเมื่อทำการเปลี่ยนนี้

ความล่าช้านี้จะเกิดขึ้นหลังจากการเข้าชมแหล่งที่มาสิ้นสุดลงและก่อนเริ่มการเข้าชมปลายทางเสมอ

ยานพาหนะ

จำลองยานพาหนะในปัญหาการจัดส่ง การแก้ปัญหาการจัดส่งจะสร้างเส้นทางที่เริ่มต้นจาก start_location และสิ้นสุดที่ end_location สำหรับยานพาหนะนี้ เส้นทางคือลําดับการเข้าชม (ดู ShipmentRoute)

ช่อง
display_name

string

ชื่อที่แสดงของยานพาหนะที่ผู้ใช้กำหนด โดยชื่อมีความยาวได้สูงสุด 63 อักขระ และใช้อักขระ UTF-8 ได้

travel_mode

TravelMode

โหมดการเดินทางที่ส่งผลต่อถนนที่ยานพาหนะใช้ได้และความเร็วของยานพาหนะ โปรดดูtravel_duration_multiple

route_modifiers

RouteModifiers

ชุดเงื่อนไขที่ต้องเป็นไปตามที่ส่งผลต่อวิธีคำนวณเส้นทางสำหรับยานพาหนะหนึ่งๆ

start_location

LatLng

สถานที่ตั้งทางภูมิศาสตร์ที่ยานพาหนะเริ่มต้นก่อนไปรับการจัดส่ง หากไม่ได้ระบุ ยานพาหนะจะเริ่มที่จุดรับส่งแรก หากรูปแบบการจัดส่งมีเมทริกซ์ระยะเวลาและระยะทาง คุณไม่จำเป็นต้องระบุ start_location

start_waypoint

Waypoint

จุดสังเกตที่แสดงสถานที่ตั้งทางภูมิศาสตร์ที่ยานพาหนะเริ่มต้นก่อนรับการจัดส่ง หากไม่ได้ระบุทั้ง start_waypoint และ start_location ยานพาหนะจะเริ่มที่จุดรับส่งแรก หากรูปแบบการจัดส่งมีเมทริกซ์ระยะเวลาและระยะทาง คุณไม่จำเป็นต้องระบุ start_waypoint

end_location

LatLng

สถานที่ตั้งทางภูมิศาสตร์ที่รถสิ้นสุดการเดินทางหลังจากทำ VisitRequest สุดท้าย หากไม่ระบุ ShipmentRoute ของยานพาหนะจะสิ้นสุดลงทันทีเมื่อ VisitRequest สุดท้ายเสร็จสมบูรณ์ หากรูปแบบการจัดส่งมีเมทริกซ์ระยะเวลาและระยะทาง คุณไม่จำเป็นต้องระบุ end_location

end_waypoint

Waypoint

จุดสังเกตที่แสดงสถานที่ตั้งทางภูมิศาสตร์ที่ยานพาหนะสิ้นสุดการเดินทางหลังจากทำ VisitRequest รายการสุดท้าย หากไม่ระบุทั้ง end_waypoint และ end_location ShipmentRoute ของยานพาหนะจะสิ้นสุดทันทีเมื่อ VisitRequest สุดท้ายเสร็จสมบูรณ์ หากรูปแบบการจัดส่งมีเมทริกซ์ระยะเวลาและระยะทาง คุณไม่จำเป็นต้องระบุ end_waypoint

start_tags[]

string

ระบุแท็กที่แนบมากับจุดเริ่มต้นของเส้นทางของยานพาหนะ

ไม่อนุญาตให้ใช้สตริงที่ว่างเปล่าหรือซ้ำกัน

end_tags[]

string

ระบุแท็กที่แนบมากับส่วนท้ายของเส้นทางของยานพาหนะ

ไม่อนุญาตให้ใช้สตริงที่ว่างเปล่าหรือซ้ำกัน

start_time_windows[]

TimeWindow

ช่วงเวลาที่ยานพาหนะอาจออกจากจุดเริ่มต้น โดยต้องอยู่ภายในขีดจำกัดเวลาส่วนกลาง (ดูช่อง ShipmentModel.global_*) หากไม่ได้ระบุไว้ ระบบจะไม่จำกัดเวลานอกเหนือจากขีดจำกัดเวลาทั่วโลกเหล่านั้น

กรอบเวลาของช่องที่เกิดซ้ำเดียวกันต้องไม่ซ้อนทับกัน เช่น กรอบเวลาต้องไม่ซ้อนทับหรืออยู่ติดกับกรอบเวลาอื่น และต้องเป็นลำดับตามลำดับเวลา

คุณจะตั้งค่า cost_per_hour_after_soft_end_time และ soft_end_time ได้ก็ต่อเมื่อมีกรอบเวลาเดียวเท่านั้น

end_time_windows[]

TimeWindow

กรอบเวลารถอาจมาถึงจุดหมาย โดยต้องอยู่ภายในขีดจำกัดเวลาส่วนกลาง (ดูช่อง ShipmentModel.global_*) หากไม่ได้ระบุไว้ ระบบจะไม่จำกัดเวลานอกเหนือจากขีดจำกัดเวลาทั่วโลกเหล่านั้น

กรอบเวลาของช่องที่เกิดซ้ำเดียวกันต้องไม่ซ้อนทับกัน เช่น กรอบเวลาต้องไม่ซ้อนทับหรืออยู่ติดกับกรอบเวลาอื่น และต้องเป็นลำดับตามลำดับเวลา

คุณจะตั้งค่า cost_per_hour_after_soft_end_time และ soft_end_time ได้ก็ต่อเมื่อมีกรอบเวลาเดียวเท่านั้น

unloading_policy

UnloadingPolicy

นโยบายการขนถ่ายสินค้าที่มีผลกับยานพาหนะ

load_limits

map<string, LoadLimit>

ความจุของยานพาหนะ (น้ำหนัก ปริมาณ จำนวนพาเลต เป็นต้น) คีย์ในการแมปเป็นตัวระบุประเภทของการโหลด ซึ่งสอดคล้องกับคีย์ของฟิลด์ Shipment.load_demands หากไม่มีคีย์ใดในแผนที่นี้ ระบบจะถือว่าความจุที่เกี่ยวข้องนั้นไม่มีขีดจำกัด

cost_per_hour

double

ค่ายานพาหนะ: ค่าใช้จ่ายทั้งหมดจะรวมกันและต้องเป็นหน่วยเดียวกับ Shipment.penalty_cost

ค่าบริการต่อชั่วโมงของเส้นทางยานพาหนะ ค่าใช้จ่ายนี้จะมีผลกับเวลาทั้งหมดที่ใช้ในเส้นทาง ซึ่งรวมถึงเวลาเดินทาง เวลารอ และเวลาเข้าชม การใช้ cost_per_hour แทน cost_per_traveled_hour เพียงอย่างเดียวอาจส่งผลให้เกิดความล่าช้าเพิ่มเติม

cost_per_traveled_hour

double

ค่าบริการต่อชั่วโมงที่เดินทางของเส้นทางยานพาหนะ ต้นทุนนี้มีผลกับเวลาเดินทางตามเส้นทางเท่านั้น (นั่นคือเวลาที่รายงานใน ShipmentRoute.transitions) และไม่รวมเวลารอและเวลาเข้าชม

cost_per_kilometer

double

ค่าบริการต่อกิโลเมตรของเส้นทางยานพาหนะ โดยค่าใช้จ่ายนี้จะมีผลกับระยะทางที่รายงานใน ShipmentRoute.transitions และไม่มีผลกับระยะทางที่เดินทางโดยนัยจาก arrival_location ไปยัง departure_location ของ VisitRequest รายการเดียว

fixed_cost

double

ค่าใช้จ่ายคงที่จะมีผลหากใช้ยานพาหนะนี้เพื่อจัดการการจัดส่ง

used_if_route_is_empty

bool

ช่องนี้จะใช้ได้กับยานพาหนะเมื่อเส้นทางของยานพาหนะนั้นไม่มีการจัดส่ง ข้อมูลนี้ระบุว่าควรพิจารณายานพาหนะเป็นยานพาหนะมือสองหรือไม่ในกรณีนี้

หากเป็นจริง ยานพาหนะจะเดินทางจากจุดเริ่มต้นไปยังจุดสิ้นสุดแม้ว่าจะไม่ได้ให้บริการขนส่งใดๆ ก็ตาม และระบบจะพิจารณาเวลาและค่าใช้จ่ายจากระยะทางที่เกิดขึ้นจากการเดินทางจากจุดเริ่มต้นไปยังจุดสิ้นสุด

ไม่เช่นนั้น ยานพาหนะจะไม่เดินทางจากจุดเริ่มต้นไปยังจุดสิ้นสุด และไม่มีการกำหนดเวลา break_rule หรือความล่าช้า (จาก TransitionAttributes) สำหรับยานพาหนะนี้ ในกรณีนี้ ShipmentRoute ของยานพาหนะจะไม่มีข้อมูลใดๆ ยกเว้นดัชนีและป้ายกำกับยานพาหนะ

route_duration_limit

DurationLimit

ขีดจํากัดที่มีผลกับระยะเวลาทั้งหมดของเส้นทางยานพาหนะ ใน OptimizeToursResponse หนึ่งๆ ระยะเวลาของเส้นทางของยานพาหนะคือความแตกต่างระหว่าง vehicle_end_time กับ vehicle_start_time

travel_duration_limit

DurationLimit

ขีดจํากัดมีผลกับระยะเวลาการเดินทางของเส้นทางยานพาหนะ ใน OptimizeToursResponse หนึ่งๆ ระยะเวลาการเดินทางของเส้นทางคือผลรวมของ transitions.travel_duration ทั้งหมด

route_distance_limit

DistanceLimit

ขีดจํากัดที่มีผลกับระยะทางรวมของเส้นทางยานพาหนะ ใน OptimizeToursResponse หนึ่งๆ ระยะทางของเส้นทางคือผลรวมของ transitions.travel_distance_meters ทั้งหมด

extra_visit_duration_for_visit_type

map<string, Duration>

ระบุการแมปจากสตริง visit_types ไปยังระยะเวลา ระยะเวลาคือเวลาเพิ่มเติมจาก VisitRequest.duration ที่ใช้ในการเข้าชมที่มี visit_types ที่ระบุ ระยะเวลาการเข้าชมเพิ่มเติมนี้จะเพิ่มค่าใช้จ่ายหากระบุ cost_per_hour คีย์ (เช่น visit_types) ต้องไม่ใช่สตริงว่าง

หากคำขอเข้าชมมีหลายประเภท ระบบจะเพิ่มระยะเวลาสำหรับแต่ละประเภทในแผนที่

break_rule

BreakRule

อธิบายกำหนดเวลาพักที่จะบังคับใช้กับยานพาหนะนี้ หากว่างเปล่า ระบบจะไม่กำหนดเวลาพักสำหรับยานพาหนะนี้

label

string

ระบุป้ายกำกับสำหรับยานพาหนะนี้ ระบบจะรายงานป้ายกำกับนี้ในการตอบกลับเป็น vehicle_label ของ ShipmentRoute ที่เกี่ยวข้อง

ignore

bool

หากเป็นจริง used_if_route_is_empty ต้องเป็นเท็จ และยานพาหนะนี้จะยังคงไม่มีการใช้งาน

หากการจัดส่งดำเนินการโดยยานพาหนะที่ละเว้นใน injected_first_solution_routes ระบบจะข้ามการจัดส่งนั้นในโซลูชันแรก แต่สามารถดำเนินการในคำตอบได้

หากการจัดส่งดำเนินการโดยยานพาหนะที่ละเว้นใน injected_solution_constraint และมีการจำกัดการรับ/การนำส่งที่เกี่ยวข้องให้อยู่ในยานพาหนะ (กล่าวคือ ไม่ผ่อนปรนเป็นระดับ RELAX_ALL_AFTER_THRESHOLD) ระบบจะข้ามการจัดส่งนั้นในการตอบกลับ หากการจัดส่งมีช่อง allowed_vehicle_indices ที่ไม่ว่างเปล่าและระบบละเว้นยานพาหนะที่อนุญาตทั้งหมด ระบบจะข้ามการจัดส่งนั้นในการตอบกลับ

travel_duration_multiple

double

ระบุตัวคูณที่สามารถใช้เพื่อเพิ่มหรือลดเวลาเดินทางของยานพาหนะนี้ เช่น การตั้งค่านี้เป็น 2.0 หมายความว่ายานพาหนะนี้ช้ากว่าและมีเวลาเดินทางเป็น 2 เท่าของยานพาหนะมาตรฐาน อัตราส่วนนี้ไม่ส่งผลต่อระยะเวลาในการเข้าชม แต่จะมีผลต่อต้นทุนหากมีการระบุ cost_per_hour หรือ cost_per_traveled_hour ค่านี้ต้องอยู่ในช่วง [0.001, 1000.0] หากไม่ได้ตั้งค่า ยานพาหนะจะเป็นรุ่นมาตรฐาน และตัวคูณนี้จะถือว่าเท่ากับ 1.0

โปรดทราบว่าระบบจะปัดเศษเวลาเดินทางเป็นวินาทีที่ใกล้ที่สุดหลังจากใช้ตัวคูณนี้ แต่ก่อนที่จะดำเนินการทางตัวเลขใดๆ ดังนั้นตัวคูณขนาดเล็กอาจทำให้ความแม่นยำลดลง

ดูข้อมูลเพิ่มเติมได้ที่ extra_visit_duration_for_visit_type ด้านล่าง

DurationLimit

ขีดจํากัดที่กําหนดระยะเวลาสูงสุดของเส้นทางยานพาหนะ โดยอาจเป็นแบบแข็งหรือแบบอ่อนก็ได้

เมื่อกําหนดช่องขีดจํากัดสูงสุดแบบยืดหยุ่น คุณต้องกําหนดทั้งเกณฑ์สูงสุดแบบยืดหยุ่นและต้นทุนที่เกี่ยวข้องร่วมกัน

ช่อง
max_duration

Duration

ขีดจํากัดสูงสุดที่กําหนดให้ระยะเวลาต้องไม่เกิน max_duration

soft_max_duration

Duration

ขีดจํากัดแบบไม่บังคับจะไม่บังคับใช้ขีดจํากัดระยะเวลาสูงสุด แต่หากมีการละเมิด เส้นทางจะมีค่าใช้จ่าย ต้นทุนนี้จะรวมกับต้นทุนอื่นๆ ที่กําหนดไว้ในโมเดลซึ่งมีหน่วยเดียวกัน

หากมีการกําหนด soft_max_duration ต้องไม่เป็นค่าลบ หากมีการกําหนด max_duration ด้วย soft_max_duration ต้องน้อยกว่า max_duration

quadratic_soft_max_duration

Duration

ขีดจํากัดแบบไม่บังคับจะไม่บังคับใช้ขีดจํากัดระยะเวลาสูงสุด แต่หากมีการละเมิด เส้นทางจะมีต้นทุนแบบ 2 เท่าตามระยะเวลา ต้นทุนนี้จะรวมกับต้นทุนอื่นๆ ที่กําหนดไว้ในโมเดลซึ่งมีหน่วยเดียวกัน

หากมีการกําหนด quadratic_soft_max_duration ต้องไม่เป็นค่าลบ หากมีการกําหนด max_duration ด้วย quadratic_soft_max_duration ต้องน้อยกว่า max_duration และส่วนต่างต้องไม่เกิน 1 วัน

max_duration - quadratic_soft_max_duration <= 86400 seconds

cost_per_hour_after_soft_max

double

ค่าใช้จ่ายต่อชั่วโมงที่เกิดขึ้นหากมีการละเมิดเกณฑ์ soft_max_duration ค่าใช้จ่ายเพิ่มเติมจะเป็น 0 หากระยะเวลาอยู่ต่ำกว่าเกณฑ์ มิเช่นนั้นค่าใช้จ่ายจะขึ้นอยู่กับระยะเวลา ดังนี้

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

ค่าใช้จ่ายต้องไม่ติดลบ

cost_per_square_hour_after_quadratic_soft_max

double

ต้นทุนต่อชั่วโมงสี่เหลี่ยมจัตุรัสที่เกิดขึ้นหากมีการละเมิดเกณฑ์ quadratic_soft_max_duration

ค่าใช้จ่ายเพิ่มเติมจะเป็น 0 หากระยะเวลาอยู่ต่ำกว่าเกณฑ์ มิเช่นนั้นค่าใช้จ่ายจะขึ้นอยู่กับระยะเวลา ดังนี้

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

ค่าใช้จ่ายต้องไม่ติดลบ

LoadLimit

กําหนดขีดจํากัดน้ำหนักบรรทุกที่ใช้กับยานพาหนะ เช่น "รถบรรทุกนี้บรรทุกได้สูงสุด 3, 500 กก." ดูload_limits

ช่อง
soft_max_load

int64

ขีดจำกัดแบบไม่เข้มงวดของการโหลด ดูcost_per_unit_above_soft_max

cost_per_unit_above_soft_max

double

หากน้ำหนักบรรทุกเกิน soft_max_load ตลอดเส้นทางของยานพาหนะนี้ ระบบจะหักค่าใช้จ่ายต่อไปนี้ (1 ครั้งต่อยานพาหนะ) (น้ำหนักบรรทุก - soft_max_load) * cost_per_unit_above_soft_max ค่าใช้จ่ายทั้งหมดจะรวมกันและต้องเป็นหน่วยเดียวกับ Shipment.penalty_cost

start_load_interval

Interval

ช่วงเวลาของน้ำหนักบรรทุกที่ยอมรับได้ของยานพาหนะเมื่อเริ่มเส้นทาง

end_load_interval

Interval

ช่วงเวลาการบรรทุกที่ยอมรับได้ของยานพาหนะเมื่อสิ้นสุดเส้นทาง

max_load

int64

ปริมาณการโหลดสูงสุดที่ยอมรับได้

ช่วงเวลา

ช่วงเวลาของปริมาณการโหลดที่ยอมรับได้

ช่อง
min

int64

น้ำหนักบรรทุกขั้นต่ำที่ยอมรับได้ ต้องมากกว่าหรือเท่ากับ 0 หากระบุทั้ง 2 รายการ min ต้อง ≤ max

max

int64

น้ำหนักบรรทุกสูงสุดที่ยอมรับได้ ต้องมากกว่าหรือเท่ากับ 0 หากไม่ได้ระบุ ระบบจะไม่จำกัดน้ำหนักบรรทุกสูงสุดด้วยข้อความนี้ หากระบุทั้ง 2 รายการ min ต้อง ≤ max

TravelMode

โหมดการเดินทางที่ยานพาหนะใช้ได้

ซึ่งควรเป็นชุดย่อยของโหมดการเดินทางของ Routes Preferred API ของ Google Maps Platform ดูได้ที่ https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode

Enum
TRAVEL_MODE_UNSPECIFIED โหมดการเดินทางที่ไม่ระบุ ซึ่งเทียบเท่ากับ DRIVING
DRIVING โหมดการเดินทางที่สอดคล้องกับเส้นทางการขับรถ (รถยนต์ ฯลฯ)
WALKING โหมดการเดินทางที่สอดคล้องกับเส้นทางเดิน

UnloadingPolicy

นโยบายเกี่ยวกับวิธีขนถ่ายยานพาหนะ ใช้กับการจัดส่งที่มีทั้งการรับสินค้าและการนำส่งเท่านั้น

การจัดส่งอื่นๆ จะเกิดขึ้นที่ใดก็ได้ในเส้นทางโดยไม่ขึ้นอยู่กับ unloading_policy

Enum
UNLOADING_POLICY_UNSPECIFIED นโยบายการขนถ่ายที่ไม่ได้ระบุไว้ การนำส่งต้องเกิดขึ้นหลังจากการยกเลิกการจองที่เกี่ยวข้อง
LAST_IN_FIRST_OUT การนำส่งต้องเกิดขึ้นในลำดับที่กลับกันของการรับสินค้า
FIRST_IN_FIRST_OUT การนำส่งต้องเกิดขึ้นตามลำดับเดียวกับการรับสินค้า

จุดบอกทาง

บรรจุจุดอ้างอิง จุดสังเกตจะระบุสถานที่มาถึงและออกเดินทางของคำขอเข้าชม รวมถึงสถานที่เริ่มต้นและสิ้นสุดของยานพาหนะ

ช่อง
side_of_road

bool

ไม่บังคับ บ่งบอกว่าตําแหน่งของจุดแวะพักนี้มีไว้เพื่อกำหนดค่ากำหนดให้ยานพาหนะหยุดที่ด้านใดด้านหนึ่งของถนน เมื่อคุณตั้งค่านี้ เส้นทางจะผ่านสถานที่ตั้งเพื่อให้ยานพาหนะหยุดที่ริมถนนซึ่งอยู่ด้านข้างของสถานที่ตั้งจากจุดกึ่งกลางของถนน ตัวเลือกนี้ใช้ไม่ได้กับโหมดการเดินทาง "เดิน"

ฟิลด์สหภาพ location_type วิธีต่างๆ ในการแสดงสถานที่ location_type ต้องเป็นค่าใดค่าหนึ่งต่อไปนี้เท่านั้น
location

Location

จุดที่ระบุโดยใช้พิกัดทางภูมิศาสตร์ รวมถึงส่วนหัวที่ไม่บังคับ

place_id

string

รหัสสถานที่ของจุดที่น่าสนใจที่เชื่อมโยงกับจุดสังเกต