Masalah pernikahan yang stabil

12

Latar Belakang

Misalkan ada 2*norang yang akan menikah, dan anggap lebih jauh bahwa setiap orang tertarik pada norang lain persis di bawah batasan yang:

  1. Ketertarikan itu simetris ; yaitu jika orang Atertarik pada orang B, maka orang Btersebut tertarik pada orang tersebut A.
  2. Ketertarikan bersifat antitransitif ; yaitu jika orang Adan orang Bsaling tertarik kepada orang C, maka orang Adan orang Btersebut tidak saling tertarik.

Dengan demikian jaringan tarik-menarik membentuk grafik bipartit lengkap (tidak terarah)Kn,n . Kami juga berasumsi bahwa setiap orang memiliki peringkat orang yang mereka sukai. Ini dapat direpresentasikan sebagai bobot tepi dalam grafik.

Sebuah pernikahan adalah pasangan (A,B)mana Adan Btertarik satu sama lain. Pernikahan tidak stabil jika ada pernikahan lain di mana satu orang dari setiap pernikahan dapat menceraikan pasangan mereka dan menikah satu sama lain dan keduanya berakhir dengan seseorang yang mereka peringkat lebih tinggi dari mantan pasangan mereka.

Tujuan

Tugas Anda adalah menulis program atau fungsi lengkap yang mengambil preferensi setiap orang sebagai input dan menghasilkan pernikahan untuk setiap orang sehingga setiap pernikahan stabil.

Memasukkan

Input mungkin dalam format apa pun yang nyaman; misalnya, grafik tertimbang, daftar preferensi yang diurutkan, kamus / asosiasi, dll. Anda dapat memilih jumlah total orang sebagai input, tetapi tidak ada input lain yang diizinkan.

Keluaran

Output juga bisa dalam format apa pun yang nyaman; misalnya daftar tupel, penutup tepi minimal , fungsi yang menghubungkan setiap orang dengan pasangannya, dll. Perhatikan bahwa satu-satunya kendala adalah bahwa setiap pernikahan stabil, tidak ada persyaratan optimal lainnya.

Catatan

  1. Anda dapat menemukan lebih banyak informasi dan O(n^2)algoritma untuk menyelesaikan masalah ini di Wikipedia atau video Numberphile ini . Namun, Anda bebas menggunakan algoritma apa pun.
  2. Celah standar dilarang.
  3. Ini adalah . Jawaban terpendek (dalam byte) menang.
ngenisis
sumber
15
Ketertarikan adalah Ha simetris !
Luis Mendo
5
@LuisMendo Saya melanjutkan tradisi bertingkat masalah kata yang tidak realistis :)
ngenisis
2
Ini adalah hari Valentine (UTC + 8 di sini)
busukxuan

Jawaban:

7

Mathematica, 28 byte

Pada akan berpikir, ini curang. Saya sendiri menyukai ini:

Combinatorica`StableMarriage
  • Perlu disebut dengan matriks bobot preferensi untuk pria dan wanita.
  • Mengembalikan indikasi langsung untuk kopling.

(Ya Combinatoricasudah usang tetapi biayanya lebih sedikit byte daripada FindIndependentEdgeSet)


Contoh (seperti GoT): (Agar adil - saya menebak bobotnya ... tapi saya baik-baik saja dengan hasilnya)

masukkan deskripsi gambar di sini

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

Blokir

Julien Kluge
sumber
3
+1 untuk mengeksploitasi perpustakaan epik Mathematica dari fungsi yang tidak berguna untuk semua orang kecuali kode-pegolf.
SIGSTACKFAULT
2
Saya perlu membiasakan diri melarang built-in bahkan ketika saya yakin tidak ada :)
ngenisis
Jangan pernah meremehkan built-in Mathematicas; D
Julien Kluge