ปัญหาการแต่งงานที่มั่นคง


12

พื้นหลัง

สมมติว่ามี2*nคนแต่งงานและสมมติว่าแต่ละคนจะถูกดึงดูดให้nคนอื่น ๆ ภายใต้ข้อ จำกัด ที่:

  1. สถานที่น่าสนใจคือสมมาตร ; เช่นถ้าคนที่Aจะดึงดูดให้คนBคนนั้นเป็นที่ดึงดูดให้กับบุคคลBA
  2. แรงดึงดูดใจคือการต่อต้าน ; เช่นถ้าบุคคลAและบุคคลBแต่ละคนดึงดูดให้บุคคลCแล้วบุคคลAและบุคคลBจะไม่ดึงดูดซึ่งกันและกัน

ดังนั้นเครือข่ายของสถานที่ท่องเที่ยวรูปแบบ (ไม่มีทิศทาง) ฝ่ายกราฟสมบูรณ์ Kn,nนอกจากนี้เรายังสมมติว่าแต่ละคนจัดอันดับคนที่พวกเขาสนใจ สิ่งเหล่านี้อาจแสดงเป็นน้ำหนักขอบในกราฟ

การแต่งงานคือการจับคู่(A,B)ที่AและBดึงดูดซึ่งกันและกัน การแต่งงานไม่แน่นอนหากมีการแต่งงานอีกครั้งที่คน ๆ หนึ่งจากการแต่งงานแต่ละครั้งสามารถหย่าร้างคู่ครองของพวกเขาและแต่งงานกันและทั้งสองจบลงด้วยคนที่พวกเขาอันดับสูงกว่าอดีตคู่ของพวกเขา

เป้าหมาย

งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่สมบูรณ์ซึ่งใช้ความชอบของแต่ละคนในฐานะอินพุตและเอาท์พุตการแต่งงานสำหรับแต่ละคนเช่นว่าการแต่งงานแต่ละครั้งมีเสถียรภาพ

อินพุต

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

เอาท์พุต

เอาต์พุตยังสามารถอยู่ในรูปแบบที่สะดวกได้ เช่นรายการของสิ่งอันดับ, ปกขอบน้อยที่สุด, ฟังก์ชั่นที่เชื่อมโยงกับคู่ของพวกเขาแต่ละคน, ฯลฯ โปรดทราบว่าข้อ จำกัด เพียงอย่างเดียวคือการแต่งงานแต่ละครั้งมีเสถียรภาพ, ไม่มีข้อกำหนดอื่น ๆ

หมายเหตุ

  1. คุณสามารถค้นหาข้อมูลเพิ่มเติมและO(n^2)อัลกอริทึมเพื่อแก้ปัญหานี้ในWikipediaหรือวิดีโอ Numberphileนี้ อย่างไรก็ตามคุณสามารถใช้อัลกอริทึมใด ๆ ได้ฟรี
  2. ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  3. นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ

15
สถานที่น่าสนใจคือสมมาตรฮา!
Luis Mendo

5
@ LuisMendo ฉันดำเนินการต่อในประเพณีชั้นของปัญหาคำที่ไม่สมจริง :)
ngenisis

2
มันเป็นวันวาเลนไทน์สรรพสินค้า (UTC + 8 ที่นี่)
busukxuan

คำตอบ:


7

Mathematica ขนาด 28 ไบต์

จะคิดว่านี่คือการโกง ฉันเพื่อตัวเองเช่นนี้

Combinatorica`StableMarriage
  • ความต้องการที่จะได้รับการเรียกว่ามีการฝึกอบรมน้ำหนักของการตั้งค่าสำหรับผู้ชายและผู้หญิง
  • ส่งคืนสิ่งที่ตรงกับการมีเพศสัมพันธ์

(ใช่Combinatoricaเลิกใช้แล้ว แต่มีค่าใช้จ่ายน้อยกว่าไบต์FindIndependentEdgeSet)


ตัวอย่าง (เหมือน GoT): (เป็นธรรม - ฉันเดาน้ำหนัก ... แต่ฉันไม่เป็นไรกับผลลัพธ์)

ป้อนคำอธิบายรูปภาพที่นี่

m = {{2, 4, 3, 1}, {1, 2, 4, 3}, {3, 2, 1, 4}, {4, 2, 1, 3}};
w = {{2, 3, 4, 1}, {3, 2, 1, 4}, {3, 2, 4, 1}, {4, 1, 2, 3}};
result = Combinatorica`StableMarriage[w, m];
MapThread[
  UndirectedEdge[Show[#1, ImageSize -> 130], 
    Show[#2, ImageSize -> 130]] &, {names1, 
   names2[[result]]}] // TableForm

blockquote


3
+1 สำหรับการใช้ประโยชน์จากห้องสมุดมหากาพย์ Mathematica ของฟังก์ชั่นที่ไร้ประโยชน์ต่อทุกคนยกเว้นโค้ดนักกอล์ฟ
SIGSTACKFAULT

2
ฉันต้องได้รับนิสัยของการไม่อนุญาตให้สร้าง -ins แม้ในขณะที่ฉันมั่นใจว่าไม่มีใคร :)
ngenisis

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