บทที่ 12

ถนนที่รถคันนี้เข้าไม่ได้

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

วิ่งขึ้นเหนือ บางนา รังสิต อยุธยา คือวันที่ทางด่วนมีความหมาย

1สองที่ที่ตั้งได้

ตั้งได้ทั้งระดับแผน คือใช้กับรถทุกคัน และระดับประเภทรถ คือทับค่าของแผน ระดับแผนอยู่ในตัวเลือกการวางแผนเส้นทาง

กล่องถนนที่วิ่งได้ (ค่าเริ่มต้นทุกคัน) มีช่องติ๊กเลี่ยงทางด่วน/ทางที่มีค่าผ่านทาง ติ๊กไว้และมีวงสีแดงรอบ และช่องเลี่ยงถนนลูกรัง ไม่ได้ติ๊ก
หัวข้อเขียนว่า “ค่าเริ่มต้นทุกคัน” เพราะมันเป็นค่าตั้งต้น ประเภทรถที่ตั้งของตัวเองไว้จะไม่ฟังอันนี้

ระดับประเภทรถอยู่ใน ⚙ รายละเอียด ของคลัง ในการ์ดของรถแต่ละประเภท

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

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

2เลี่ยงทางด่วนแล้วได้อะไร เสียอะไร

วันนี้วิ่งขึ้นเหนือสามจุด รังสิต นวนคร อยุธยา เป็นวันที่ทางด่วนกับทางหลวงต่างกันจริง

บรรทัดสรุปผล: รถ 1 คัน · จุดส่ง 3 จุด · 187.0 กม. · 1,496 บาท · ตรงเวลาทุกคัน
ขึ้นทางด่วนได้ · 187.0 กิโล · 1,496 บาท
การ์ดรถคันที่ 1 ระยะ 187.0 กม. 268 นาที กลับถึงคลัง 10:28 เวลาวิ่ง 152 นาที จุดส่ง 3 จุด
วิ่ง 152 นาที กลับถึงคลัง 10:28
บรรทัดสรุปผล: รถ 1 คัน · จุดส่ง 3 จุด · 185.0 กม. · 1,480 บาท · ตรงเวลาทุกคัน
เลี่ยงทางด่วน · 185.0 กิโล · 1,480 บาท · ถูกลง 16 บาท
การ์ดรถคันที่ 1 ระยะ 185.0 กม. 275 นาที กลับถึงคลัง 10:34 เวลาวิ่ง 164 นาที จุดส่ง 3 จุด
วิ่ง 164 นาที กลับถึงคลัง 10:34

ทางที่ไม่ผ่านทางด่วน สั้นกว่า 2 กิโล แต่ ใช้เวลาวิ่งมากกว่า 12 นาที ฟังดูกลับหัว จนกว่าจะนึกได้ว่าทางด่วนคืออะไร — ทางที่อ้อมกว่าแต่ไม่มีไฟแดง เราจ่ายค่าผ่านทางเพื่อซื้อเวลา ไม่ได้ซื้อระยะ

บรรทัดสรุปจะบอกว่าถูกลง แต่ยังไม่ครบ

1,480 บาท น้อยกว่า 1,496 บาท เพราะเลขนั้นคิดจากกิโลเมตร และค่าผ่านทางที่ประหยัดไปยังไม่ได้อยู่ในนั้นเลย สิ่งที่โปรแกรมบอกได้จริงคือระยะกับเวลา ส่วนค่าผ่านทางจริงต้องเอาไปบวกเอง ถ้าด่านที่วิ่งผ่านเก็บ 60 บาท การเลี่ยงก็คุ้มขึ้น ถ้าเก็บ 15 บาท 12 นาทีของคนขับแพงกว่า

3ถนนลูกรังไม่เหมือนทางด่วน

ช่องเลี่ยงถนนลูกรังทำงานคนละแบบ ค่าตั้งต้นคือไม่เลี่ยง และตั้งใจให้เป็นอย่างนั้น

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

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

ติ๊กเลี่ยงถนนลูกรังเมื่อไหร่

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

4จุดที่ไม่มีถนนไปถึง

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

บรรทัดสรุปผล: รถ 1 คัน · 2 จาก 3 จุด · 14.1 กม. · 113 บาท · ตรงเวลาทุกคัน · 1 จุดจัดไม่ได้
2 จาก 3 จุด
แถบแจ้งเตือน: มี 1 จุดที่จัดเข้าแผนไม่ได้ — 1 จุด ไม่มีถนนใกล้พอที่จะเข้าถึง ตรวจสอบพิกัดของจุดส่ง พร้อมปุ่มดูจุดเหล่านี้
เหตุผลต่างจากบทที่ 5 บทนั้นบอกว่าไม่มีรถคันไหนมีที่ว่าง บทนี้บอกว่าไม่มีถนน สองอย่างแก้ไม่เหมือนกัน

ในผลลัพธ์แบบละเอียด ข้อความจะบอกตัวเลขมาให้ด้วยว่า ถนนที่ใกล้ที่สุดอยู่ห่าง 256 เมตร ในขณะที่ขอบเขตที่ยอมรับคือ 150 เมตร มีตัวเลขสองตัวนี้ก็แก้ได้ ย้ายหมุดออกมาที่หน้าถนน แล้ววางแผนใหม่

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

5ถ้าใช้โหมดเส้นตรง ช่องพวกนี้ไม่ทำงาน

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

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

ระดับแผน สองฟิลด์ ค่าตั้งต้นเป็น false ทั้งคู่:

{
  "avoid_toll": true,
  "avoid_dirt_road": false
}

ระดับประเภทรถ ชื่อเดียวกัน แต่รับ null ได้ด้วย:

{
  "type_name": "กระบะ",
  "van_count": 2,
  "shift_start": "08:00",
  "shift_end": "17:00",
  "capacity_kg": 900,
  "capacity_cm3": 4000000,
  "avoid_toll": false,
  "avoid_dirt_road": false
}

null หรือไม่ส่งมา คือตามค่าของแผน เพราะอย่างนี้ payload เก่าที่ยังไม่รู้จักสองฟิลด์นี้ ได้ผลเหมือนเดิมเป๊ะ

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

ประเภทรถที่ตั้งเหมือนกันใช้ตารางเดียวกัน ฟลีตที่รถเหมือนกันหมดจึงไม่มีต้นทุนเพิ่มจากการมีฟิลด์นี้อยู่

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

6ลองเอง

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