🤖

สนุกกับ “อัลกอริทึมแบบประมาณ”

บางปัญหายากเกินกว่าจะหาคำตอบที่ดีที่สุดได้ทัน เราจึงหาคำตอบที่ “ดีพอ” แบบเร็วๆ แถมยัง พิสูจน์ได้ ว่ามันใกล้เคียงคำตอบที่ดีที่สุดแค่ไหน มาดูกันว่านักวิทยาศาสตร์คอมพิวเตอร์เขาคิดยังไง!

📘 ย่อยจากหนังสือ The Design of Approximation Algorithms โดย Williamson & Shmoys
เลื่อนลงไปเล่นกันเลย 👇
เกริ่นนำ

🧩 ทำไมต้องมีคำตอบแบบ “ดีพอ”?

ปัญหายากบางอย่าง ต่อให้คอมพิวเตอร์เก่งที่สุดก็แก้แบบเป๊ะไม่ทัน

🤔 ปัญหาคืออะไร?

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

ปัญหาแบบนี้เรียกว่า NP-hard คือยากจนยังไม่มีใครรู้วิธีหาคำตอบที่ดีที่สุดได้เร็วเลย

💡 ไอเดียเด็ด

แทนที่จะรอคำตอบที่ดีที่สุดเป็นล้านปี เราออกแบบวิธีที่ให้คำตอบ “ดีพอ” ได้ในพริบตา

สิ่งที่เจ๋งคือ เราจะ การันตีเป็นตัวเลข ได้เลยว่าคำตอบของเราแย่กว่าคำตอบที่ดีที่สุด ไม่เกินกี่เท่า ตัวเลขนี้เรียกว่า อัตราการประมาณ (α)

เช่น α = 2 แปลว่า “คำตอบของเราอาจยาวเป็น 2 เท่าของทางที่สั้นที่สุด แต่ไม่เกินนั้นแน่นอน”

🚗 เครื่องระเบิดจำนวนเส้นทาง

เลื่อนเพิ่มจำนวนบ้านที่ต้องไปส่งของ แล้วดูว่าจำนวนเส้นทางที่ต้องลองเพิ่มเร็วแค่ไหน (สูตร = (n−1)! ÷ 2)

จำนวนเส้นทางที่ต้องลองทั้งหมด:

🏅 จำคำนี้ไว้

หนังสือเล่มนี้รวบรวม เทคนิคหลัก ในการสร้างอัลกอริทึมแบบประมาณไว้ 8 แบบ — เราจะไปรู้จักทีละบท แต่ละบทมีตัวอย่างจากชีวิตจริงและของเล่นให้ลองกดด้วยนะ!

บทที่ 1 · อัลกอริทึมโลภ + ปัดเศษ LP

🚒 เลือกให้ครอบคลุม (Set Cover)

เลือก “ของกลุ่มน้อยที่สุด” ที่รวมกันแล้วครบทุกอย่าง

🤔 ปัญหาคืออะไร?

เราเป็นนายกเทศมนตรี ต้องสร้าง สถานีดับเพลิง ให้ดูแลครบ ทุกหมู่บ้าน แต่ละสถานีดูแลได้บางหมู่บ้านที่อยู่ใกล้ๆ

คำถามคือ จะสร้างสถานี น้อยที่สุดกี่แห่ง ถึงจะครอบคลุมหมดทุกหมู่บ้าน?

💡 ไอเดียเด็ด: “น้องโลภ” (Greedy)

กฎง่ายมาก: เลือกสถานีที่ครอบคลุมหมู่บ้าน “ใหม่” ได้เยอะที่สุดก่อนเสมอ แล้วทำซ้ำจนครบ

เหมือนเวลาเก็บของเล่นเข้ากล่อง เราหยิบกองที่ใหญ่ที่สุดก่อน จะได้เสร็จไวๆ

🗺️ ลองวางสถานีดับเพลิงเอง

กดเลือกสถานี (ปุ่มด้านล่าง) ให้หมู่บ้านทั้ง 10 หลังเป็นสีเขียวครบ โดยใช้สถานีให้น้อยที่สุด แล้วลองกด “ให้น้องโลภช่วย” เทียบกัน!

✨ รู้ไหมว่า

เทคนิค Set Cover เคยถูกใช้สร้าง โปรแกรมแอนตี้ไวรัส จริงๆ! นักวิจัยเลือก “ชิ้นโค้ดเล็กๆ” กลุ่มน้อยที่สุดที่ปรากฏในไวรัสทุกตัว เพื่อให้โปรแกรมจับไวรัสได้ครบ โดยไม่ต้องจำไวรัสทีละตัว 🦠

🏅 เก่งแค่ไหน?

น้องโลภการันตีได้ว่าใช้สถานีไม่เกินประมาณ ln(n) เท่า ของจำนวนที่น้อยที่สุด (n = จำนวนหมู่บ้าน)

ฟังดูเหมือนเยอะ แต่จริงๆ ในงานจริงมันมักได้คำตอบ ใกล้เคียงดีที่สุดมาก และที่สำคัญคือ เร็วสุดๆ

บทที่ 2 · อัลกอริทึมโลภ & การค้นหาเฉพาะที่

⚖️ แบ่งงานให้ยุติธรรม (Scheduling)

โลภแบบฉลาด + ขยับทีละนิดให้ดีขึ้น

🤔 ปัญหาคืออะไร?

มีการบ้าน (งาน) หลายชิ้น ใช้เวลาต่างกัน และมีเพื่อน 3 คนช่วยทำ เราอยากให้ คนที่ทำเสร็จช้าที่สุด เสร็จเร็วที่สุด (เรียกเวลานี้ว่า makespan)

คือแบ่งงานให้ สมดุล ไม่ให้ใครคนใดคนหนึ่งงานท่วมหัว

💡 ไอเดียเด็ด

วิธีโลภ (List): ใครว่างก่อน (งานน้อยสุด) รับงานชิ้นต่อไป

งานใหญ่ก่อน (LPT): เรียงงานจากใหญ่ไปเล็กก่อน แล้วค่อยแจก — ฉลาดกว่าเยอะ!

การค้นหาเฉพาะที่ (Local Search): เริ่มจากการแบ่งมั่วๆ แล้ว “สลับงาน” ทีละนิดถ้าทำให้ดีขึ้น เหมือนค่อยๆ ปีนขึ้นเขาทีละก้าว

🧑‍🤝‍🧑 ลองแบ่งงานให้เพื่อน 3 คน

กดเลือกงาน (ก้อนสี) แล้วกดเครื่องของเพื่อนที่อยากให้ทำ หรือกดปุ่มให้ระบบช่วยแบ่ง เป้าหมาย: ทำให้แถบ “เสร็จช้าสุด” สั้นที่สุด!

งานที่ต้องแบ่ง (ตัวเลข = ชั่วโมง):
เสร็จช้าสุด (makespan):

✨ รู้ไหมว่า

เทคนิคนี้ใช้จริงในโรงงาน, ตารางเที่ยวบิน, และการแบ่งงานให้ “เซิร์ฟเวอร์” ในศูนย์ข้อมูลขนาดใหญ่ เพื่อให้เว็บโหลดเร็วๆ ⚙️

🏅 เก่งแค่ไหน?

วิธีโลภแบบ List การันตี ไม่เกิน 2 เท่า ของดีที่สุด ส่วน “งานใหญ่ก่อน (LPT)” เก่งขึ้นเป็น ราว 4/3 เท่า เท่านั้นเอง!

บทที่ 3 · ปัดข้อมูล + โปรแกรมพลวัต

🎒 เป้สะพายหลังมหัศจรรย์ (Knapsack)

ปัดตัวเลขให้ “กลมๆ” เพื่อคิดเร็วขึ้น แต่คำตอบยังเกือบเป๊ะ

🤔 ปัญหาคืออะไร?

เราจะไปตั้งแคมป์ เป้ใบนี้รับน้ำหนักได้จำกัด เราอยากหยิบของที่ มีคุณค่ารวมมากที่สุด โดยน้ำหนักรวม ไม่เกินที่เป้รับได้

💡 ไอเดียเด็ด

การหาคำตอบเป๊ะๆ ช้ามากเมื่อ “คุณค่า” เป็นตัวเลขใหญ่ๆ

เคล็ดลับคือ ปัดตัวเลขคุณค่าให้หยาบลง (เช่น ปัดเป็นหลักสิบ) ทำให้คอมคิดเร็วขึ้นมหาศาล แต่คำตอบที่ได้ยัง เกือบดีที่สุด เหมือนปัดราคาสินค้าจาก 197 เป็น 200 เพื่อคิดเลขในใจง่ายๆ

🏕️ จัดเป้ไปแคมป์ปิ้ง

เป้รับได้ 10 กิโลกรัม กดเลือกของที่จะเอาไป ให้ได้คะแนนคุณค่ารวมมากที่สุดโดยไม่เกินน้ำหนัก แล้วกด “เฉลย” เทียบดูนะ!

น้ำหนักรวม: 0 / 10 กก.
คุณค่ารวม: 0 คะแนน

✨ รู้ไหมว่า

วิธีปัดข้อมูลแบบนี้ดีจนได้ฉายาว่า PTAS — เราบอกได้เลยว่าอยากได้คำตอบใกล้ดีที่สุดแค่ไหน (เช่น ห่างแค่ 1%) แล้วเครื่องก็จัดให้ได้! 🎯

🏅 เก่งแค่ไหน?

ปัญหาเป้สะพายหลังมีวิธีที่เข้าใกล้คำตอบดีที่สุดได้ ใกล้แค่ไหนก็ได้ (เช่น 99%, 99.9%) แลกกับการคิดนานขึ้นนิดหน่อย — คุ้มมาก!

บทที่ 4 · การปัดเศษโปรแกรมเชิงเส้น

🏪 ครึ่งๆ ก็ได้ แล้วค่อยปัด (LP Rounding)

ยอมให้ตัดสินใจ “ครึ่งๆ” ก่อน เพราะคิดง่าย แล้วค่อยปัดเป็นจริง

🤔 ปัญหาคืออะไร?

เราจะเปิดร้านสาขาในเมือง ต้องเลือกว่า เปิดที่ไหนบ้าง ให้ลูกค้าทุกคนอยู่ใกล้ร้าน และต้นทุนรวมต่ำที่สุด การตัดสินใจ “เปิด/ไม่เปิด” (0 หรือ 1) ทำให้ปัญหายากมาก

💡 ไอเดียเด็ด

โปรแกรมเชิงเส้น (LP) คือการ “โกง” นิดหน่อย: เรายอมให้คำตอบเป็น เศษส่วน ได้ก่อน เช่น “เปิดร้าน 0.7 ร้าน” ฟังดูแปลก แต่คอมแก้แบบนี้ได้ เร็วมาก

จากนั้นเรา ปัดเศษ กลับเป็นจริง เช่น 0.7 → เปิดจริง (1), 0.2 → ไม่เปิด (0)

คำตอบของ LP (เศษส่วน) เปิดร้าน = 0.7 ปัดเศษ 0.7 ≥ ครึ่ง → เปิดจริง ✓ 0.2 < ครึ่ง → ไม่เปิด ✗
คิดแบบ “ครึ่งๆ” ก่อน (เร็ว) แล้วค่อยปัดให้เป็นการตัดสินใจจริง

✨ รู้ไหมว่า

การปัดเศษ LP ใช้แก้ปัญหา “เลือกทำเล” ของร้านสะดวกซื้อ คลังสินค้า และเสาสัญญาณมือถือจริงๆ 📡 เพื่อให้ครอบคลุมคนเยอะที่สุดด้วยต้นทุนน้อยที่สุด

🏅 เก่งแค่ไหน?

วิธีปัดเศษ LP ให้การันตีดีๆ ได้หลายปัญหา เช่น “การเลือกทำเลร้าน” การันตีต้นทุน ไม่เกิน 4 เท่า ของดีที่สุด (และมีวิธีที่เก่งกว่านี้อีก)

บทที่ 5 · การสุ่มและการปัดเศษแบบสุ่ม

🎲 ทอยลูกเต๋าช่วยตัดสินใจ (MAX CUT)

บางครั้ง “โยนเหรียญ” ก็ให้คำตอบที่ดีอย่างน่าทึ่ง

🤔 ปัญหาคืออะไร?

เพื่อน 6 คน มีบางคู่ที่ชอบ แกล้งกัน (เส้นที่เชื่อม) เราจะแบ่งทุกคนเป็น 2 ห้อง ยังไงให้คู่ที่ชอบแกล้งกัน อยู่คนละห้องมากที่สุด (ทะเลาะกันน้อยลง!)

💡 ไอเดียเด็ด

ลองง่ายสุด: ให้แต่ละคนโยนเหรียญ ออกหัวไปห้อง A ออกก้อยไปห้อง B

น่าทึ่งมาก: โดยเฉลี่ยแล้ว วิธีมั่วๆ นี้จะแยกคู่แกล้งกันได้ ถึงครึ่งหนึ่ง ของจำนวนเส้นทั้งหมดเสมอ!

🪙 ลองแบ่งห้องด้วยการโยนเหรียญ

กดที่ “เพื่อน” แต่ละคนเพื่อสลับห้อง (ฟ้า/ชมพู) หรือกด “โยนเหรียญสุ่ม” เส้นที่กลายเป็นสีเขียว = คู่แกล้งกันที่ถูกแยกห้องสำเร็จ ลองทำให้เขียวครบ 8 เส้นสิ!

แยกได้: 0 / 9 เส้น

✨ รู้ไหมว่า

วิธี “สุ่ม” แบบนี้ใช้แก้ปัญหาใหญ่ๆ เช่น การจัดสายไฟในชิปคอมพิวเตอร์ และการแก้ปริศนาตรรกะ (MAX SAT) ได้ดีอย่างเหลือเชื่อ 🎯

🏅 เก่งแค่ไหน?

แค่โยนเหรียญก็การันตีได้ อย่างน้อยครึ่งหนึ่ง (½) ของคำตอบดีที่สุดแล้ว! และในบทถัดไปเราจะทำให้ดีขึ้นไปอีก 😎

บทที่ 6 · การปัดเศษโปรแกรมกึ่งบวกแน่นอน (SDP)

🧭 ลูกศรในอวกาศ & มีดสุ่มหั่น

ใช้เรขาคณิตช่วยแบ่ง ให้ดีกว่าโยนเหรียญธรรมดา

🤔 ปัญหาคืออะไร?

เป็นปัญหา “แบ่ง 2 ห้อง” เหมือนบทที่แล้ว แต่คราวนี้เราอยากได้คำตอบที่ ดีกว่าครึ่ง ให้มากที่สุด

💡 ไอเดียเด็ด (รางวัลโนเบลแห่งวงการ!)

แทนคนแต่ละคนด้วย ลูกศรชี้ทิศ บนลูกบอล โดยพยายามให้คู่ที่แกล้งกัน ชี้คนละทาง

จากนั้น สุ่มหั่นลูกบอลด้วยมีดบางๆ (เส้นตรงสุ่ม) ใครอยู่ฝั่งไหนก็ไปห้องนั้น เรขาคณิตช่วยให้แยกคู่แกล้งกันได้เยอะกว่าการโยนเหรียญเฉยๆ!

🔪 หมุน “มีดสุ่ม” หั่นแบ่งห้อง

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

แยกได้: 0 / 9 เส้น

✨ รู้ไหมว่า

วิธีนี้ชื่อ Goemans–Williamson (ผู้เขียนหนังสือเล่มนี้คนหนึ่งเลย!) ถือเป็นหนึ่งในผลงานที่สวยงามที่สุดในวงการ และยังไม่มีใครทำได้ดีกว่านี้มากเลยจนถึงทุกวันนี้ 🏆

🏅 เก่งแค่ไหน?

การันตีได้ถึง ราว 0.878 เท่า ของคำตอบดีที่สุด — ดีกว่าการโยนเหรียญ (0.5) แบบก้าวกระโดด!

บทที่ 7 · วิธีไพรมัล-ดูอัล

🤝 ต่อราคาสองฝ่ายพร้อมกัน (Primal-Dual)

ค่อยๆ เพิ่มข้อเสนอ จนคุ้มค่อยตัดสินใจ — แถมได้ “ใบรับรอง” ว่าคำตอบดี

🤔 ปัญหาคืออะไร?

เราจะ ลากสายเชื่อมเมือง ให้เมืองที่ต้องการคุยกันเชื่อมถึงกันครบ โดยใช้ความยาวสายรวม น้อยที่สุด (เช่น เดินสายอินเทอร์เน็ตให้คุ้มที่สุด)

💡 ไอเดียเด็ด

คิดเหมือน การประมูล/ต่อราคา: แต่ละเมืองค่อยๆ “เพิ่มงบ” ของตัวเองขึ้นเรื่อยๆ (เหมือนวงกลมที่ขยายออก) พอ งบของสองฝั่งมาเจอกันที่สายเส้นไหน และมัน “คุ้ม” เราก็ ซื้อสายเส้นนั้น

ความเจ๋งคือ “งบ” ที่เพิ่มขึ้นกลายเป็น ใบรับรอง พิสูจน์ได้ว่าคำตอบเราดีจริง โดยไม่ต้องเทียบกับคำตอบที่ดีที่สุด

เมือง A เมือง B งบสองฝั่งขยายมาเจอกัน → ซื้อสายนี้!
วงกลม = “งบ” ที่แต่ละเมืองค่อยๆ เพิ่ม พอมาชนเส้นเชื่อมแล้วคุ้ม ก็ตัดสินใจซื้อ

✨ รู้ไหมว่า

วิธีไพรมัล-ดูอัลใช้ออกแบบ เครือข่ายจริง เช่น วางสายไฟเบอร์ออปติก และวางแผนเส้นทางขนส่ง เพราะมันเร็วและไม่ต้องใช้คอมแรงมาก 🔌

🏅 เก่งแค่ไหน?

สำหรับปัญหาลากสายเชื่อมเมือง (Steiner Forest) วิธีนี้การันตีความยาวรวม ไม่เกิน 2 เท่า ของดีที่สุด แถมทำงานเร็วมาก

บทที่ 8 · รอยตัดและระยะทาง

✂️ ตัดแผนที่ให้แยกเขต (Cuts & Metrics)

ตัดถนนให้น้อยที่สุด แต่แยกเมืองสำคัญออกจากกันให้ได้

🤔 ปัญหาคืออะไร?

มีเมืองสำคัญหลายเมืองที่ ต้องแยกออกจากกัน (เช่น ป้องกันไฟป่าลามข้ามเขต) เราจะ ตัดถนน เส้นไหนบ้าง ให้เมืองเหล่านั้นไปหากันไม่ได้ โดย ตัดถนนรวมน้อยที่สุด

💡 ไอเดียเด็ด

เปลี่ยน “ความสัมพันธ์” ให้กลายเป็น ระยะทางบนแผนที่ (เรียกว่า metric) จุดที่ควรอยู่ห้องเดียวกันให้ “ใกล้กัน” จุดที่ควรแยกให้ “ไกลกัน”

พอเป็นแผนที่ระยะทางแล้ว เราก็แค่ ขีดเส้นแบ่งเขต ตรงที่บางที่สุด — ง่ายขึ้นเยอะ!

✂️ เส้นตัด (ตัดถนนน้อยที่สุด) บ้าน รร. โรงงาน ตลาด
เมืองสีฟ้าอยู่เขตซ้าย เมืองสีเขียวอยู่เขตขวา เส้นตัดสีแดงเลือกตัดถนนน้อยเส้นที่สุด

✨ รู้ไหมว่า

เทคนิค “รอยตัด” ใช้ใน การแบ่งกลุ่มข้อมูล (เช่น แยกรูปภาพออกจากพื้นหลัง), การออกแบบวงจร, และการวิเคราะห์เครือข่ายสังคม 🌐

🏅 เก่งแค่ไหน?

หลายปัญหารอยตัดมีอัลกอริทึมที่การันตีได้ เช่น Multiway Cut การันตี ไม่เกินราว 1.5 เท่า และปัญหายากกว่านั้นก็ยังการันตีระดับ O(log n) ได้

📚 คำศัพท์น่ารู้

ศัพท์เท่ๆ ที่เจอในเว็บนี้ อธิบายสั้นๆ แบบเข้าใจง่าย

NP-hard (เอ็นพี-ฮาร์ด)

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

อัลกอริทึมแบบประมาณ approximation algorithm

วิธีที่ให้คำตอบ “ดีพอ” ได้เร็ว พร้อมการันตีว่าใกล้คำตอบดีที่สุดแค่ไหน

อัตราการประมาณ (α) approximation ratio

ตัวเลขบอกว่าคำตอบเราแย่กว่าดีที่สุดได้ไม่เกินกี่เท่า ยิ่งใกล้ 1 ยิ่งเก่ง

อัลกอริทึมโลภ greedy

เลือกสิ่งที่ดูดีที่สุด “ตอนนี้” ไปเรื่อยๆ โดยไม่คิดเผื่ออนาคต — ง่ายและเร็ว

การค้นหาเฉพาะที่ local search

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

โปรแกรมเชิงเส้น Linear Programming (LP)

วิธีหาคำตอบที่ดีที่สุดเมื่อยอมให้ตัวเลขเป็นเศษส่วนได้ คอมแก้ได้เร็วมาก

การปัดเศษ rounding

แปลงคำตอบเศษส่วน (เช่น 0.7) ให้กลายเป็นการตัดสินใจจริง (0 หรือ 1)

การสุ่ม randomization

ใช้การ “โยนเหรียญ/ทอยลูกเต๋า” ช่วยตัดสินใจ ซึ่งบ่อยครั้งให้คำตอบดีโดยเฉลี่ย

PTAS approximation scheme

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

🧠 มาทบทวนกัน!

ลองตอบดูนะ กดเลือกคำตอบแล้วระบบจะบอกเฉลยทันที