Skip to content
Tayakorn

คู่มือ Mesh Networking — สื่อสารในที่ที่ไม่มีเสาสัญญาณ

LEVEL 3 · ระดับสูง

เมื่อค่าเดียวตัดสินไม่ได้

หลังบทที่แล้ว เรามีมิติให้คิดมากกว่าหนึ่ง — ETX บอกคุณภาพลิงก์ แต่ไม่รู้เรื่องความจุของคลื่นที่เลือก และไม่รู้เลยว่าโหนดกลางทางแบตเหลือเท่าไหร่

12.1 แปลงทุกอย่างให้เป็นต้นทุนก่อน

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

ROUTES = [
    ("A-D-B-F", 3.44, 20.0, 35),   # ETX ดีที่สุด แต่ผ่านโหนดที่แบตใกล้หมด
    ("A-C-F",   4.20, 20.0, 95),   # ลิงก์แย่กว่า แต่โหนดแบตเต็ม
    ("A-E-F",   3.60,  2.0, 90),   # ย่านความถี่ต่ำ ไปได้ไกลแต่ช้ากว่าสิบเท่า
]

def score(etx, mbps, batt, w_etx=1.0, w_cap=1.0, w_batt=0.5):
    """ยิ่งน้อยยิ่งดี — ทุกมิติถูกแปลงเป็นต้นทุนก่อนถ่วงน้ำหนัก"""
    cost_etx  = etx                      # เป็นต้นทุนอยู่แล้ว
    cost_cap  = 20.0 / mbps              # ช้ากว่าฐาน 20 Mbps กี่เท่า
    cost_batt = (100 - batt) / 100 * 4   # แบตยิ่งน้อย ต้นทุนยิ่งสูง
    return w_etx*cost_etx + w_cap*cost_cap + w_batt*cost_batt

for name, etx, mbps, batt in ROUTES:
    print(f"{name:<10}ETX {etx:>5.2f}  {mbps:>5.1f} Mbps  แบต {batt:>3}%  ->  คะแนน {score(etx,mbps,batt):>6.2f}")

print("")
for w in (0.0, 0.5, 2.0):
    pick = min(ROUTES, key=lambda r: score(r[1], r[2], r[3], w_batt=w))
    print(f"ให้แบตหนัก {w:>3.1f} -> เลือก {pick[0]}")

ผลรันจริง

A-D-B-F   ETX  3.44   20.0 Mbps  แบต  35%  ->  คะแนน   5.74
A-C-F     ETX  4.20   20.0 Mbps  แบต  95%  ->  คะแนน   5.30
A-E-F     ETX  3.60    2.0 Mbps  แบต  90%  ->  คะแนน  13.80

ให้แบตหนัก 0.0 -> เลือก A-D-B-F
ให้แบตหนัก 0.5 -> เลือก A-C-F
ให้แบตหนัก 2.0 -> เลือก A-C-F

ถ้าดู ETX อย่างเดียว A-D-B-F ชนะ (3.44 ต่อ 4.20) แต่พอนับแบตเข้ามาด้วย คำตอบพลิกเป็น A-C-F ทันที เพราะการส่งงานทั้งหมดผ่านโหนดที่เหลือแบต 35% แปลว่าอีกไม่นานเส้นทางนั้นจะหายไปทั้งเส้น

12.2 น้ำหนักคือการประกาศว่าอะไรสำคัญ

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

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

12.3 กับดักที่ต้องระวัง

⚠️ metric ที่ซับซ้อนขึ้น ทำให้เกิด flapping ง่ายขึ้น เพราะตอนนี้มีตัวแปรสามตัวที่แกว่งได้พร้อมกัน แทนที่จะมีตัวเดียว ⇒ ทุกครั้งที่เพิ่มมิติ ต้องกลับไปทบทวน hysteresis ในบทที่ 9 ใหม่เสมอ

⚠️ มิติที่วัดไม่ได้จริง อย่าใส่ ถ้าโหนดรายงานแบตไม่ตรง (ซึ่งเกิดบ่อยมากกับแบตลิเธียมที่แรงดันไม่เป็นเส้นตรง) การใส่แบตเข้าสมการทำให้ตัดสินใจแย่ลง ไม่ใช่ดีขึ้น · ค่าที่ผิดแต่ดูน่าเชื่อ อันตรายกว่าไม่มีค่าเลย

Read the full book