การจัดการกับการล่วงล้ำ: ปัญหา NP-complete


43

สมมติว่าฉันเป็นโปรแกรมเมอร์และฉันมีปัญหาที่สมบูรณ์แบบที่ฉันต้องแก้ปัญหา มีวิธีการใดบ้างที่สามารถจัดการกับปัญหา NPC มีแบบสำรวจหรืออะไรที่คล้ายกันในหัวข้อนี้?


4
มันจะมีประโยชน์ในการระบุปัญหาที่คุณมี
Dave Clarke

2
คำถามนี้ไม่เกี่ยวกับปัญหาเฉพาะ ฉันต้องการทราบเทคนิคเพื่อให้สามารถนำไปใช้ได้ในอนาคตหากต้องการ
ไม่เปิดเผยตัว

1
นี่ก็เหมือนกับการถามว่า: ฉันจะแก้ปัญหาในเวลาพหุนามโดยทั่วไปได้อย่างไร มีปัญหาเป็นล้านและแต่ละคนมีวิธีแก้ปัญหาเฉพาะของตนเอง
Dave Clarke

3
@DaveClarke: มีเทคนิคที่จัดตั้งขึ้นดังนั้นฉันคิดว่าคำถามถูกต้อง; คำถามที่เพ่งความสนใจไปมากกว่านี้อาจจะดีกว่า
กราฟิลส์

คำตอบ:


54

มีกลยุทธ์ที่ได้รับการศึกษาเป็นอย่างดี สิ่งที่ดีที่สุดในใบสมัครของคุณขึ้นอยู่กับสถานการณ์

  • ปรับปรุงรันไทม์กรณีที่เลวร้ายที่สุด
    ด้วยการใช้ข้อมูลเชิงลึกเฉพาะปัญหาคุณสามารถปรับปรุงอัลกอริทึมที่ไร้เดียงสาได้บ่อยครั้ง ตัวอย่างเช่นมีอัลกอริทึมสำหรับ Vertex Cover ด้วย c < 1.3 [1]; นี้เป็นอย่างมากการปรับปรุงในช่วงที่ไร้เดียงสา Ω ( 2 n )และอาจจะทำให้อินสแตนซ์ขนาดที่เกี่ยวข้องสำหรับคุณเวไนยO(n)<1.3Ω(2n)

  • ปรับปรุงรันไทม์ที่คาดไว้
    การใช้ฮิวริสติกคุณสามารถคิดค้นอัลกอริทึมที่รวดเร็วในหลาย ๆ กรณี หากสิ่งเหล่านั้นรวมถึงสิ่งที่คุณพบเจอในทางปฏิบัติคุณก็เป็นทองคำ ตัวอย่างคือ SAT ซึ่งมีนักแก้ปัญหาที่เกี่ยวข้องค่อนข้างมากและอัลกอริธึม Simplex (ซึ่งแก้ปัญหาพหุนาม แต่ยังคง) หนึ่งในเทคนิคพื้นฐานที่มักจะเป็นประโยชน์คือสาขาและผูกพัน

  • จำกัด ปัญหา
    หากคุณสามารถตั้งสมมติฐานเพิ่มเติมในอินพุตของคุณปัญหาอาจกลายเป็นเรื่องง่าย

    • คุณสมบัติโครงสร้าง
      อินพุตของคุณอาจมีคุณสมบัติที่ทำให้การแก้ปัญหาง่ายขึ้นเช่น planarity, bipartiteness หรือหายไปเล็กน้อยสำหรับกราฟ ดูที่นี่สำหรับตัวอย่างของคลาสกราฟที่ CLIQUE นั้นง่าย
    • Bounding ฟังก์ชั่นของท่าน
      สิ่งที่จะต้องดูก็คือความซับซ้อน parameterised ; ปัญหาบางอย่างจะแก้ไขได้ในเวลาสำหรับkบางพารามิเตอร์อินสแตนซ์ (ปริญญาโหนดสูงสุดน้ำหนักขอบสูงสุด, ... ) และม.อย่างต่อเนื่อง หากคุณสามารถผูกkด้วยฟังก์ชันโพลีโนแกรมมิคในnในการตั้งค่าของคุณคุณจะได้อัลกอริทึมพหุนาม Saeed Amiriให้รายละเอียดในคำตอบของเขาO(2knม.)kม.kn
    • ปริมาณอินพุตที่ถูก จำกัด
      นอกจากนี้ปัญหาบางอย่างก็ยอมรับอัลกอริธึมที่ทำงานในเวลาหลอก - พหุนามนั่นคือรันไทม์ของพวกมันถูก จำกัด ขอบเขตโดยฟังก์ชันพหุนามในจำนวนที่เป็นส่วนหนึ่งของอินพุต ตัวอย่างการตรวจสอบความไร้เดียงสาเป็นตัวอย่าง ซึ่งหมายความว่าหากปริมาณที่เข้ารหัสในอินสแตนซ์ของคุณมีขนาดที่เหมาะสมคุณอาจมีอัลกอริทึมแบบง่ายที่ทำงานได้ดีสำหรับคุณ
  • ผลลัพธ์ที่อ่อนแอลง
    ซึ่งหมายความว่าคุณยอมรับผลลัพธ์ที่ผิดพลาดหรือไม่สมบูรณ์ มีสองรสชาติหลัก:

    • อัลกอริธึมที่น่าจะเป็น
      คุณจะได้รับผลลัพธ์ที่ถูกต้องพร้อมความน่าจะเป็นบางอย่างเท่านั้น มีตัวแปรบางอย่างอัลกอริธึมMonte-CarloและLas-Vegas ที่โดดเด่นที่สุด ตัวอย่างที่มีชื่อเสียงคือการทดสอบเบื้องต้นของMiller-Rabin

    • 5

อ้างถึงอัลกอริทึมสำหรับปัญหาหนักโดยHromkovičสำหรับการรักษาอย่างละเอียด


  1. ความเรียบง่ายคือความงาม: ปรับปรุงขอบเขตบนสำหรับการครอบจุดสุดยอดโดย Chen Jianer, Iyad A. Kanj, Ge Xia (2005)

4
แน่นอน monte carlo หรือ las vegas อัลกอริทึมไม่น่าจะทำงานใน polytime ในปัญหาที่ยาก NP
Sasho Nikolov

12

คำตอบอื่น ๆ ได้กล่าวถึงเรื่องนี้จากมุมมองเชิงทฤษฎีมากขึ้น นี่คือวิธีการที่ใช้งานได้จริงมากขึ้น


สำหรับปัญหาการตัดสินใจที่สมบูรณ์แบบ "ปกติ" ( "มีบางสิ่งที่ตรงกับข้อ จำกัด เหล่านี้หรือไม่" ) นี่คือสิ่งที่ฉันจะลองก่อนเสมอ:

  1. เขียนโปรแกรมง่ายๆที่เข้ารหัสเช่นปัญหาของคุณเป็นเช่น SAT

  2. จากนั้นใช้ตัวแก้ SAT ที่ดีเรียกใช้ (ใช้คอมพิวเตอร์มัลติคอร์ที่เร็วที่สุดที่คุณมี) และดูว่าเกิดอะไรขึ้น

ลองใช้อินสแตนซ์ขนาดเล็กก่อนเพื่อทำความเข้าใจว่าใช้เวลานานแค่ไหน


น่าแปลกที่มักจะวิธีนี้มากดีกว่าการพยายามที่จะใช้แก้ของคุณเองเฉพาะสำหรับปัญหาปัจจุบันของคุณ:

  • นักแก้ปัญหา SAT นั้นฉลาดและมีประสิทธิภาพดี พวกเขาทำได้ง่ายกว่าการใช้การค้นหาย้อนรอย (ไม่ว่าคุณจะเสียเวลามากแค่ไหนในการปรับแต่งโค้ดของคุณ) พวกเขายังมีประสิทธิภาพสูงกว่าทางเลือกอื่นนอกตัวเองเช่นตัวแก้โปรแกรมเชิงเส้นจำนวนเต็ม

  • ต้องใช้การเขียนโปรแกรมน้อยมาก ขั้นตอนที่ 1 ค่อนข้างตรงไปตรงมาและไม่ได้เป็นเรื่องสำคัญต่อประสิทธิภาพ คุณสามารถใช้ภาษาสคริปต์เช่น Python มีคนอื่นดูแลการใช้งานทุกอย่างที่คุณต้องการสำหรับขั้นตอนที่ 2 แล้ว


สำหรับปัญหาการเพิ่มประสิทธิภาพ NP-hard ทั่วไป( "ค้นหาสิ่งเล็กที่สุดที่เป็นไปตามข้อ จำกัด เหล่านี้ทั้งหมด" ) วิธีการนี้อาจจะใช้งานได้หรือไม่ก็ได้

หากคุณสามารถทำให้เป็นปัญหาในการตัดสินใจได้อย่างง่ายดาย ( "มีสิ่งที่มีขนาด 4 ที่สอดคล้องกับข้อ จำกัด เหล่านี้ทั้งหมดหรือไม่" , "แล้วขนาด 3 มีขนาดเท่าไร?" ) เยี่ยมมากทำตามแนวทางเดียวกันกับปัญหาการตัดสินใจ

มิฉะนั้นคุณอาจต้องการใช้วิธีแก้ปัญหาฮิวริสติกที่พยายามหาวิธีแก้ปัญหาขนาดเล็ก (ไม่จำเป็นต้องเป็นวิธีแก้ปัญหาที่เล็กที่สุด ) ตัวอย่างเช่น:

  1. เข้ารหัสปัญหาของคุณเป็น (ถ่วงน้ำหนัก) เช่น MAX-SAT

  2. ใช้ตัวแก้ปัญหาแบบฮิวริสติกจากแพ็คเกจUBCSAT ตัวแก้ปัญหาแบบฮิวริสติกเป็นแบบคู่ขนาน ลองค้นหาคลัสเตอร์คอมพิวเตอร์ที่มีคอมพิวเตอร์หลายร้อยเครื่อง คุณสามารถเรียกใช้ตัวแก้ปัญหาได้นานเท่าที่คุณต้องการจากนั้นจึงใช้ทางออกที่ดีที่สุดที่คุณค้นพบ


8

Parametrized Complexity

วิธีหนึ่งในการโจมตีความสามารถในการบุกรุกคือการคิดถึงปัญหาในบริบทความซับซ้อนที่ซับซ้อน

k(k)พี(n)k(k)

O(n(k))

นี่คือตัวอย่างบางส่วนในคลาสต่างๆของลำดับชั้น W:

  1. จุดยอดปกคือ FPT (เช่นจุดยอดแยกบนกราฟที่ไม่มีทิศทาง)
  2. ชุดอิสระและ Clique มีทั้ง W [1] - เสร็จสมบูรณ์
  3. ชุดครอบครองคือ W [2] - ทำให้สมบูรณ์

นี่เป็นอีกระดับของความซับซ้อนในการจำแนกปัญหา NP อย่างแม่นยำยิ่งขึ้นและหากคุณต้องการมากขึ้นคุณสามารถดูParameterized Circuit Complexity และ W Hierarchyโดย Downey et al (1998)

และถ้าคุณต้องการมากยิ่งขึ้นเป็นสิ่งที่ดีในการอ่าน Flum และ Grohe ของParameterized ซับซ้อนทฤษฎี

และในที่สุดก็:

ความซับซ้อนของ Parametrized เทียบกับอัลกอริธึมการประมาณ:

เป็นที่ทราบกันว่าหากปัญหามี FPTAS (แบบแผนพหุนามแบบเต็มเวลา ) จากนั้นก็เป็น FPT (ซึ่งเห็นได้ชัด) แต่ไม่มีสิ่งใดที่รู้จักกันดีในทิศทางย้อนกลับยังมีงานบางอย่างเกี่ยวกับความสัมพันธ์ของ PTAS และ XP แต่มี ไม่ได้มีความสัมพันธ์ที่แน่นแฟ้นมากระหว่าง PTAS และลำดับชั้น W (อย่างน้อยตอนนี้ฉันไม่ทราบ)

นอกจากนี้ในบางกรณีเราอาจแก้ไขพารามิเตอร์ที่แตกต่างกันเช่น: ความยาวของเส้นทางที่ยาวที่สุดในกราฟถูก จำกัด ขอบเขตและขนาดของการแก้ปัญหาถูก จำกัด ขอบเขต (เช่นในชุดคำติชมจุดยอด), ...

ตัวอย่างการใช้งานจริง:

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

  1. 2...2O(n)2O(k)k=10

  2. หนึ่งในอัลกอริทึมฮิวริสติกที่รวดเร็วและแม่นยำที่สุดสำหรับ TSP คือ: การรวมการเดินทางและการแยกย่อยสาขาซึ่งใช้การแก้ปัญหาแบบขนาน (ไม่ใช่โดยตรง แต่เป็นการย่อยสลายสาขาและวิธีการเขียนโปรแกรมแบบไดนามิกที่พวกเขาใช้


5

ความครบถ้วนสมบูรณ์ของ NP นั้นเกี่ยวกับการบุกรุกในกรณีที่เลวร้ายที่สุด ขึ้นอยู่กับปัญหาที่คุณกำลังดำเนินการอินสแตนซ์ของคลาสจำนวนมากอาจถูกแก้ไขในเวลาที่เหมาะสมในทางปฏิบัติ (แม้ว่าคุณอาจต้องใช้อัลกอริทึมพิเศษเพิ่มเติมเพื่อให้ได้ runtimes ดี)

ลองพิจารณาดูว่ามีการลดปัญหาของคุณอย่างมีประสิทธิภาพไปเป็นปัญหาด้วยตัวแก้ปัญหาที่ดีหรือไม่เช่น Boolean Satisfiability หรือ Integer Linear Programming


4

โวลต์ผมโวลต์Jโวลต์kGGใช้อัลกอริทึมที่ยอมรับได้เพื่อแก้ปัญหาของคุณในเวลาแบบเอ็กซ์โพเนนเชียล ระหว่างอัลกอริธึมแบบเอ็กซ์โปเนนเชียลเวลาในการทำงานบางอย่างสามารถยอมรับได้เมื่อขนาดอินพุตของปัญหาของคุณน้อยกว่าค่าที่ระบุ


2

แม้ว่าจะสัมผัสกับคำตอบบางข้อสั้น ๆ แต่ขอให้ฉันเน้นว่าในทางปฏิบัติปัญหาที่เกิดจากปัญหาสมบูรณ์ได้รับการแก้ไข (หรือโดยประมาณ) ตลอดเวลา เหตุผลหลักที่คุณสามารถแก้ปัญหา NP-complete ในทางปฏิบัติคือ:

อินสแตนซ์ที่พบในการปฏิบัติไม่ใช่ "กรณีที่เลวร้ายที่สุด"

เหตุผลอื่นสำหรับความคลาดเคลื่อนคือ:

เป็นการยากที่จะวิเคราะห์อัลกอริทึมฮิวริสติกอย่างเป็นทางการ

ในทางปฏิบัติคุณใช้อัลกอริทึมแบบฮิวริสติกเพื่อแก้ปัญหา NP-complete ของคุณและหวังให้ดีที่สุด ผลลัพธ์มักจะสวยงาม

ปัญหาอื่นที่สัมผัสกับคำตอบอื่น ๆ คือ:

บางครั้งอัลกอริธึมเอ็กซ์โปเนนเชียลนั้นเร็วพอ

แน่นอนว่าขึ้นอยู่กับปัญหา เมื่อข้อมูลขนาดใหญ่มีส่วนเกี่ยวข้องเรามีค่าสูงสุดตรงข้าม:

บางครั้งอัลกอริธึมที่เป็นไปได้เพียงอย่างเดียวคือ quasilinear


ฉันกลัวว่าฝูงชนที่นี่ค่อนข้างมีแนวโน้มทางทฤษฎี คุณอาจได้รับคำตอบที่ดีกว่าในไซต์ stackexchange หลัก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.