ค้นหาการสั่งซื้อที่ดีที่สุด


9

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

สมมติว่าเราได้รับเมทริกซ์ตัวอย่างเช่น{1,0,1}n × k

[1010110001011011101110001]

โดยไม่ต้องพยายามทุกการเปลี่ยนแปลงเดียวพบการสั่งซื้อของคอลัมน์ที่เพิ่มจำนวนแถวที่องค์ประกอบที่ไม่ใช่ศูนย์แรกคือ1ci1

สำหรับตัวอย่างข้างต้นการสั่งซื้อหนึ่งรายการ (ไม่ซ้ำกัน!) คือคือ(c3,c4,c1,c2,c5)

[1010100101100110111100101]

ที่นี่สำหรับจากแถวองค์ประกอบที่ไม่ใช่ศูนย์แรกคือ1451


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

1
ฉันต้องการแนะนำขั้นตอนการประมวลผลล่วงหน้า: ให้คอลัมน์กึ่งบวก (แถว. แถว) เป็นคอลัมน์ (แถว. แถว) ที่มีเพียง 0 วินาทีและ 1 วินาที ข้อเสนอแนะคือการลบคอลัมน์กึ่งบวกทั้งหมดและแถวที่มี 1 ในคอลัมน์กึ่งบวก ในตัวอย่างของคุณที่จะลบแถว 1, 3 และ 4 ตอนนี้คุณจะเหลือแถวและคอลัมน์ที่ทั้งหมดมี -1s อาจไม่ช่วย แต่อาจง่ายกว่าที่จะให้เหตุผล
Pål GD

เราสามารถสมมติว่าจำนวนแถวน้อยกว่าจำนวนคอลัมน์ได้มากแค่ไหน? นี่อาจทำให้ปัญหาง่ายขึ้น
Angela Pretorius

1
@ ตอนนี้, การประมวลผลล่วงหน้าที่คล้ายกันสามารถเกิดขึ้นได้กับแถวและคอลัมน์ที่ไม่มีเลข 1 อย่างไรก็ตามฉันไม่คิดว่าจะทำให้ง่ายขึ้นในการให้เหตุผล: เล็กกว่า
Peter Taylor

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

คำตอบ:


4

ปัญหานี้ซึ่งผมจะเรียก CO สำหรับการสั่งซื้อคอลัมน์เป็นNP-ยาก นี่คือการลดลงของVertex Cover (VC) ของปัญหา NP-hard :

รูปแบบปัญหาการตัดสินใจของ VC และ CO

ให้การป้อนข้อมูลเช่น VC เป็นk) มันแสดงถึงคำถาม: "จากกราฟ , เป็นไปได้หรือไม่ที่จะเลือกชุดของจุดยอดสูงสุดจากเช่นว่าขอบทุกอันในจะเกิดขึ้นอย่างน้อยหนึ่งจุดยอดที่เลือก" เราจะสร้างอินสแตนซ์ของ CO ที่แสดงถึงคำถาม: "ให้เมทริกซ์กับองค์ประกอบใน , เป็นไปได้ไหมที่จะเปลี่ยนคอลัมน์ของที่ 1 ปรากฏขึ้นก่อนหน้า -1 บนอย่างน้อยแถว? " ปัญหาทั้งสองนี้ระบุไว้ในปัญหาการตัดสินใจ(V,E,k)(V,E)kVE(A,k)A{1,0,1}Akรูปแบบโดยคำตอบของแต่ละคนเป็นใช่หรือไม่: การพูดอย่างเป็นทางการมันเป็นรูปแบบของปัญหาที่ NP- สมบูรณ์ (หรือไม่) ไม่ยากเกินไปที่จะเห็นว่ารูปแบบปัญหาการเพิ่มประสิทธิภาพที่เป็นธรรมชาติมากขึ้นที่ระบุไว้ในคำถามของ OP นั้นเทียบเท่ากันในแง่ของความซับซ้อน: การค้นหาแบบไบนารีบนพารามิเตอร์ขีด จำกัด สามารถใช้เพื่อแก้ปัญหาการเพิ่มประสิทธิภาพโดยใช้ตัวแก้ไขปัญหาการตัดสินใจ การเรียกใช้ตัวแก้ปัญหาการปรับให้เหมาะสมแล้วตามด้วยการเปรียบเทียบเพียงครั้งเดียวก็เพียงพอที่จะแก้ปัญหาการตัดสินใจ

การสร้างอินสแตนซ์ของ CO จากอินสแตนซ์ของ VC

ให้และ. เราจะสร้างเมทริกซ์พร้อมแถวและคอลัมน์ ด้านบนแถวจะเกิดขึ้นของตึกแถวแต่ละคนพร้อมกับแต่ละบล็อกที่เป็นตัวแทนของขอบที่จำเป็นต้องได้รับการคุ้มครอง แถวด้านล่างมี "สถานะ" จุดสุดยอดซึ่งจะทำให้คอลัมน์ (ตรงกับจุดสุดยอด) จะต้องเสียค่าใช้จ่ายคงที่ถ้ามันรวมอยู่ในด้านซ้ายมือของการแก้ปัญหา CO (สอดคล้องกับจุดสุดยอดที่รวมอยู่ในจุดสุดยอด ปกของโซลูชัน VC)n=|V|m=|E|A(n+1)m+nn+1(n+1)mmn+1n

สำหรับแต่ละจุดยอดให้สร้างคอลัมน์ที่:vi

  • ในด้านบนแถวที่บล็อก -th ของแถวทั้งหมดมี 1 เมื่อขอบเป็นเหตุการณ์ที่เกิดขึ้นในและ 0 เป็นอย่างอื่นและ(n+1)mjn+1ejvi
  • แถวด้านล่างมีทั้งหมด 0 ยกเว้น -th ซึ่งคือ -1ni

สร้างคอลัมน์ "รั้ว" อีกหนึ่งคอลัมน์ซึ่งประกอบด้วยสำเนาของ -1, ตามด้วยสำเนาของ +1(n+1)mn

สุดท้ายคือการกำหนดเกณฑ์สำหรับอินสแตน CO สร้าง:k กล่าวอีกนัยหนึ่งเราอนุญาตได้สูงสุดแถวซึ่ง -1 จะปรากฏต่อหน้า +1 ลองเรียกจำนวนการละเมิดแถวนี้ว่า "ต้นทุน" ของโซลูชัน COk(n+1)m+nkk

พิสูจน์

การโต้ตอบระหว่างวิธีแก้ไขปัญหากับอินสแตนซ์ CO และชุดจุดยอดในอินสแตนซ์ VC ต้นฉบับคือ: ทุกคอลัมน์ทางด้านซ้ายของรั้วสอดคล้องกับจุดสุดยอดที่อยู่ในชุดและทุกคอลัมน์ทางด้านขวาของรั้วสอดคล้องกับ จุดสุดยอดที่ไม่ใช่

โดยสัญชาตญาณ -1s ที่ด้านบนสุดของคอลัมน์ "รั้ว" บังคับให้เลือกส่วนย่อยของคอลัมน์ที่จะวางไว้ทางซ้ายของมันที่รวมกันประกอบด้วย +1 ในตำแหน่งทั้งหมดเหล่านี้ - สอดคล้องกับส่วนย่อยของจุดยอดที่เกิดขึ้นในทุก ๆ ขอบ. แต่ละคอลัมน์เหล่านี้ที่ปรากฏทางด้านซ้ายของ "รั้ว" มี -1 ในแถวที่แตกต่างบางแห่งในแถวด้านล่างแถวค่าใช้จ่ายของ 1; +1 ที่ด้านล่างของ "รั้ว" ตรวจสอบให้แน่ใจว่าคอลัมน์ทั้งหมดอยู่ทางด้านขวาไม่มีค่าใช้จ่ายดังกล่าวn

เห็นได้ชัดว่าวิธีแก้ปัญหา VC ที่ใช้ที่จุดยอดสูงสุดให้ผลเฉลยกับ CO ตัวอย่างที่สร้างด้วยราคาสูงสุดที่ : เพียงแค่สั่งคอลัมน์ที่ตรงกับจุดยอดในจุดสุดยอดครอบคลุมโดยพลการตามด้วยคอลัมน์รั้วตามด้วยคอลัมน์รั้วที่เหลือทั้งหมดตามลำดับ .kk

มันยังคงแสดงให้เห็นว่าทางออกของอินสแตนซ์ของ CO ที่มีราคาสูงสุดที่สอดคล้องกับจุดยอดปกคลุมด้วยจุดสูงสุดkk

สมมติว่าตรงกันข้ามกับวิธีแก้ปัญหา CO ที่มีอยู่โดยมีค่าใช้จ่ายที่มากที่สุดซึ่งเหลือบางแถวในแถวบนสุดด้วย -1 ก่อน +1 แถวนี้เป็นบล็อกของแถวที่สอดคล้องกับขอบโดยเฉพาะยูวีทุกแถวในบล็อกนี้ในอินสแตนซ์ดั้งเดิมนั้นเหมือนกันทุกประการโดยการสร้าง การอนุญาตคอลัมน์อาจเปลี่ยนแถวเหล่านี้ แต่ไม่มีผลต่อความจริงที่ว่าพวกเขาเหมือนกัน ดังนั้นแต่ละเหล่านี้แถวเหมือนมี -1 ก่อนที่ 1 ในการแก้ปัญหาหมายความค่าใช้จ่ายอย่างน้อย1แต่ : ความขัดแย้งk(n+1)m(n+1)uvAn+1n+1kn<n+1

เนื่องจากแต่ละบล็อกของแถวในแถวบนสุดมี +1 ก่อน -1 แต่ละขอบที่สอดคล้องกันจะถูกปกคลุมด้วยจุดยอดที่สอดคล้องกับคอลัมน์ทางด้านซ้ายของรั้ว: นั่นคือ ชุดย่อยของจุดยอดนี้ถือเป็นการปิดยอด เนื่องจากไม่มีแถวบนสุดมี -1 ก่อน +1 ดังนั้นจึงมีเพียงสถานที่ที่ค่าใช้จ่ายที่อาจเกิดขึ้นในการแก้ปัญหาอยู่ในแถวด้านล่างจากคอลัมน์ที่อยู่ทางด้านซ้ายของรั้ว แต่ละคอลัมน์ดังกล่าวมีค่าใช้จ่ายที่แน่นอน 1 ดังนั้นเมื่อค่าใช้จ่ายมากที่สุดคือต้องมีคอลัมน์ดังกล่าวมากที่สุดและด้วยเหตุนี้ที่จุดยอดสูงสุดในหน้าปกm(n+1)m(n+1)mnkkk

ท้ายที่สุดเป็นที่ชัดเจนว่าอินสแตนซ์ CO สามารถสร้างขึ้นในเวลาพหุนามจากอินสแตนซ์ VC ซึ่งหมายความว่าหากมีอัลกอริทึมพหุนามเวลาสำหรับการแก้ปัญหา CO อินสแตนซ์ VC ใด ๆ ก็สามารถแก้ไขได้ในเวลาพหุนาม ด้านบนแล้วแก้ไขมัน เนื่องจาก VC เป็น NP-hard CO ก็เช่นกัน


เมื่อใดก็ตามที่มีคำตอบที่ดีมันทำให้ฉันสงสัยว่า "คำถามเครือข่ายน่าสนใจ" ควรถูกแทนที่หรือเข้าร่วมโดยบางสิ่งเช่น "คำตอบเครือข่ายที่มีค่า"
John L.

คุณช่วยอธิบายเกี่ยวกับวิธีค้นหาคำตอบได้ไหม นั่นควรเป็นความกระจ่างแจ้งมากกว่าคำตอบเอง
John L.

1
@ Apass.Jack: ขอบคุณ! :) ฉันไม่มีกลยุทธ์พิเศษและสามารถใช้เวลานานในการเดินไปในทิศทางที่ผิด ตัวอย่างเช่นที่นี่ฉันใช้เวลานานคิดว่าฉันสามารถลดจาก Hamiltonian Cycle (ซึ่งคล้ายกันมากเท่ากับการสั่งซื้อองค์ประกอบ) ก่อนที่จะทราบว่าการก่อสร้างของฉันจะอนุญาตการกำหนดค่าที่สอดคล้องกับ subtours และดังนั้นจึงไม่ทำงาน ตามกฎแล้วฉันมักจะลองลดจาก Vertex Cover หรือ Partition แล้วอาจจะเป็น Clique "คำตอบของเครือข่ายที่มีค่า" ดูเหมือนความคิดที่ยอดเยี่ยม :)
j_random_hacker

1
@ Apass.Jack: หนึ่งความคิดทั่วไปที่มีประโยชน์คือคิดเกี่ยวกับวิธีที่คุณสามารถ "ปรับ" ตัวอย่างปัญหาเป้าหมายโดยไม่เปลี่ยนคำตอบเช่นถ้าปัญหาเป้าหมาย (สิ่งที่เราพยายามพิสูจน์ยาก) คือ Vertex Cover ทำให้เป็นบวก จำนวนเต็ม r disjoint สำเนาของกราฟและคูณเกณฑ์ k โดย rคงคำตอบไว้ไม่เปลี่ยนแปลง บ่อยครั้งที่คุณต้องการการละเมิดบางอย่าง (โซลูชันเป้าหมายที่ไม่สอดคล้องกับโซลูชันแหล่งที่มาที่ถูกต้อง) เพื่อ "เอาชนะ" ผู้อื่นบางคนและในกรณีนี้คุณสามารถ "ทวีคูณ" แกดเจ็ตที่สอดคล้องกับการละเมิดที่สำคัญกว่า
j_random_hacker

1
เพื่อลดคำตอบของฉันเราต้องการเข้ารหัสอินสแตนซ์ของปัญหาที่มี "แรง" สองแบบ: พยายามปิดขอบทั้งหมดและลองใช้จุดยอดน้อยที่สุดเท่าที่จะทำได้ อันแรกมีความสำคัญมากกว่าที่นี่ดังนั้นฉันจึง "คูณ" แถวที่สอดคล้องกับขอบ: ตอนนี้ต้นทุนการละเมิดขอบเดียวn+1ซึ่งหมายความว่าการพลาดขอบเดียวจะแย่กว่าการรวมจุดยอดทั้งหมด และตอนนี้ฉันเพิ่งรู้ว่าฉันควรแก้ไขคำตอบเพื่อให้ชัดเจนว่าเรากำลังจัดการกับปัญหาการตัดสินใจของปัญหาทั้งสองนี้ซึ่งพารามิเตอร์ threshold เป็นส่วนหนึ่งของอินสแตนซ์ปัญหา ...
j_random_hacker

2

ฉันไม่รู้ว่ามีคำตอบพหุนามหรือไม่ อย่างไรก็ตามตามความคิดเห็นของPål GD คุณสามารถสร้างฟังก์ชันการทำให้เข้าใจได้ง่าย เมทริกซ์เริ่มต้นนั้นง่ายขึ้นเมื่อคุณสร้างลำดับเอาต์พุตS.

function simplification:
while(true)
    if any row i$ has no 1 or no -1 left, remove it
    if any column j has no -1 then,
       remove it and put j on the leftmost available position in S,
       remove all rows where column j has 1.
    if any column j has no 1 then, 
       remove it and put j on the rightmost available position in S.
    if no modification has been done on this loop, break

จากนั้นคุณต้องทำการสำรวจ combinatorics โดยใช้ฟังก์ชั่นการเลือกซ้ำ:

function pick(k):
    put column k on the leftmost available position in S
    remove any row where column k is -1 or 1

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

ในตัวอย่างที่กำหนดการลดความซับซ้อนครั้งแรกจะให้ (ตามที่Pål GD อธิบายไว้ในความคิดเห็น)

  • S[0]=c3ลบ r1, r3
  • S[1]=c4ลบ r4
  • S[2]=c2 นี่ช่วยให้คุณมีเมทริกซ์ง่าย ๆ ในการสำรวจ
    [1111]

ฉันคิดว่าเมทริกซ์ที่ทำให้วิธีนี้ไม่มีประสิทธิภาพค่อนข้างจะมี 1 อย่างแน่นอนและหนึ่ง -1 ต่อแถว / คอลัมน์บางอย่างเช่น

[110000110000001100001100000011000011]

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


1
@ Apass.Jack ฉันแก้ไขให้แม่นยำยิ่งขึ้น ใช่ฉันหมายถึงตำแหน่งคอลัมน์ในลำดับเอาต์พุต
Optidad

การเพิ่มระดับเป็นขั้นตอนการทำให้เข้าใจง่ายอาจดีพอสำหรับการใช้งานจริง (เช่นแบบฝึกหัดการเขียนโปรแกรมออนไลน์)
John L.

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

2
ฉันลองวิเคราะห์ค่าตัดจำหน่ายเวลาซึ่งดูเหมือนว่ายาก ฉันสงสัยว่าความสมบูรณ์แบบของNP ในทางกลับกันขั้นตอนการทำให้เข้าใจง่ายอาจเป็นเรื่องทั่วไปมากขึ้น สำหรับคอลัมน์i และ j เช่นว่าส่วนที่ไม่ใช่ศูนย์ร่วมของพวกเขาเป็นส่วนที่ไม่ใช่ศูนย์ของ i, คอลัมน์ j สามารถลบออกได้หากส่วนที่ไม่ใช่ศูนย์พิเศษของ j ไม่มี 1 และคอลัมน์ i สามารถลบออกได้หากส่วนที่ไม่ใช่ศูนย์พิเศษของ jไม่มี -1
John L.

1
กฎการปกครองอื่นก็คือ: เมื่อใดก็ตามที่คุณมีสองคอลัมน์ i และ j เช่นที่มีอย่างน้อย 1 แถวที่ i มี -1 และ j มี +1 และไม่มีแถวที่ i มี +1 และ j มี -1 ไม่มีข้อได้เปรียบใด ๆ สำหรับการวาง iเป็นครั้งแรก สมมุติว่าj กุมอำนาจ iในกรณีนี้. คุณสามารถใช้ตัวเลือกนี้ภายใน (k) โดยตรวจสอบว่า kครองคอลัมน์ใด ๆ ที่วางไว้แล้ว: ถ้าเป็นเช่นนั้นคุณสามารถตัดสาขาของต้นไม้การค้นหานี้ได้
j_random_hacker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.