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