วิธีแบ่งพาร์ติชั่นให้เป็นเซตย่อยของ disjoint ที่กำหนดภายใต้เงื่อนไขบางประการ?


11

ฉันกำลังได้รับชุด , จำนวนเต็มและ integers เชิงลบa_ {IJ} ปัญหาของฉันคือการหาsเคล็ดย่อยS_jของ\ {1 \ ldots, k \}ดังกล่าวว่า:A{1,,k}skaijsSj{1,,k}

  1. j=1sSj=A ; และ
  2. |Sj|aijสำหรับiSjและj=1,,sทั้งหมด

วิธีแก้ปัญหานี้ มันยากที่จะหาทางออกที่เป็นไปได้?

ฉันคิดว่ามันไม่ใช่เรื่องง่ายที่จะแก้ปัญหาเพราะฉันลองใช้ขั้นตอนบางอย่างที่เริ่มต้นด้วยj{1,,n}และมอบหมายi{1,,k}จนกระทั่งจำนวน จากiมอบหมายให้jมากกว่าaijสำหรับบางคนที่iได้รับมอบหมาย แต่สิ่งนี้ไม่ถูกต้องเพราะฉันเหลือบางiที่ไม่สามารถมอบหมายให้jใด ๆj(เพราะa_ {ij}ของพวกเขาaijซึ่งไม่พอใจ)

วิธีเดรัจฉานบังคับเมื่อฉันต้องสร้างเซตย่อยทั้งหมดของAและทดสอบแต่ละอันทำงานให้ฉัน ( k=8,n=3 ) แต่ไม่มีประสิทธิภาพมาก


ตรวจสอบว่าการแก้ไขนั้นตรงกับคำถามที่คุณต้องการถามหรือไม่ นอกจากนี้มาจากไหน นั่นคือค่าคงที่คงที่ (ไม่ใช่ส่วนหนึ่งของอินพุต แต่ได้รับการแก้ไขตลอดเวลา) หรือเป็นส่วนหนึ่งของอินพุตหรือไม่ ในที่สุดคุณกำลังมองหาวิธีการแก้ปัญหาในทางปฏิบัติ? หรือคุณกำลังมองหาความซับซ้อนเชิงทฤษฎีของปัญหานี้? หากคุณเคยลองใช้การเขียนโปรแกรมเชิงเส้นจำนวนเต็ม? amax
DW

คำตอบ:


10

ปัญหานี้เกิดจาก NP-hard โดยการลดจาก Vertex Cover

ในปัญหา Vertex Cover, เราจะได้รับกราฟและจำนวนและงานของเราคือการตรวจสอบว่ามีบางเซตของที่มากที่สุดจุดจากเช่นที่ขอบในทุกเป็นเหตุการณ์ที่เกิดขึ้น อย่างน้อยหนึ่งจุดสุดยอดในU(เทียบเท่า: เป็นไปได้ไหมที่จะฆ่าทุก ๆ ขอบในโดยการลบที่จุดยอดที่สุด?)G=(V,E)rUrVEUGr

ครั้งแรกแบ่งเข้าไปย่อยเคลื่อนเทียบเท่ากับการกำหนดแต่ละองค์ประกอบในว่าหนึ่งในป้ายที่เป็นไปได้ แนวคิดพื้นฐานของการลดคือการสร้างฉลากสำหรับแต่ละจุดสุดยอดในและเพื่อ "อนุญาต" แต่ละขอบจะได้รับมอบหมายเพียงหนึ่งในสองป้ายที่สอดคล้องกับจุดสิ้นสุดของมันในแง่ต่อไปนี้: การกำหนดขอบที่สอดคล้องกัน ฉลากไม่มีข้อ จำกัด (ของแท้) ในสิ่งที่ขอบอื่น ๆ สามารถกำหนดป้ายชื่อเดียวกันได้ในขณะที่การกำหนดขอบให้กับฉลากที่ไม่สอดคล้องกันจะช่วยป้องกันขอบอื่น ๆ ที่ได้รับมอบหมายฉลากเดียวกัน - ซึ่งแน่นอนว่ามีผลในการเพิ่มจำนวน ต้องการฉลากที่แตกต่างAsAsSj VvjV

ในการสร้างอินสแตนซ์ปัญหาของคุณจากอินสแตนซ์ของ Vertex Cover:(A,a,s)(G,r)

  1. ตั้งค่าเป็นและสร้างองค์ประกอบในสำหรับแต่ละขอบในE(คู่เหล่านี้สามารถคิดเป็นจำนวนเต็ม ; bijection ใด ๆ ระหว่างพวกเขาจะทำ.)k|E|(i,j)AvivjE1,,k
  2. ตั้งค่าเป็นถ้าหรือ ; มิฉะนั้นให้ตั้งค่าเป็น 1a(b,c),d|E|d=bd=ca(b,c),d
  3. ชุด rs=r

ถ้าเป็น YES อินสแตนซ์ของเวอร์เท็กซ์ปกแล้วมันเป็นเรื่องง่ายที่จะเห็นว่าอินสแตนซ์ที่เพิ่งสร้างขึ้นของปัญหาของคุณยังเป็น YES อินสแตนซ์: เพียงแค่เลือกป้ายสอดคล้องกับจุดในการแก้ปัญหาใด ๆและสำหรับแต่ละขอบกำหนดองค์ประกอบที่สอดคล้องกันไม่ว่าจะเลือกหนึ่งในป้ายกำกับหรือ (เลือกโดยพลการถ้าเลือกป้ายกำกับทั้งสอง) โซลูชันนี้ใช้ชุดย่อยและใช้ได้เนื่องจากใช้บังคับเท่านั้นคือชุดที่สอดคล้องกัน(G,r)SjvjUvbvcE(b,c)ASbScsaijป้ายกำกับซึ่งมีผล (ไม่ใช่) ในการป้องกันมากกว่าขอบถูกกำหนดฉลากเดียวกัน|E|

มันยังคงแสดงให้เห็นว่า YES-instanceของปัญหาของคุณหมายความว่าต้นฉบับเป็นอินสแตนซ์ YES ของ Vertex Cover นี้จะมากกว่าเล็กน้อยซับซ้อนเนื่องจากวิธีการแก้ปัญหาที่ถูกต้องไปอาจกำหนดในทั่วไปขอบไม่ใช่ป้าย -correspondingคือหมายความว่าเราไม่สามารถ จำเป็นต้อง "อ่านออก" จุดสุดยอดที่ถูกต้องปกจากวิธีการแก้ปัญหาที่ถูกต้องYX=(A,a,s)(G,r)YX(i,j) m { i , j } U YSmm{i,j}UY

อย่างไรก็ตามการกำหนดฉลากที่ไม่สอดคล้องกันนั้นมีค่าใช้จ่ายสูงที่ จำกัด โครงสร้างของโซลูชันอย่างรุนแรง: เมื่อใดก็ตามที่ขอบถูกกำหนดเช่นป้ายกำกับด้วย , ความจริง ที่ทำให้มั่นใจได้ว่าจะต้องเป็นขอบเดียวที่กำหนดป้ายกำกับนี้ ดังนั้นในโซลูชันใด ๆที่ประกอบด้วยขอบที่ไม่มีป้ายกำกับเราสามารถสร้างโซลูชันทางเลือกดังนี้:S m m { i , j } a ( i , j ) , m = 1 Y ( i , j ) S m Y (i,j)Smm{i,j}a(i,j),m=1Y(i,j)SmY

  1. โดยพลการเลือกป้ายกำกับใหม่สำหรับที่จะเป็นได้ทั้งหรือS_j ( i , j ) S i S jSz(i,j)SiSj
  2. กำหนดป้ายกำกับใหม่นี้ หากสิ่งนี้ส่งผลให้เกิดโซลูชันที่ไม่ถูกต้องจะต้องเป็นเพราะขอบอื่น ๆ ,ได้รับการกำหนดฉลากแล้ว ในกรณีนั้นให้ตั้งค่าและไปที่ขั้นตอนที่ 1( i , j ) z { i , j } S z ( i , j ) = ( i , j )(i,j)(i,j)z{i,j}Sz(i,j)=(i,j)

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

การก่อสร้างนี้เป็นเวลาพหุนามอย่างชัดเจนดังนั้นจึงเป็นไปตามปัญหาของคุณคือ NP-hard


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

เป็นที่คาดหวังว่าวิธีการโลภจะล้มเหลวในการส่งออกวิธีแก้ปัญหาที่เป็นไปได้เพราะถ้าเป็นเช่นนั้นคุณจะต้องแก้ปัญหา NP-hard ในโพลีไทม์ ;-) โปรดจำไว้ว่ามันไม่จำเป็นต้องผิดถ้าไม่สามารถทำได้ ค้นหาวิธีแก้ไข: อาจเป็นไปได้ว่าไม่มีวิธีแก้ปัญหาที่เป็นไปได้
j_random_hacker

เกี่ยวกับเทคนิคการแก้ปัญหาสิ่งที่ฉันชอบเรียกว่าการค้นหาลำแสง นี่เป็นสาขาย่อยและมีขอบเขตที่ "ลืม" โซลูชันบางส่วนที่ไม่ดีพอเพื่อ จำกัด การใช้หน่วยความจำ (B & B เป็นตัวเองเป็นวิธีที่ดีมากและบางครั้งก็แก้ปัญหาได้อย่างรวดเร็วและง่ายกว่าการค้นหาคานออกไปเล็กน้อยจึงเป็นมูลค่ายิง - แต่เพราะมันเป็นวิธีการที่แน่นอนมันสามารถของหลักสูตรใช้เวลานับพันปีในบางกรณี.)
j_random_hacker

(ทั้งหมดข้างล่างนี้ใช้กับการค้นหาแบบลำแสงและ B & B) B & B เป็นเทคนิคทั่วไปมาก สิ่งสำคัญที่มีก็คือการใช้ประโยชน์จากรายละเอียดของปัญหาที่เกิดขึ้นในการจัดระเบียบตัดสินใจที่คุณทำเพื่อให้มากที่สุดเท่าที่เป็นไปได้ตัดสินใจที่เลวร้าย (นั่นคือการตัดสินใจที่ไม่ได้นำไปสู่การแก้ปัญหาที่เป็นไปได้) จะทำในช่วงต้นในต้นไม้ค้นหา (การตัดสินใจเหล่านี้จะทำที่ไหนสักแห่งและแต่ละระดับที่ลึกกว่านั้นพวกเขาได้ทำสองเท่าของจำนวนครั้งที่พวกเขาทำ) สำหรับปัญหาของคุณฉันขอแนะนำให้อันดับแรกองค์ประกอบในลดลำดับของ "ความเลว" ที่ ..A
j_random_hacker

... ความเลวขององค์ประกอบที่สามารถเป็นได้เช่นขั้นต่ำของเหนือทั้งหมด, การทำลายความสัมพันธ์โดยขั้นต่ำที่สอง, ขั้นต่ำสุดที่สามเป็นต้นการพูดองค์ประกอบ "ที่เลวร้ายที่สุด" จะเป็นองค์ประกอบ ที่ จำกัด ชุดใด ๆ ที่เพิ่มเข้ามาอย่างรุนแรงที่สุด ที่แต่ละโหนดที่ระดับความลึกในการค้นหาคุณจะมีวิธีแก้ปัญหาบางส่วนซึ่งองค์ประกอบแรก (และ "แย่ที่สุด")ได้ถูกกำหนดให้กับชุดแล้ว คุณจะต้องเลือกว่าชุดใดที่จะกำหนดองค์ประกอบ th ให้: นั่นคือคุณจะต้องใช้การเรียกซ้ำแบบซ้ำสูงสุดครั้ง ("สูงถึง" เพราะหวังว่าเราจะได้ ...iaijjddn(d+1)n
j_random_hacker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.