โมดูล 2/5 · สัปดาห์ 4–6 · 27 ชม.

การวางเส้นทาง

UAT 363 เทคโนโลยีระบบอากาศยานไร้คนขับเพื่อการขนส่งและคลังสินค้าอัจฉริยะ

เวลาเรียนประมาณ 90 นาทีร่าง รอตรวจปรับปรุงล่าสุด 27 กันยายน 2569

บทเรียน

เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ

  1. คำนวณระยะทางและพลังงานของเส้นทางส่งของหลายจุด
  2. หาเส้นทางที่สั้นที่สุดด้วยการค้นทุกทาง และเทียบกับวิธีเลือกจุดใกล้สุด
  3. ตรวจความเป็นไปได้ด้านพลังงานโดยรวมพลังงานสำรอง และแบ่งงานเป็นหลายเที่ยว
  4. อธิบายปัญหาการวางเส้นทางแบบโดรนร่วมกับรถจากงานวิจัย

ความรู้พื้นฐานที่ควรมี: UAT 363 โมดูล 1

ทำไมต้องรู้

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

ปัญหาเส้นทาง

การหาลำดับไปทุกจุดแล้วกลับจุดเริ่มให้ระยะรวมสั้นที่สุด คือ ปัญหาการเดินทางของพนักงานขาย (traveling salesman problem, TSP) จำนวนลำดับที่เป็นไปได้เพิ่มเร็วมาก สำหรับ จุดมี ลำดับ (นับสองทิศแยกกัน) สี่จุดมีเพียง 24 ลำดับ จึงค้นทุกทางได้ แต่ 15 จุดมีมากกว่าหนึ่งล้านล้านลำดับ งานจริงจึงใช้ ฮิวริสติก (heuristic) ที่หาคำตอบดีพอในเวลาสั้น เช่น วิธีเลือกจุดใกล้สุด (nearest neighbour) ที่ไปจุดที่ใกล้ที่สุดซึ่งยังไม่ได้ไปทุกครั้ง

แผนที่โรงพยาบาล H ที่จุดกำเนิดและ รพ.สต. A B C D ลูกศรสีฟ้าแสดงเส้นทางที่สั้นที่สุด H ไป B ไป D ไป A ไป C แล้วกลับ H มีมาตราส่วน 1 กิโลเมตร
ภาพที่ 1 ที่ตั้ง รพ. และ รพ.สต. กับเส้นทางที่สั้นที่สุด

ตัวอย่างที่ 1 ค้นทุกทางเทียบวิธีเลือกจุดใกล้สุด

พิกัดสมมติเป็นกิโลเมตร H คือโรงพยาบาล

import math
from itertools import permutations

SITES = {"H": (0, 0), "A": (1.0, 2.5), "B": (1.5, 0.0), "C": (-2.0, 1.0), "D": (4.0, 0.5)}

def length(order):
    stops = ["H", *order, "H"]
    return sum(math.dist(SITES[a], SITES[b]) for a, b in zip(stops, stops[1:]))

best = min(permutations("ABCD"), key=length)

current, left, greedy = "H", set("ABCD"), []
while left:
    nxt = min(sorted(left), key=lambda s: math.dist(SITES[current], SITES[s]))
    greedy.append(nxt)
    left.remove(nxt)
    current = nxt

print(f"exhaustive: H-{'-'.join(best)}-H = {length(best):.2f} km")
print(f"nearest neighbour: H-{'-'.join(greedy)}-H = {length(greedy):.2f} km "
      f"(+{length(greedy) / length(best) - 1:.0%})")
exhaustive: H-B-D-A-C-H = 13.25 km
nearest neighbour: H-B-A-C-D-H = 17.46 km (+32%)

วิธีเลือกจุดใกล้สุดเริ่มดีที่ B แต่ไปติดที่ C ทางซ้าย แล้วต้องบินข้ามไป D ทางขวาไกล ทำให้ยาวกว่าคำตอบที่ดีที่สุดราวหนึ่งในสาม ฮิวริสติกจึงต้องตรวจคุณภาพเทียบคำตอบที่ดีกว่าเสมอเมื่อทำได้

พลังงานและสำรอง

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

ตัวอย่างที่ 2 ตรวจพลังงานและแบ่งเป็นสองเที่ยว

สมมติใช้พลังงาน 33.3 Wh/km เมื่อบรรทุก 2 kg แบตเตอรี่ 500 Wh ใช้ได้ 80% สำรอง 20%

import math
from itertools import combinations, permutations

SITES = {"H": (0, 0), "A": (1.0, 2.5), "B": (1.5, 0.0), "C": (-2.0, 1.0), "D": (4.0, 0.5)}
WH_PER_KM, BATTERY_WH, USABLE, RESERVE = 33.3, 500, 0.8, 0.2
available = BATTERY_WH * USABLE * (1 - RESERVE)

def best_trip(stops):
    def km(order):
        path = ["H", *order, "H"]
        return sum(math.dist(SITES[a], SITES[b]) for a, b in zip(path, path[1:]))
    order = min(permutations(stops), key=km)
    return order, km(order)

order, km = best_trip("ABCD")
print(f"available {available:.0f} Wh; one trip {km:.2f} km needs {km * WH_PER_KM:.0f} Wh "
      f"-> {'OK' if km * WH_PER_KM <= available else 'NOT feasible'}")

plans = []
for pair in combinations("ABCD", 2):
    other = "".join(s for s in "ABCD" if s not in pair)
    trips = [best_trip(pair), best_trip(other)]
    if all(k * WH_PER_KM <= available for _, k in trips):
        plans.append((sum(k for _, k in trips), trips))
total, trips = min(plans)
for o, k in trips:
    print(f"trip H-{'-'.join(o)}-H: {k:.2f} km, {k * WH_PER_KM:.0f} Wh")
print(f"two trips total {total:.2f} km")
available 320 Wh; one trip 13.25 km needs 441 Wh -> NOT feasible
trip H-A-C-H: 8.28 km, 276 Wh
trip H-B-D-H: 8.08 km, 269 Wh
two trips total 16.36 km

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

แถบแนวนอนสามแถบ เที่ยวเดียวสี่จุดใช้ 441 วัตต์ชั่วโมงเป็นสีชมพูเกินเส้นประ เที่ยว H-B-D-H ใช้ 269 และเที่ยว H-A-C-H ใช้ 276 เป็นสีเขียวอยู่ใต้เส้นประ เส้นประแนวตั้งคือพลังงานที่ใช้ได้ 320 วัตต์ชั่วโมงหลังหักสำรอง
ภาพที่ 2 พลังงานต่อเที่ยวเทียบพลังงานที่ใช้ได้

โดรนร่วมกับรถ

Murray และ Chu (2015) เสนอปัญหา flying sidekick TSP ที่รถส่งของวิ่งตามเส้นทาง และโดรนบินออกจากรถไปส่งจุดใกล้ ๆ แล้วกลับมาที่รถ ทำให้โดรนไม่ต้องบินไกลจากคลัง งานทบทวนของ Macrina และคณะ (2020) รวบรวมปัญหาแบบนี้หลายรูปแบบ เช่น หลายโดรน หลายรถ และข้อจำกัดของแบตเตอรี่ สำหรับจังหวัดที่ รพ.สต. อยู่ไกลเกินระยะโดรน แนวคิดนี้อาจใช้รถพยาบาลหรือรถส่งยาเป็นฐานให้โดรน

ปฏิบัติการประจำโมดูล

ปฏิบัติการ: วางแผนเส้นทางส่งเวชภัณฑ์

  1. หาพิกัดจริงของโรงพยาบาลและ รพ.สต. ใกล้มหาวิทยาลัย (หรือใช้พิกัดสมมติ) แปลงเป็นระยะกิโลเมตร
  2. ใช้โค้ดตัวอย่างที่ 1 หาเส้นทางที่ดีที่สุดและเทียบกับวิธีเลือกจุดใกล้สุด
  3. วัดพลังงานต่อกิโลเมตรจริงของโดรนในแล็บจากการบินทดสอบ แล้วใช้โค้ดตัวอย่างที่ 2 วางแผนเที่ยวบิน
  4. ตรวจเส้นทางกับพื้นที่หวงห้ามและชุมชน ปรับเส้นทางและคำนวณพลังงานใหม่
  5. จำลองเที่ยวบินใน SITL บันทึกพลังงานที่ใช้จริงเทียบกับแผน

ข้อผิดพลาดที่พบบ่อย

ระวัง

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

สรุป

  • การหาลำดับจุดส่งเป็นปัญหา TSP จำนวนลำดับเพิ่มแบบแฟกทอเรียล
  • วิธีเลือกจุดใกล้สุดเร็วแต่อาจยาวกว่าคำตอบที่ดีที่สุดมาก
  • พลังงานที่ใช้ได้ = ความจุ × สัดส่วนที่ใช้ได้ × (1 − สำรอง) ถ้าไม่พอให้แบ่งเที่ยว
  • โดรนร่วมกับรถขยายระยะบริการได้ ตามงานวิจัยของ Murray และ Chu

แบบฝึกตรวจความเข้าใจ

  1. ห้าจุดส่งมีลำดับที่เป็นไปได้กี่ลำดับ (นับสองทิศแยกกัน)
  2. แบตเตอรี่ 600 Wh ใช้ได้ 80% สำรอง 25% เหลือพลังงานใช้ได้เท่าใด
  3. จากข้อ 2 ที่ 30 Wh/km บินได้ไกลสุดกี่กิโลเมตร
  4. ทำไมวิธีเลือกจุดใกล้สุดจึงอาจได้เส้นทางยาว
  5. flying sidekick TSP คืออะไร
เฉลย
  1. Wh
  2. km
  3. เลือกทีละก้าวโดยไม่ดูภาพรวม อาจทิ้งจุดไกลไว้ท้ายสุดแล้วต้องบินย้อนไกล
  4. รถส่งของวิ่งเป็นฐาน โดรนบินออกจากรถไปส่งจุดใกล้แล้วกลับมาที่รถ

สรุปสูตรสำคัญ

ความยาวเส้นทาง
พลังงานที่ใช้ได้

แหล่งอ้างอิงหลัก

  1. Murray, C. C., & Chu, A. G. (2015). The flying sidekick traveling salesman problem: Optimization of drone-assisted parcel delivery. Transportation Research Part C: Emerging Technologies, 54, 86–109. link
  2. Macrina, G., Di Puglia Pugliese, L., Guerriero, F., & Laporte, G. (2020). Drone-aided routing: A literature review. Transportation Research Part C: Emerging Technologies, 120, 102762. link
  3. Otto, A., Agatz, N., Campbell, J., Golden, B., & Pesch, E. (2018). Optimization approaches for civil applications of unmanned aerial vehicles (UAVs) or aerial drones: A survey. Networks, 72(4), 411–458. link
  4. Stolaroff, J. K., Samaras, C., O'Neill, E. R., Lubers, A., Mitchell, A. S., & Ceperley, D. (2018). Energy use and life cycle greenhouse gas emissions of drones for commercial package delivery. Nature Communications, 9, 409. link

อ่านเพิ่มเติม

ศึกษาหน่วยความรู้ที่กำหนดล่วงหน้า ดูสื่อประกอบ และทำ quiz ประจำโมดูล

ในชั้นเรียน / ภาคสนาม

ปฏิบัติการเข้มข้นในแล็บและภาคสนาม บันทึกผลลงสมุดปฏิบัติการ

หลักฐานการเรียนรู้: สมุดปฏิบัติการที่อาจารย์ลงนาม

แบบทดสอบประจำโมดูล

แบบทดสอบนี้ใช้ตรวจความเข้าใจ (formative) ไม่ใช่การสอบเก็บคะแนน

โดเมนความรู้: ขนส่ง ภายในอาคาร และคลังสินค้า · คณิตศาสตร์ ฟิสิกส์ และสถิติ