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]
    • ไม่ได้ตั้งค่านาโนหรือตั้งค่าเป็น 0
  • google.protobuf.Duration
    • ต้องเป็น [0, 253402300799] เช่น ใน [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00]
    • ไม่ได้ตั้งค่านาโนหรือตั้งค่าเป็น 0
  • google.type.LatLng
    • ละติจูดต้องอยู่ใน [-90.0, 90.0]
    • ลองจิจูดต้องอยู่ในช่วง [-180.0, 180.0]
    • ละติจูดและลองจิจูดอย่างน้อยหนึ่งรายการต้องไม่เป็นศูนย์
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

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

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

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

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

หากช่อง done ของ LRO เป็นจริง แสดงว่าคำขอทั้งหมดได้รับการดำเนินการแล้ว คำขอที่ประมวลผลสำเร็จจะมีผลลัพธ์แสดงอยู่ใน GCS คำขอที่ล้มเหลวจะไม่แสดงผลลัพธ์ใน GCS หากมีการตั้งค่าช่อง 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 ทั้งหมด (resp. 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 ค่าไม่ถูกต้อง รูปแบบต้องเป็น UNSPECIFIED
JSON JavaScript Object Notation
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 และ
  • relaxations(i).threshold_visit_count == 0 และปลายรถจะผ่อนปรนเป็น relaxations(i).level หากเป็นไปตามข้อกำหนดต่อไปนี้
  • vehicle_end_time >= relaxations(i).threshold_time และ
  • 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 และ 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 เวลาเริ่มต้น/สิ้นสุดการเข้าชมจะได้รับการผ่อนปรน แต่การเข้าชมแต่ละครั้งจะยังคงผูกกับยานพาหนะเดียวกันและต้องปฏิบัติตามลำดับการเข้าชม นั่นคือไม่สามารถแทรกการเข้าชมไปมาระหว่างทั้ง 2 อย่างหรือก่อนหน้าได้
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.RouteoptimizerService.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

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

ตั้งแต่ปี 2020/11 เป็นต้นไป ตัวแปรนี้จะเติมเฉพาะโพลีไลน์ของเส้นทางที่ไม่ว่างเปล่าและกำหนดให้ 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 โดยจะใช้ได้เมื่อการจัดส่งหรือดัชนียานพาหนะในคำขอมีการเปลี่ยนแปลงตั้งแต่มีการสร้างโซลูชัน ซึ่งอาจเป็นเพราะมีการนำการจัดส่งหรือยานพาหนะออกจากหรือเพิ่มไปยังคำขอแล้ว

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

หาก 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) ยกเว้น troubleshooting_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 ซึ่งจะรายงานแบบรวมข้อมูล ณ วันที่ 1/2022 เท่านั้น

total_cost

double

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

OptimizeToursValidationError

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

ช่อง
code

int32

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

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

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

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

REFERENCE: รายการคู่รหัสทั้งหมด (รหัสและชื่อ)

  • ไม่ระบุ = 0;
  • VALIDATION_TIMEOUT_ERROR = 10; การตรวจสอบไม่เสร็จสิ้นภายในกำหนดเวลา
  • REQUEST_OPTIONS_ERROR = 12;

    • REQUEST_OPTIONS_INVALID_SOLVING_MODE = 1201;
    • REQUEST_OPTIONS_INVALID_MAX_VALIDATION_ERRORS = 1203;
    • REQUEST_OPTIONS_INVALID_GEODESIC_METERS_PER_SECOND = 1204;
    • REQUEST_OPTIONS_GEODESIC_METERS_PER_SECOND_TOO_SMALL = 1205;
    • REQUEST_OPTIONS_MISSING_GEODESIC_METERS_PER_SECOND = 1206;
    • REQUEST_OPTIONS_POPULATE_PATHFINDER_TRIPS_AND_GEODESIC_DISTANCE = 1207;
    • REQUEST_OPTIONS_COST_MODEL_OPTIONS_AND_GEODESIC_DISTANCE = 1208;
    • REQUEST_OPTIONS_TRAVEL_mode_INCOMPATIBLE_WITH_TRAFFIC = 1211;
    • REQUEST_OPTIONS_MULTIPLE_TRAFFIC_FLAVORS = 1212;
    • REQUEST_OPTIONS_INVALID_TRAFFIC_FLAVOR = 1213;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITHOUT_GLOBAL_START_TIME = 1214;
    • REQUEST_OPTIONS_TRAFFIC_enabled_WITH_PRECEDENCES = 1215;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_mode_INVALID = 1216;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_ENABLED_WITHOUT_TRAFFIC = 1217;
  • INJECTED_SOLUTION_ERROR = 20;
    • INJECTED_SOLUTION_MISSING_LABEL = 2000;
    • INJECTED_SOLUTION_DUPLICATE_LABEL = 2001;
    • INJECTED_SOLUTION_AMBIGUOUS_INDEX = 2002;
    • INJECTED_SOLUTION_INFEASIBLE_AFTER_GETting_TRAVEL_TIMES = 2003;
    • INJECTED_SOLUTION_TRANSITION_INCONSISTENT_WITH_ACTUAL_TRAVEL = 2004;
    • INJECTED_SOLUTION_CONCURRENT_SOLUTION_TYPES = 2005;
    • INJECTED_SOLUTION_MORE_THAN_ONE_PER_TYPE = 2006;
    • INJECTED_SOLUTION_REFRESH_WITHOUT_POPULATE = 2008;
    • INJECTED_SOLUTION_CONSTRAINED_ROUTE_PORTION_INFEASIBLE = 2010;
  • SHIPMENT_MODEL_ERROR = 22;
    • SHIPMENT_MODEL_TOO_LARGE = 2200;
    • SHIPMENT_MODEL_TOO_MANY_CAPACITY_TYPES = 2201;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_NEGATIVE_OR_NAN = 2202;
    • SHIPMENT_MODEL_GLOBAL_END_TIME_TOO_LARGE_OR_NAN = 2203;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_AFTER_GLOBAL_END_TIME = 2204;
    • SHIPMENT_MODEL_GLOBAL_DURATION_TOO_LONG = 2205;
    • SHIPMENT_MODEL_MAX_ACTIVE_VEHICLES_NOT_POSITIVE = 2206;
    • SHIPMENT_MODEL_DURATION_MATRIX_TOO_LARGE = 2207;
  • INDEX_ERROR = 24;
  • TAG_ERROR = 26;
  • TIME_WINDOW_ERROR = 28;
    • TIME_WINDOW_INVALID_START_TIME = 2800;
    • TIME_WINDOW_INVALID_END_TIME = 2801;
    • TIME_WINDOW_INVALID_SOFT_START_TIME = 2802;
    • TIME_WINDOW_INVALID_SOFT_END_TIME = 2803;
    • TIME_WINDOW_OUTSIDE_GLOBAL_TIME_WINDOW = 2804;
    • TIME_WINDOW_START_TIME_AFTER_END_TIME = 2805;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_BEFORE_SOFT_START_TIME = 2806;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_AFTER_SOFT_END_TIME = 2807;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_WITHOUT_SOFT_START_TIME = 2808;
    • TIME_WINDOW_COST_AFTER_SOFT_END_TIME_WITHOUT_SOFT_END_TIME = 2809;
    • TIME_WINDOW_SOFT_START_TIME_WITHOUT_COST_BEFORE_SOFT_START_TIME = 2810;
    • TIME_WINDOW_SOFT_END_TIME_WITHOUT_COST_AFTER_SOFT_END_TIME = 2811;
    • TIME_WINDOW_OVERLAPPING_ADJACENT_OR_EARLIER_THAN_PREVIOUS = 2812;
    • TIME_WINDOW_START_TIME_AFTER_SOFT_START_TIME = 2813;
    • TIME_WINDOW_SOFT_START_TIME_OUTSIDE_GLOBAL_TIME_WINDOW = 2819;
    • TIME_WINDOW_SOFT_END_TIME_OUTSIDE_GLOBAL_TIME_WINDOW = 2820;
    • TIME_WINDOW_SOFT_END_TIME_AFTER_END_TIME = 2816;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_SET_AND_MULTIPLE_WINDOWS = 2817
    • TIME_WINDOW_COST_AFTER_SOFT_END_TIME_SET_AND_MULTIPLE_WINDOWS = 2818;
    • TRANSITION_ATTRIBUTES_ERROR = 30;
    • TRANSITION_ATTRIBUTES_INVALID_COST = 3,000
    • TRANSITION_ATTRIBUTES_INVALID_COST_PER_KILOMETER = 3001
    • TRANSITION_ATTRIBUTES_DUPLICATE_TAG_PAIR = 3002;
    • TRANSITION_ATTRIBUTES_DISTANCE_LIMIT_MAX_METERS_UNSUPPORTED = 3003
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_SOURCE_TAGS = 3004;
    • TRANSITION_ATTRIBUTES_CONFLICTING_SOURCE_TAGS_FIELDS = 3005;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_DESTINATION_TAGS = 3006;
    • TRANSITION_ATTRIBUTES_CONFLICTING_DESTINATION_TAGS_FIELDS = 3007;
    • TRANSITION_ATTRIBUTES_DELAY_DURATION_NEGATIVE_OR_NAN = 3008;
    • TRANSITION_ATTRIBUTES_DELAY_DURATION_EXCEEDS_GLOBAL_DURATION = 3009;
  • AMOUNT_ERROR = 31;
    • AMOUNT_NEGATIVE_VALUE = 3,100
  • LOAD_LIMIT_ERROR = 33;
    • LOAD_LIMIT_INVALID_COST_ABOVE_SOFT_MAX = 3303
    • LOAD_LIMIT_SOFT_MAX_WITHOUT_COST_ABOVE_SOFT_MAX = 3304
    • LOAD_LIMIT_COST_ABOVE_SOFT_MAX_WITHOUT_SOFT_MAX = 3305
    • LOAD_LIMIT_NEGATIVE_SOFT_MAX = 3306
    • LOAD_LIMIT_MIXED_DEMAND_TYPE = 3307;
    • LOAD_LIMIT_MAX_LOAD_NEGATIVE_VALUE = 3308;
    • LOAD_LIMIT_SOFT_MAX_ABOVE_MAX = 3309
  • INTERVAL_ERROR = 34;
    • INTERVAL_MIN_EXCEEDS_MAX = 3401
    • INTERVAL_NEGATIVE_MIN = 3402;
    • INTERVAL_NEGATIVE_MAX = 3403
    • INTERVAL_MIN_EXCEEDS_CAPACITY = 3404;
    • INTERVAL_MAX_EXCEEDS_CAPACITY = 3405;
  • DISTANCE_LIMIT_ERROR = 36;
    • DISTANCE_LIMIT_INVALID_COST_AFTER_SOFT_MAX = 3601;
    • DISTANCE_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3602;
    • DISTANCE_LIMIT_COST_หลังจาก_SOFT_MAX_WITHOUT_SOFT_MAX = 3603
    • DISTANCE_LIMIT_NEGATIVE_MAX = 3604
    • DISTANCE_LIMIT_NEGATIVE_SOFT_MAX = 3605
    • DISTANCE_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3606;
  • DURATION_LIMIT_ERROR = 38;
    • DURATION_LIMIT_MAX_DURATION_NEGATIVE_OR_NAN = 3800;
    • DURATION_LIMIT_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3801;
    • DURATION_LIMIT_INVALID_COST_PER_HOUR_AFTER_SOFT_MAX = 3802
    • DURATION_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3803
    • DURATION_LIMIT_COST_หลังจาก_SOFT_MAX_WITHOUT_SOFT_MAX = 3804
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3805;
    • DURATION_LIMIT_INVALID_COST_AFTER_QUADRATIC_SOFT_MAX = 3806
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_COST_PER_SQUARE_HOUR = 3807
    • DURATION_LIMIT_COST_PER_SQUARE_HOUR_WITHOUT_QUADRATIC_SOFT_MAX = 3808;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_MAX = 3809
    • DURATION_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3810
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_LARGER_THAN_MAX = 3811
    • DURATION_LIMIT_DIFF_BETWEEN_MAX_AND_QUADRATIC_SOFT_MAX_TOO_LARGE = 3812
    • DURATION_LIMIT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3813;
    • DURATION_LIMIT_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3814;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3815;
  • SHIPMENT_ERROR = 40;
    • SHIPMENT_PD_LIMIT_WITHOUT_PICKUP_AND_DELIVERY = 4014;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_NEGATIVE_OR_NAN = 4000;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4001;
    • SHIPMENT_PD_RELATIVE_DETOUR_LIMIT_INVALID = 4015;
    • SHIPMENT_PD_DETOUR_LIMIT_AND_EXTRA_VISIT_DURATION = 4016;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_NEGATIVE_OR_NAN = 4002;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4003;
    • SHIPMENT_EMPTY_SHIPMENT_TYPE = 4004;
    • SHIPMENT_NO_PICKUP_NO_DELIVERY = 4005;
    • SHIPMENT_INVALID_PENALTY_COST = 4006
    • SHIPMENT_ALLOWED_VEHICLE_INDEX_OUT_OF_BOUNDS = 4007;
    • SHIPMENT_DUPLICATE_Allowed_VEHICLE_INDEX = 4008;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITHOUT_INDEX = 4009;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITH_INDEX = 4010;
    • SHIPMENT_INVALID_COST_FOR_VEHICLE = 4011;
    • SHIPMENT_COST_FOR_VEHICLE_INDEX_OUT_OF_BOUNDS = 4012;
    • SHIPMENT_DUPLICATE_COST_FOR_VEHICLE_INDEX = 4013;
  • VEHICLE_ERROR = 42;
    • VEHICLE_EMPTY_REQUIRED_OPERATOR_TYPE = 4200;
    • VEHICLE_DUPLICATE_REQUIRED_OPERATOR_TYPE = 4201;
    • VEHICLE_NO_OPERATOR_WITH_REQUIRED_OPERATOR_TYPE = 4202;
    • VEHICLE_EMPTY_START_TAG = 4203;
    • VEHICLE_DUPLICATE_START_TAG = 4204;
    • VEHICLE_EMPTY_END_TAG = 4205;
    • VEHICLE_DUPLICATE_END_TAG = 4206;
    • VEHICLE_EXTRA_VISIT_DURATION_NEGATIVE_OR_NAN = 4207;
    • VEHICLE_EXTRA_VISIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4208;
    • VEHICLE_EXTRA_VISIT_DURATION_EMPTY_KEY = 4209;
    • VEHICLE_FIRST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4210;
    • VEHICLE_FIRST_SHIPMENT_IGNORED = 4211;
    • VEHICLE_FIRST_SHIPMENT_NOT_BOUND = 4212;
    • VEHICLE_LAST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4213;
    • VEHICLE_LAST_SHIPMENT_IGNORED = 4214;
    • VEHICLE_LAST_SHIPMENT_NOT_BOUND = 4215;
    • VEHICLE_IGNORED_WITH_USED_IF_ROUTE_IS_EMPTY = 4216;
    • VEHICLE_INVALID_COST_PER_KILOMETER = 4217;
    • VEHICLE_INVALID_COST_PER_HOUR = 4,218
    • VEHICLE_INVALID_COST_PER_TRAVELED_HOUR = 4,219
    • VEHICLE_INVALID_FIXED_COST = 4220
    • VEHICLE_INVALID_TRAVEL_DURATION_MULTIPLE = 4,221
    • VEHICLE_TRAVEL_DURATION_MULTIPLE_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4223;
    • VEHICLE_MATRIX_INDEX_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4224;
    • VEHICLE_MINIMUM_DURATION_LONGER_THAN_DURATION_LIMIT = 4222;
  • VISIT_REQUEST_ERROR = 44;
    • VISIT_REQUEST_EMPTY_TAG = 4400;
    • VISIT_REQUEST_DUPLICATE_TAG = 4401;
    • VISIT_REQUEST_DURATION_NEGATIVE_OR_NAN = 4404
    • VISIT_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4405;
  • PRECEDENCE_ERROR = 46;
    • PRECEDENCE_RULE_MISSING_FIRST_INDEX = 4600;
    • PRECEDENCE_RULE_MISSING_SECOND_INDEX = 4601;
    • PRECEDENCE_RULE_FIRST_INDEX_OUT_OF_BOUNDS = 4602;
    • PRECEDENCE_RULE_SECOND_INDEX_OUT_OF_BOUNDS = 4603;
    • PRECEDENCE_RULE_DUPLICATE_INDEX = 4604
    • PRECEDENCE_RULE_INEXISTENT_FIRST_VISIT_REQUEST = 4605;
    • PRECEDENCE_RULE_INEXISTENT_SECOND_VISIT_REQUEST = 4606;
  • BREAK_ERROR = 48;
    • BREAK_RULE_EMPTY = 4800
    • BREAK_REQUEST_UNSPECIFIED_DURATION = 4801
    • BREAK_REQUEST_UNSPECIFIED_EARLIEST_START_TIME = 4802;
    • BREAK_REQUEST_UNSPECIFIED_LATEST_START_TIME = 4803
    • BREAK_REQUEST_DURATION_NEGATIVE_OR_NAN = 4804 = 4804;
    • BREAK_REQUEST_LATEST_START_TIME_BEFORE_EARLIEST_START_TIME = 4805
    • BREAK_REQUEST_EARLIEST_START_TIME_BEFORE_GLOBAL_START_TIME = 4806
    • BREAK_REQUEST_LATEST_END_TIME_AFTER_GLOBAL_END_TIME = 4807;
    • BREAK_REQUEST_NON_SCHEDULABLE = 4808;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_NEGATIVE_OR_NAN = 4809
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_NEGATIVE_OR_NAN = 4810
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4811;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4812;
    • BREAK_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4813;
    • BREAK_FREQUENCY_MISSING_MAX_INTER_BREAK_DURATION = 4814;
    • BREAK_FREQUENCY_MISSING_MIN_BREAK_DURATION = 4815;
  • SHIPMENT_TYPE_INCOMPATIBILITY_ERROR = 50;
    • SHIPMENT_TYPE_INCOMPATIBILITY_EMPTY_TYPE = 5001;
    • SHIPMENT_TYPE_INCOMPATIBILITY_LESS_THAN_TWO_TYPES = 5002;
    • SHIPMENT_TYPE_INCOMPATIBILITY_DUPLICATE_TYPE = 5003;
    • SHIPMENT_TYPE_INCOMPATIBILITY_INVALID_INCOMPATIBILITY_mode = 5004;
    • SHIPMENT_TYPE_INCOMPATIBILITY_TOO_MANY_INCOMPATIBILITIES = 5005;
  • SHIPMENT_TYPE_REQUIREMENT_ERROR = 52;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE = 52001;
    • SHIPMENT_TYPE_REQUIREMENT_NO_DEPENDENT_TYPE = 52002;
    • SHIPMENT_TYPE_REQUIREMENT_INVALID_REQUIREMENT_mode = 52003;
    • SHIPMENT_TYPE_REQUIREMENT_TOO_MANY_REQUIREMENTS = 52004;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_REQUIRED_TYPE = 52005;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_REQUIRED_TYPE = 52006;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE_FOUND = 52007;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_DEPENDENT_TYPE = 52008;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_DEPENDENT_TYPE = 52009;
    • SHIPMENT_TYPE_REQUIREMENT_SELF_DEPENDENT_TYPE = 52010;
    • SHIPMENT_TYPE_REQUIREMENT_GRAPH_HAS_CYCLES = 52011;
  • VEHICLE_OPERATOR_ERROR = 54;
    • VEHICLE_OPERATOR_EMPTY_TYPE = 5400;
    • VEHICLE_OPERATOR_MULTIPLE_START_TIME_WINDOWS = 5401;
    • VEHICLE_OPERATOR_SOFT_START_TIME_WINDOW = 5402;
    • VEHICLE_OPERATOR_MULTIPLE_END_TIME_WINDOWS = 5403;
    • VEHICLE_OPERATOR_SOFT_END_TIME_WINDOW = 5404;
  • DURATION_SECONDS_MATRIX_ERROR = 56
    • DURATION_SECONDS_MATRIX_DURATION_NEGATIVE_OR_NAN = 5,600
    • DURATION_SECONDS_MATRIX_DURATION_EXCEEDS_GLOBAL_DURATION = 5601;
  • คำเตือน = 9;
    • WARNING_INJECTED_FIRST_SOLUTION = 90;
      • WARNING_INJECTED_FIRST_SOLUTION_INFEASIBLE_SHIPMENTS_REMOVED = 9000;
      • WARNING_INJECTED_FIRST_SOLUTION_INFEASIBLE_AFTER_GETting_TRAVEL_TIMES = 9001;
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 จะอ้างอิงช่องหนึ่งๆ ในไฟล์นี้เสมอและเป็นไปตามโครงสร้างลำดับชั้นเดียวกัน ตัวอย่างเช่น เราอาจระบุองค์ประกอบ #2 ของ start_time_windows ของยานพาหนะ #5 โดยใช้

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

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

ช่อง
name

string

ชื่อช่อง เช่น "ยานพาหนะ"

sub_field

FieldReference

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

ฟิลด์สหภาพ index_or_key

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

index

int32

ดัชนีของฟิลด์ หากมีค่าซ้ำ

key

string

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

OutputConfig

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

ช่อง
data_format

DataFormat

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

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

GcsDestination

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

RouteModifiers

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

ช่อง
avoid_tolls

bool

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

avoid_highways

bool

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

avoid_ferries

bool

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

avoid_indoor

bool

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

การจัดส่ง

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

ช่อง
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

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

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

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

costs_per_vehicle_indices[]

int32

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

pickup_to_delivery_absolute_detour_limit

Duration

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

ตัวอย่างเช่น สมมติให้ 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

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

shipment_type

string

สตริงที่ไม่ว่างเปล่าซึ่งระบุ "type" สำหรับการจัดส่งนี้ ฟีเจอร์นี้สามารถใช้เพื่อนิยามความไม่เข้ากันหรือข้อกำหนดระหว่าง 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

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

เช่น ระบุระยะเวลาที่สั้นที่สุดในการเดินทางจากจุดรับสินค้าที่เลือกไปยังตัวเลือกการจัดส่งที่เลือกโดยตรง จากนั้นการตั้งค่า 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 คุณอาจต้องการตั้งค่ากรอบเวลานี้ให้มีระยะเวลาที่น้อยลงเพื่อเพิ่มประสิทธิภาพ (เช่น หากคุณจำลองแบบวันเดียว คุณควรตั้งขีดจำกัดเวลาทั่วโลกเป็นวันนั้น) หากไม่ได้ตั้งค่า ระบบจะใช้เวลา 00:00:00 น. UTC ของวันที่ 1 มกราคม 1970 (เช่น วินาที: 0, นาโน: 0) เป็นค่าเริ่มต้น

global_end_time

Timestamp

หากไม่ได้ตั้งค่า ระบบจะใช้เวลา 00:00:00 UTC ของวันที่ 1 มกราคม 1971 (เช่น วินาที: 31536000, nanos: 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 คันเริ่มออกเดินทางที่ LoA และสิ้นสุดที่ 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 คันเริ่มต้นเส้นทางที่ LoA และสิ้นสุดที่ 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) ถึงการเข้าชมอื่นๆ ในเมทริกซ์ 1

แท็กจะสอดคล้องกับ VisitRequest.tags หรือ Vehicle.start_tags VisitRequest หรือ Vehicle ที่ระบุต้องตรงกับแท็กเพียง 1 รายการในช่องนี้ โปรดทราบว่าแท็กต้นทาง ปลายทาง และแท็กเมทริกซ์ของ 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 ที่ระบุต้องตรงกับแท็กเพียง 1 รายการในช่องนี้ โปรดทราบว่าแท็กต้นทาง ปลายทาง และเมทริกซ์ของ Vehicle อาจเหมือนกัน และแท็กต้นทางและปลายทางของ VisitRequest ก็อาจเหมือนกัน แท็กทั้งหมดต้องไม่ซ้ำกันและไม่สามารถเป็นสตริงว่างเปล่าได้ หากช่องนี้ไม่ว่าง ต้องระบุ duration_distance_matrices

transition_attributes[]

TransitionAttributes

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

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

ชุด delivery_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

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

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

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

แถว

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

ช่อง
durations[]

Duration

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

meters[]

double

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

PrecedenceRule

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

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

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

ช่อง
first_is_delivery

bool

ระบุว่าตัวเลือก "รายการแรก" กิจกรรมคือการส่ง

second_is_delivery

bool

ระบุว่า "วินาที" กิจกรรมคือการส่ง

offset_duration

Duration

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

first_index

int32

ดัชนีการจัดส่งของ "รายการแรก" กิจกรรม ต้องระบุฟิลด์นี้

second_index

int32

ดัชนีการจัดส่ง "วินาที" กิจกรรม ต้องระบุฟิลด์นี้

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

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

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

ตัวแปร:

  • หากมีการเข้าชม 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 ระหว่างการเปลี่ยนผ่านนี้

  • โดยไม่ซ้อนทับกัน
  • ซึ่งระยะเวลาดังกล่าวไม่ซ้ำกันและต้องเป็นระยะเวลาต่อเนื่องกันก่อนการเข้าชมครั้งถัดไป (หรือสิ้นสุดยานพาหนะ) ดังนั้น การทราบระยะเวลาหน่วงเวลาเพื่อให้ทราบเวลาเริ่มต้นและสิ้นสุดก็เพียงพอแล้ว
  • BREAKS เป็นช่วงเวลาต่อเนื่องและไม่ซ้อนทับกัน การตอบกลับจะระบุเวลาเริ่มต้นและระยะเวลาของช่วงพักแต่ละช่วง
  • 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

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

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" และค่าเหล่านี้คือค่าใช้จ่ายทั้งหมดที่เกิดขึ้นจากช่องค่าใช้จ่ายที่เกี่ยวข้อง ซึ่งรวมจากเส้นทางทั้งหมด กล่าวคือ cost["model.shipments.pickups.cost"] คือผลรวมของค่าใช้จ่ายการรับสินค้าทั้งหมดตลอดเส้นทาง ระบบจะรายงานค่าใช้จ่ายทั้งหมดที่กำหนดไว้ในโมเดลอย่างละเอียดที่นี่ ยกเว้นค่าใช้จ่ายที่เกี่ยวข้องกับ TransitionAttributes ซึ่งจะรายงานแบบรวมข้อมูล ณ วันที่ 1/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 ของการเปลี่ยนนี้
  • หาก ShipmentRoute.has_traffic_infeasibilities เป็นเท็จ จะมีการระงับเพิ่มเติมต่อไปนี้: `total_duration = travel_duration + delay_duration
  • break_duration +Wait_duration`
start_time

Timestamp

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

route_polyline

EncodedPolyline

การแสดงเส้นประกอบที่เข้ารหัสของเส้นทางที่ติดตามระหว่างการเปลี่ยน ระบบจะป้อนข้อมูลในช่องนี้หากมีการตั้งค่า 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

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

ช่อง
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

ระบุข้อกำหนดระหว่างการจัดส่งตามชนิดของการจัดส่ง [delivery_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 รายการในยานพาหนะ ณ เวลาที่รับ

"ผู้พึ่งพา" จุดรับพัสดุจึงต้องมีอย่างใดอย่างหนึ่งต่อไปนี้

  • การจัดส่ง "ต้องระบุ" สำหรับการนำส่งเท่านั้นซึ่งนำส่งในเส้นทางหลังจากหรือ
  • A "ต้องระบุ" เส้นทางการจัดส่งสินค้าครั้งแรกก่อน หากเส้นทางการจัดส่ง "จำเป็น" การจัดส่งมีการนำส่ง การนำส่งนี้ต้องดำเนินการหลังจาก "ขึ้นต่อกัน" การมารับสินค้าที่ร้าน
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 Start ของกรอบเวลา

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 ที่แน่นอน 1 รายการ

cost

double

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

cost_per_kilometer

double

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

distance_limit

DistanceLimit

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

ตั้งแต่ปี 2021/06 เป็นต้นไป ระบบจะรองรับเฉพาะขีดจำกัดชั่วคราวเท่านั้น

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>

ระบุแผนที่จากสตริง traffic_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

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

เมื่อกำหนดช่องขีดจำกัดชั่วคราว ทั้งเกณฑ์ Soft Max และค่าใช้จ่ายที่เกี่ยวข้องจะต้องกำหนดร่วมกัน

ช่อง
max_duration

Duration

ขีดจำกัดแบบเข้มงวดซึ่งจำกัดระยะเวลาอยู่ที่ max_duration

soft_max_duration

Duration

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

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

quadratic_soft_max_duration

Duration

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

หากกำหนดไว้ 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 การนำส่งต้องอยู่ในคำสั่งซื้อเดียวกันกับการรับสินค้า

จุดบอกทาง

ห่อหุ้มจุดอ้างอิง จุดอ้างอิงจะระบุตำแหน่งขาเข้าและขาออกของ VisitRequests รวมถึงตำแหน่งเริ่มต้นและตำแหน่งของยานพาหนะ

ช่อง
side_of_road

bool

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

ช่องการรวม location_type วิธีต่างๆ ในการแสดงสถานที่ location_type ต้องเป็นค่าใดค่าหนึ่งต่อไปนี้
location

Location

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

place_id

string

รหัสสถานที่ของจุดที่น่าสนใจที่เกี่ยวข้องกับการชี้ทาง