บทที่ 9
แผนที่วิ่งน้อยที่สุดไม่ได้แปลว่างานเท่ากัน บทนี้คือวันที่คนหนึ่งทำเจ็ดชั่วโมง อีกคนทำห้าชั่วโมง แล้วจะเอายังไงต่อ
35 ร้านในย่านพระโขนง ร้านละ 15 นาที
วันนี้ไม่ใช่วันจันทร์ที่ใช้มาแปดบทแล้ว เป็นรอบส่งของอีกแบบ 35 ร้านอยู่ในย่านเดียวกัน ห่างกันไม่กี่ร้อยเมตร ร้านละ 15 นาที
ทรงของวันนี้คือหัวใจของบท เวลาเกือบทั้งวันหมดไปกับการยืนส่งของ ไม่ได้หมดไปกับการขับ เมื่อการขับแทบไม่มีราคา การจัดให้วิ่งสั้นที่สุดจึงไม่สนใจเลยว่าจะแบ่งจุดกันอย่างไร
บรรทัดนี้ไม่มีอะไรผิด และก็ไม่ได้บอกเรื่องที่คนขับจะมาบอกเราตอนเย็น ต้องไปดูที่แท็บ ไทม์ไลน์
คันที่ 1 ได้ 14 จุด กลับถึงคลัง 12:57 คันที่ 2 ได้ 21 จุด กลับ 15:07 ห่างกันสองชั่วโมงสิบนาที ทั้งที่ออกจากคลังพร้อมกันแปดโมง
ทำไมโปรแกรมเลือกแบบนี้ เพราะวัดจากกิโลเมตร และคันที่ 2 วิ่งแค่ 15.5 กิโล ส่วนคันที่ 1 วิ่ง 57.0 กิโล เอาจุดที่อยู่ติด ๆ กันไปกองไว้กับคันเดียว คือแผนที่วิ่งน้อยที่สุดจริง ๆ
คันละ 405 นาที คันละ 75% ของกะ กลับถึงคลัง 14:45 พร้อมกัน ตรงกันถึงนาที เลข 75% ไม่ใช่เรื่องบังเอิญ — เป็นเพดานที่การเกลี่ยแบบเข้มตั้งไว้ และแผนนี้ไปนอนอยู่ตรงเพดานพอดี
สิ่งที่ไม่เท่ากันคือจำนวนจุดกับระยะทาง 16 จุด 59.4 กิโล กับ 19 จุด 16.2 กิโล เพราะที่เกลี่ยคือเวลา ไม่ใช่จำนวนจุด คันที่ต้องวิ่งไกลได้จุดน้อยลงเพื่อให้ชั่วโมงเท่ากัน
เทียบสองแผนตรง ๆ
การเกลี่ยไม่ได้ทำให้งานน้อยลง เป็นการย้ายงานจากคนที่หนักไปให้คนที่เบา และย้ายไม่ฟรี ถ้าจ่ายค่าแรงเป็นรายวัน แผนที่เกลี่ยแล้วแพงขึ้น 25 บาท ถ้าจ่ายเป็นรายชั่วโมง แผนที่เกลี่ยแล้วแพงขึ้นเกือบสองชั่วโมงคน
แล้วเกลี่ยไปทำไม
เพราะคนที่ต้องทำเจ็ดชั่วโมงทุกวันคือคนที่จะลาออก และการหาคนขับใหม่แพงกว่า 25 บาทมาก บรรทัดสรุปมองไม่เห็นต้นทุนก้อนนี้ คนที่คุมรถเห็น
เพดาน 85% ของกะเก้าชั่วโมงคือ 7 ชั่วโมง 39 นาที และคันที่ยาวที่สุดในแผนเดิมทำ 7 ชั่วโมง 07 นาที ยังไม่ถึงเพดาน ไม่มีอะไรให้กด แผนจึงแทบไม่ขยับ
นี่ไม่ใช่ข้อบกพร่อง เป็นความหมายของคำว่าพอประมาณ เป็นเพดานที่กันวันที่ยาวเกินไปจริง ๆ ไม่ได้มีหน้าที่ทำให้ทุกวันเท่ากัน ถ้าต้องการเท่ากัน ต้องใช้แบบเข้ม
เกลี่ยแล้วอย่าลืมดูจุดที่จัดไม่ได้
การเกลี่ยเป็นการขอ ไม่ใช่การบังคับ โปรแกรมจะไม่ทิ้งจุดส่งเพื่อให้ตัวเลขสวย แต่ถ้ากะสั้นอยู่แล้วและเพดานกดลงมาอีก ทางออกที่เหลือคือเพิ่มรถ ถ้าไม่มีรถให้เพิ่มก็จะเห็นจุดที่จัดไม่ได้ เทียบสองแผนที่จำนวนจุดก่อนดูอย่างอื่น
อยู่ในก้อน objective เดียวกับเป้าหมาย แต่เป็นฟิลด์ของตัวเอง:
{
"objective": {
"strategy": "min_vans",
"balance_workload": "strict"
}
}
รับ off soft หรือ strict
ไม่ส่งมาคือ off แยกจาก strategy เพราะเป็นคนละคำถาม
“ใช้รถน้อยที่สุดและเกลี่ยด้วย” กับ “ถูกที่สุดและเกลี่ยด้วย”
เป็นสิ่งที่คนคุมรถขอทั้งคู่
ในตัวโปรแกรม สองระดับนี้คือเพดานเป็นสัดส่วนของกะ กับน้ำหนักที่กดเมื่อเกิน คือ 85% กับแรงกด 4 และ 75% กับแรงกด 16 เป็นเพดาน ไม่ใช่ค่าปรับตามความยาวของวันที่ยาวที่สุด เพราะแบบหลังไม่มีจุดหยุด จะกระจายงานออกไปทุกคันในลานเพื่อกดตัวเลขนั้นลง แล้วได้แผนที่รถเจ็ดคันทำงานคนละสองชั่วโมง
ผลที่ได้อ่านจาก depart_s กับ return_s ของแต่ละเส้นทาง
ไม่ใช่จากจำนวนจุด สองคันที่ทำงานเท่ากันมีจำนวนจุดไม่เท่ากันได้ตามปกติ