🧩 ทำไมต้องมีคำตอบแบบ “ดีพอ”?
ปัญหายากบางอย่าง ต่อให้คอมพิวเตอร์เก่งที่สุดก็แก้แบบเป๊ะไม่ทัน
🤔 ปัญหาคืออะไร?
ลองนึกว่าเราต้องไปส่งของให้เพื่อนหลายบ้าน แล้วอยากได้เส้นทางที่ สั้นที่สุด ถ้ามีไม่กี่บ้านก็ลองทุกทางได้ แต่พอบ้านเยอะขึ้น จำนวนเส้นทางที่เป็นไปได้จะ พุ่งทะยานแบบน่ากลัว
ปัญหาแบบนี้เรียกว่า NP-hard คือยากจนยังไม่มีใครรู้วิธีหาคำตอบที่ดีที่สุดได้เร็วเลย
💡 ไอเดียเด็ด
แทนที่จะรอคำตอบที่ดีที่สุดเป็นล้านปี เราออกแบบวิธีที่ให้คำตอบ “ดีพอ” ได้ในพริบตา
สิ่งที่เจ๋งคือ เราจะ การันตีเป็นตัวเลข ได้เลยว่าคำตอบของเราแย่กว่าคำตอบที่ดีที่สุด ไม่เกินกี่เท่า ตัวเลขนี้เรียกว่า อัตราการประมาณ (α)
เช่น α = 2 แปลว่า “คำตอบของเราอาจยาวเป็น 2 เท่าของทางที่สั้นที่สุด แต่ไม่เกินนั้นแน่นอน”
🚗 เครื่องระเบิดจำนวนเส้นทาง
เลื่อนเพิ่มจำนวนบ้านที่ต้องไปส่งของ แล้วดูว่าจำนวนเส้นทางที่ต้องลองเพิ่มเร็วแค่ไหน (สูตร = (n−1)! ÷ 2)
🏅 จำคำนี้ไว้
หนังสือเล่มนี้รวบรวม เทคนิคหลัก ในการสร้างอัลกอริทึมแบบประมาณไว้ 8 แบบ — เราจะไปรู้จักทีละบท แต่ละบทมีตัวอย่างจากชีวิตจริงและของเล่นให้ลองกดด้วยนะ!
🚒 เลือกให้ครอบคลุม (Set Cover)
เลือก “ของกลุ่มน้อยที่สุด” ที่รวมกันแล้วครบทุกอย่าง
🤔 ปัญหาคืออะไร?
เราเป็นนายกเทศมนตรี ต้องสร้าง สถานีดับเพลิง ให้ดูแลครบ ทุกหมู่บ้าน แต่ละสถานีดูแลได้บางหมู่บ้านที่อยู่ใกล้ๆ
คำถามคือ จะสร้างสถานี น้อยที่สุดกี่แห่ง ถึงจะครอบคลุมหมดทุกหมู่บ้าน?
💡 ไอเดียเด็ด: “น้องโลภ” (Greedy)
กฎง่ายมาก: เลือกสถานีที่ครอบคลุมหมู่บ้าน “ใหม่” ได้เยอะที่สุดก่อนเสมอ แล้วทำซ้ำจนครบ
เหมือนเวลาเก็บของเล่นเข้ากล่อง เราหยิบกองที่ใหญ่ที่สุดก่อน จะได้เสร็จไวๆ
🗺️ ลองวางสถานีดับเพลิงเอง
กดเลือกสถานี (ปุ่มด้านล่าง) ให้หมู่บ้านทั้ง 10 หลังเป็นสีเขียวครบ โดยใช้สถานีให้น้อยที่สุด แล้วลองกด “ให้น้องโลภช่วย” เทียบกัน!
✨ รู้ไหมว่า
เทคนิค Set Cover เคยถูกใช้สร้าง โปรแกรมแอนตี้ไวรัส จริงๆ! นักวิจัยเลือก “ชิ้นโค้ดเล็กๆ” กลุ่มน้อยที่สุดที่ปรากฏในไวรัสทุกตัว เพื่อให้โปรแกรมจับไวรัสได้ครบ โดยไม่ต้องจำไวรัสทีละตัว 🦠
🏅 เก่งแค่ไหน?
น้องโลภการันตีได้ว่าใช้สถานีไม่เกินประมาณ ln(n) เท่า ของจำนวนที่น้อยที่สุด (n = จำนวนหมู่บ้าน)
ฟังดูเหมือนเยอะ แต่จริงๆ ในงานจริงมันมักได้คำตอบ ใกล้เคียงดีที่สุดมาก และที่สำคัญคือ เร็วสุดๆ
⚖️ แบ่งงานให้ยุติธรรม (Scheduling)
โลภแบบฉลาด + ขยับทีละนิดให้ดีขึ้น
🤔 ปัญหาคืออะไร?
มีการบ้าน (งาน) หลายชิ้น ใช้เวลาต่างกัน และมีเพื่อน 3 คนช่วยทำ เราอยากให้ คนที่ทำเสร็จช้าที่สุด เสร็จเร็วที่สุด (เรียกเวลานี้ว่า makespan)
คือแบ่งงานให้ สมดุล ไม่ให้ใครคนใดคนหนึ่งงานท่วมหัว
💡 ไอเดียเด็ด
วิธีโลภ (List): ใครว่างก่อน (งานน้อยสุด) รับงานชิ้นต่อไป
งานใหญ่ก่อน (LPT): เรียงงานจากใหญ่ไปเล็กก่อน แล้วค่อยแจก — ฉลาดกว่าเยอะ!
การค้นหาเฉพาะที่ (Local Search): เริ่มจากการแบ่งมั่วๆ แล้ว “สลับงาน” ทีละนิดถ้าทำให้ดีขึ้น เหมือนค่อยๆ ปีนขึ้นเขาทีละก้าว
🧑🤝🧑 ลองแบ่งงานให้เพื่อน 3 คน
กดเลือกงาน (ก้อนสี) แล้วกดเครื่องของเพื่อนที่อยากให้ทำ หรือกดปุ่มให้ระบบช่วยแบ่ง เป้าหมาย: ทำให้แถบ “เสร็จช้าสุด” สั้นที่สุด!
✨ รู้ไหมว่า
เทคนิคนี้ใช้จริงในโรงงาน, ตารางเที่ยวบิน, และการแบ่งงานให้ “เซิร์ฟเวอร์” ในศูนย์ข้อมูลขนาดใหญ่ เพื่อให้เว็บโหลดเร็วๆ ⚙️
🏅 เก่งแค่ไหน?
วิธีโลภแบบ List การันตี ไม่เกิน 2 เท่า ของดีที่สุด ส่วน “งานใหญ่ก่อน (LPT)” เก่งขึ้นเป็น ราว 4/3 เท่า เท่านั้นเอง!
🎒 เป้สะพายหลังมหัศจรรย์ (Knapsack)
ปัดตัวเลขให้ “กลมๆ” เพื่อคิดเร็วขึ้น แต่คำตอบยังเกือบเป๊ะ
🤔 ปัญหาคืออะไร?
เราจะไปตั้งแคมป์ เป้ใบนี้รับน้ำหนักได้จำกัด เราอยากหยิบของที่ มีคุณค่ารวมมากที่สุด โดยน้ำหนักรวม ไม่เกินที่เป้รับได้
💡 ไอเดียเด็ด
การหาคำตอบเป๊ะๆ ช้ามากเมื่อ “คุณค่า” เป็นตัวเลขใหญ่ๆ
เคล็ดลับคือ ปัดตัวเลขคุณค่าให้หยาบลง (เช่น ปัดเป็นหลักสิบ) ทำให้คอมคิดเร็วขึ้นมหาศาล แต่คำตอบที่ได้ยัง เกือบดีที่สุด เหมือนปัดราคาสินค้าจาก 197 เป็น 200 เพื่อคิดเลขในใจง่ายๆ
🏕️ จัดเป้ไปแคมป์ปิ้ง
เป้รับได้ 10 กิโลกรัม กดเลือกของที่จะเอาไป ให้ได้คะแนนคุณค่ารวมมากที่สุดโดยไม่เกินน้ำหนัก แล้วกด “เฉลย” เทียบดูนะ!
✨ รู้ไหมว่า
วิธีปัดข้อมูลแบบนี้ดีจนได้ฉายาว่า PTAS — เราบอกได้เลยว่าอยากได้คำตอบใกล้ดีที่สุดแค่ไหน (เช่น ห่างแค่ 1%) แล้วเครื่องก็จัดให้ได้! 🎯
🏅 เก่งแค่ไหน?
ปัญหาเป้สะพายหลังมีวิธีที่เข้าใกล้คำตอบดีที่สุดได้ ใกล้แค่ไหนก็ได้ (เช่น 99%, 99.9%) แลกกับการคิดนานขึ้นนิดหน่อย — คุ้มมาก!
🏪 ครึ่งๆ ก็ได้ แล้วค่อยปัด (LP Rounding)
ยอมให้ตัดสินใจ “ครึ่งๆ” ก่อน เพราะคิดง่าย แล้วค่อยปัดเป็นจริง
🤔 ปัญหาคืออะไร?
เราจะเปิดร้านสาขาในเมือง ต้องเลือกว่า เปิดที่ไหนบ้าง ให้ลูกค้าทุกคนอยู่ใกล้ร้าน และต้นทุนรวมต่ำที่สุด การตัดสินใจ “เปิด/ไม่เปิด” (0 หรือ 1) ทำให้ปัญหายากมาก
💡 ไอเดียเด็ด
โปรแกรมเชิงเส้น (LP) คือการ “โกง” นิดหน่อย: เรายอมให้คำตอบเป็น เศษส่วน ได้ก่อน เช่น “เปิดร้าน 0.7 ร้าน” ฟังดูแปลก แต่คอมแก้แบบนี้ได้ เร็วมาก
จากนั้นเรา ปัดเศษ กลับเป็นจริง เช่น 0.7 → เปิดจริง (1), 0.2 → ไม่เปิด (0)
✨ รู้ไหมว่า
การปัดเศษ LP ใช้แก้ปัญหา “เลือกทำเล” ของร้านสะดวกซื้อ คลังสินค้า และเสาสัญญาณมือถือจริงๆ 📡 เพื่อให้ครอบคลุมคนเยอะที่สุดด้วยต้นทุนน้อยที่สุด
🏅 เก่งแค่ไหน?
วิธีปัดเศษ LP ให้การันตีดีๆ ได้หลายปัญหา เช่น “การเลือกทำเลร้าน” การันตีต้นทุน ไม่เกิน 4 เท่า ของดีที่สุด (และมีวิธีที่เก่งกว่านี้อีก)
🎲 ทอยลูกเต๋าช่วยตัดสินใจ (MAX CUT)
บางครั้ง “โยนเหรียญ” ก็ให้คำตอบที่ดีอย่างน่าทึ่ง
🤔 ปัญหาคืออะไร?
เพื่อน 6 คน มีบางคู่ที่ชอบ แกล้งกัน (เส้นที่เชื่อม) เราจะแบ่งทุกคนเป็น 2 ห้อง ยังไงให้คู่ที่ชอบแกล้งกัน อยู่คนละห้องมากที่สุด (ทะเลาะกันน้อยลง!)
💡 ไอเดียเด็ด
ลองง่ายสุด: ให้แต่ละคนโยนเหรียญ ออกหัวไปห้อง A ออกก้อยไปห้อง B
น่าทึ่งมาก: โดยเฉลี่ยแล้ว วิธีมั่วๆ นี้จะแยกคู่แกล้งกันได้ ถึงครึ่งหนึ่ง ของจำนวนเส้นทั้งหมดเสมอ!
🪙 ลองแบ่งห้องด้วยการโยนเหรียญ
กดที่ “เพื่อน” แต่ละคนเพื่อสลับห้อง (ฟ้า/ชมพู) หรือกด “โยนเหรียญสุ่ม” เส้นที่กลายเป็นสีเขียว = คู่แกล้งกันที่ถูกแยกห้องสำเร็จ ลองทำให้เขียวครบ 8 เส้นสิ!
✨ รู้ไหมว่า
วิธี “สุ่ม” แบบนี้ใช้แก้ปัญหาใหญ่ๆ เช่น การจัดสายไฟในชิปคอมพิวเตอร์ และการแก้ปริศนาตรรกะ (MAX SAT) ได้ดีอย่างเหลือเชื่อ 🎯
🏅 เก่งแค่ไหน?
แค่โยนเหรียญก็การันตีได้ อย่างน้อยครึ่งหนึ่ง (½) ของคำตอบดีที่สุดแล้ว! และในบทถัดไปเราจะทำให้ดีขึ้นไปอีก 😎
🧭 ลูกศรในอวกาศ & มีดสุ่มหั่น
ใช้เรขาคณิตช่วยแบ่ง ให้ดีกว่าโยนเหรียญธรรมดา
🤔 ปัญหาคืออะไร?
เป็นปัญหา “แบ่ง 2 ห้อง” เหมือนบทที่แล้ว แต่คราวนี้เราอยากได้คำตอบที่ ดีกว่าครึ่ง ให้มากที่สุด
💡 ไอเดียเด็ด (รางวัลโนเบลแห่งวงการ!)
แทนคนแต่ละคนด้วย ลูกศรชี้ทิศ บนลูกบอล โดยพยายามให้คู่ที่แกล้งกัน ชี้คนละทาง
จากนั้น สุ่มหั่นลูกบอลด้วยมีดบางๆ (เส้นตรงสุ่ม) ใครอยู่ฝั่งไหนก็ไปห้องนั้น เรขาคณิตช่วยให้แยกคู่แกล้งกันได้เยอะกว่าการโยนเหรียญเฉยๆ!
🔪 หมุน “มีดสุ่ม” หั่นแบ่งห้อง
ลากแถบเลื่อนเพื่อหมุนเส้นมีด (เส้นประ) ดูว่ามุมไหนแยกคู่แกล้งกัน (เส้นเขียว) ได้มากที่สุด เห็นไหมว่าตำแหน่งของจุดช่วยให้หาคำตอบดีๆ ได้ง่ายขึ้น!
✨ รู้ไหมว่า
วิธีนี้ชื่อ Goemans–Williamson (ผู้เขียนหนังสือเล่มนี้คนหนึ่งเลย!) ถือเป็นหนึ่งในผลงานที่สวยงามที่สุดในวงการ และยังไม่มีใครทำได้ดีกว่านี้มากเลยจนถึงทุกวันนี้ 🏆
🏅 เก่งแค่ไหน?
การันตีได้ถึง ราว 0.878 เท่า ของคำตอบดีที่สุด — ดีกว่าการโยนเหรียญ (0.5) แบบก้าวกระโดด!
🤝 ต่อราคาสองฝ่ายพร้อมกัน (Primal-Dual)
ค่อยๆ เพิ่มข้อเสนอ จนคุ้มค่อยตัดสินใจ — แถมได้ “ใบรับรอง” ว่าคำตอบดี
🤔 ปัญหาคืออะไร?
เราจะ ลากสายเชื่อมเมือง ให้เมืองที่ต้องการคุยกันเชื่อมถึงกันครบ โดยใช้ความยาวสายรวม น้อยที่สุด (เช่น เดินสายอินเทอร์เน็ตให้คุ้มที่สุด)
💡 ไอเดียเด็ด
คิดเหมือน การประมูล/ต่อราคา: แต่ละเมืองค่อยๆ “เพิ่มงบ” ของตัวเองขึ้นเรื่อยๆ (เหมือนวงกลมที่ขยายออก) พอ งบของสองฝั่งมาเจอกันที่สายเส้นไหน และมัน “คุ้ม” เราก็ ซื้อสายเส้นนั้น
ความเจ๋งคือ “งบ” ที่เพิ่มขึ้นกลายเป็น ใบรับรอง พิสูจน์ได้ว่าคำตอบเราดีจริง โดยไม่ต้องเทียบกับคำตอบที่ดีที่สุด
✨ รู้ไหมว่า
วิธีไพรมัล-ดูอัลใช้ออกแบบ เครือข่ายจริง เช่น วางสายไฟเบอร์ออปติก และวางแผนเส้นทางขนส่ง เพราะมันเร็วและไม่ต้องใช้คอมแรงมาก 🔌
🏅 เก่งแค่ไหน?
สำหรับปัญหาลากสายเชื่อมเมือง (Steiner Forest) วิธีนี้การันตีความยาวรวม ไม่เกิน 2 เท่า ของดีที่สุด แถมทำงานเร็วมาก
✂️ ตัดแผนที่ให้แยกเขต (Cuts & Metrics)
ตัดถนนให้น้อยที่สุด แต่แยกเมืองสำคัญออกจากกันให้ได้
🤔 ปัญหาคืออะไร?
มีเมืองสำคัญหลายเมืองที่ ต้องแยกออกจากกัน (เช่น ป้องกันไฟป่าลามข้ามเขต) เราจะ ตัดถนน เส้นไหนบ้าง ให้เมืองเหล่านั้นไปหากันไม่ได้ โดย ตัดถนนรวมน้อยที่สุด
💡 ไอเดียเด็ด
เปลี่ยน “ความสัมพันธ์” ให้กลายเป็น ระยะทางบนแผนที่ (เรียกว่า metric) จุดที่ควรอยู่ห้องเดียวกันให้ “ใกล้กัน” จุดที่ควรแยกให้ “ไกลกัน”
พอเป็นแผนที่ระยะทางแล้ว เราก็แค่ ขีดเส้นแบ่งเขต ตรงที่บางที่สุด — ง่ายขึ้นเยอะ!
✨ รู้ไหมว่า
เทคนิค “รอยตัด” ใช้ใน การแบ่งกลุ่มข้อมูล (เช่น แยกรูปภาพออกจากพื้นหลัง), การออกแบบวงจร, และการวิเคราะห์เครือข่ายสังคม 🌐
🏅 เก่งแค่ไหน?
หลายปัญหารอยตัดมีอัลกอริทึมที่การันตีได้ เช่น Multiway Cut การันตี ไม่เกินราว 1.5 เท่า และปัญหายากกว่านั้นก็ยังการันตีระดับ O(log n) ได้
📚 คำศัพท์น่ารู้
ศัพท์เท่ๆ ที่เจอในเว็บนี้ อธิบายสั้นๆ แบบเข้าใจง่าย
ปัญหายากระดับที่ยังไม่มีใครรู้วิธีหาคำตอบดีที่สุดได้เร็วเลย พอข้อมูลใหญ่ขึ้นก็แทบเป็นไปไม่ได้
วิธีที่ให้คำตอบ “ดีพอ” ได้เร็ว พร้อมการันตีว่าใกล้คำตอบดีที่สุดแค่ไหน
ตัวเลขบอกว่าคำตอบเราแย่กว่าดีที่สุดได้ไม่เกินกี่เท่า ยิ่งใกล้ 1 ยิ่งเก่ง
เลือกสิ่งที่ดูดีที่สุด “ตอนนี้” ไปเรื่อยๆ โดยไม่คิดเผื่ออนาคต — ง่ายและเร็ว
เริ่มจากคำตอบหนึ่ง แล้วขยับทีละนิดถ้ามันทำให้ดีขึ้น เหมือนค่อยๆ ปีนเขา
วิธีหาคำตอบที่ดีที่สุดเมื่อยอมให้ตัวเลขเป็นเศษส่วนได้ คอมแก้ได้เร็วมาก
แปลงคำตอบเศษส่วน (เช่น 0.7) ให้กลายเป็นการตัดสินใจจริง (0 หรือ 1)
ใช้การ “โยนเหรียญ/ทอยลูกเต๋า” ช่วยตัดสินใจ ซึ่งบ่อยครั้งให้คำตอบดีโดยเฉลี่ย
วิธีที่เราสั่งได้เลยว่าอยากได้คำตอบใกล้ดีที่สุดแค่ไหน แล้วเครื่องจัดให้ได้
🧠 มาทบทวนกัน!
ลองตอบดูนะ กดเลือกคำตอบแล้วระบบจะบอกเฉลยทันที