บทที่ 7

พักเที่ยงไม่ใช่ทางเลือก

คนขับกินข้าว หนึ่งชั่วโมงนั้นเป็นเวลาจริงที่หายไปจากวัน แผนที่ไม่นับชั่วโมงนั้นไว้ ก็คือแผนที่เลิกงานช้ากว่าที่เขียนไว้หนึ่งชั่วโมง

วันสองเที่ยวจากบทที่ 6 คราวนี้มีพักกลางวันหนึ่งชั่วโมง

1เรื่องที่เกิดขึ้น

วันที่รถกลับถึงคลังก่อนสิบเอ็ดโมง เรื่องพักเที่ยงไม่เกิดขึ้นเลย รถในบทที่ 1 และบทที่ 5 กลับถึงคลังสิบโมงกว่า การ์ดของรถเหล่านั้นเขียนว่าพักกลางวัน ไม่มี — และไม่มีจริง ๆ

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

2ตั้งเวลาพัก

  1. เปิด พักกลางวัน ใน ตัวเลือกการวางแผนเส้นทาง มีสามช่อง

    กล่องพักกลางวัน มีช่องพักนานเท่าไร ใส่ 60 มีวงสีแดงรอบ ช่องเริ่มพักได้ตั้งแต่ 11:00 ช่องเริ่มพักไม่เกิน 13:00 และคำอธิบายว่าระบบจะเลือกเวลาพักในช่วงนี้ที่กระทบเส้นทางน้อยที่สุด
    พักนานเท่าไร (นาที) คือความยาวของการพัก สองช่องล่างคือช่วงที่เริ่มพักได้ ไม่ใช่เวลานัด
  2. กด วางแผนเส้นทาง

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

3ชั่วโมงที่พักไปอยู่ไหน

วันเดียวกัน สองแผน ต่างกันแค่ช่องพักนานเท่าไร

การ์ดรถคันที่ 1 ไม่มีพักกลางวัน ระยะ 53.5 กม. 300 นาที กลับถึงคลัง 13:00 ใช้เวลาทำงานไป 56 เปอร์เซ็นต์
ไม่มีพัก กลับถึงคลัง 13:00
การ์ดรถคันที่ 1 พักกลางวัน 11:00 ถึง 12:00 60 นาที ระยะ 53.5 กม. 360 นาที กลับถึงคลัง 14:00 ใช้เวลาทำงานไป 67 เปอร์เซ็นต์
พักหนึ่งชั่วโมง กลับถึงคลัง 14:00

13:00 กับ 14:00 ต่างกันหนึ่งชั่วโมงพอดี ระยะยัง 53.5 กิโลเท่ากัน จุดส่งครบ 12 จุดเท่ากัน การพักไม่ได้ทำให้เส้นทางแย่ลง แค่กินเวลาไปหนึ่งชั่วโมงตรง ๆ

ในรายการจุดส่งจะมีแถวพักแทรกอยู่ ตรงที่รถหยุดจริง

แถวในรายการจุดส่ง: พักกลางวัน 11:00 - 12:00 60 นาที
คนขับเห็นแถวนี้ในลิงก์ของตัวเองด้วย ไม่ต้องเดาว่าพักได้ตอนไหน

แท็บ ไทม์ไลน์ เห็นชัดที่สุดว่าวันหมดไปกับอะไร

ไทม์ไลน์ของรถคันที่ 1 คำอธิบายสี กำลังขับ 1.5 ชม. อยู่ที่จุดส่ง 3.0 ชม. กำลังรอ พักกลางวัน 1.0 ชม. โหลดของเพิ่ม 0.5 ชม. แถบแสดงจุดส่ง 1 ถึง 12 มีแถบสีเทาเข้มโหลดของ และแถบสีม่วงพักกลางวันช่วง 11 โมงถึงเที่ยง
หกชั่วโมงของวันนี้คือ ขับ 1.5 · อยู่ที่จุดส่ง 3.0 · พัก 1.0 · โหลดของ 0.5 เวลาขับเป็นก้อนที่เล็กที่สุด — รอบส่งในเมืองเป็นแบบนี้เกือบทุกวัน

4ช่วงเวลาพักคือช่วง ไม่ใช่เวลานัด

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

การ์ดรถคันที่ 1 พักกลางวัน 12:14 ถึง 13:14 60 นาที กลับถึงคลัง 14:00
พัก 12:14–13:14 และยังกลับถึงคลัง 14:00 เหมือนเดิม

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

รถที่เลิกก่อนช่วงพัก ไม่พัก

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

5พักนานขึ้น วันยาวขึ้นเท่านั้น

การ์ดรถคันที่ 1 พักกลางวัน 11:00 ถึง 12:30 90 นาที ระยะ 53.5 กม. 390 นาที กลับถึงคลัง 14:30
90 นาที กลับ 14:30 คือช้ากว่าแผนหนึ่งชั่วโมงอยู่ 30 นาที เท่ากับที่เพิ่มเข้าไป

สามแผนเรียงกันคือ 13:00 · 14:00 · 14:30 ตามการพัก 0 · 60 · 90 นาที ตรงกันหมด การพักไม่ใช่ค่าปรับที่ซ่อนอยู่ เป็นเวลาที่ใส่เข้าไปแล้วได้คืนมาเท่านั้น

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

ถ้าส่งข้อมูลเข้ามาเป็น JSONสำหรับคนที่ต่อระบบเอง

สามฟิลด์ ที่ระดับคำขอ ใช้กับรถทุกคันในแผน:

{
  "lunch_duration_min": 60,
  "lunch_earliest_start": "11:00",
  "lunch_latest_start": "13:00"
}

ใส่ข้างเดียวได้ lunch_earliest_start ลอย ๆ คือ “ไม่ก่อนเวลานี้” และไม่ได้บอกอะไรเรื่องปลายทาง ถ้าใส่ทั้งสองข้างแล้วปลายมาก่อนต้น คำขอจะถูกปฏิเสธ ไม่ใช่ถูกบีบเป็นจุดเดียว

รูปแบบเก่าคือ lunch_start ตัวเดียว หมายถึงกลางของช่วง แล้วขยายออกข้างละหนึ่งชั่วโมง ยังใช้ได้อยู่ และเป็นฟิลด์ที่ตัวอ่านไฟล์ Excel กับ CSV เขียนลงมาให้จากคอลัมน์ lunch_start

ตั้งรายชนิดรถก็ได้ ใส่สามฟิลด์เดียวกันไว้ใน van_types ทับค่าที่ระดับคำขอเฉพาะรถชนิดนั้น มีไว้สำหรับฟลีตที่คนขับคนละสัญญากัน รถซับกับรถบริษัทที่ออกจากคลังเดียวกันไม่จำเป็นต้องกินข้าวเวลาเดียวกัน

ในคำตอบ การพักที่เกิดขึ้นจริงอยู่ใน break_start_s กับ break_end_s ของแต่ละเส้นทาง ทั้งคู่เป็น null ถ้ารถคันนั้นเลิกก่อนช่วงพัก

6ลองเอง

  1. เปิดวันพัก 60 นาที แล้วเปลี่ยน เริ่มพักได้ตั้งแต่ เป็น 12:30 วางแผนใหม่ แล้วดูแท็บไทม์ไลน์ว่าแถบสีม่วงย้ายไปไหน
  2. ลดเวลาทำงานของรถให้เลิก 13:30 แล้วใส่พัก 60 นาที ดูว่าโปรแกรมเลือกทางไหน เพิ่มรถ หรือทิ้งจุด
  3. เปิดวันบทที่ 5 ที่รถกลับสิบโมงกว่า แล้วตั้งพัก 60 นาที การ์ดรถจะยังเขียนว่าไม่มีพัก เพราะวันจบก่อนช่วงพักเปิด