Kararlı evlilik sorunu


12

Arka fon

Evlenecek 2*ninsanlar olduğunu varsayalım ve her bireyin aşağıdaki nkısıtlamalar altında tam olarak diğer insanlara çekildiğini varsayalım :

  1. Cazibe simetrik ; yani kişi kişiye Açekilirse, kişi Bkişiye Bçekilir A.
  2. Cazibe antitransistir ; yani kişi Ave kişinin Bher biri kişiye ilgi duyuyorsa C, kişi Ave kişi Bbirbirine çekilmez.

Böylece çekim ağı (yönlendirilmemiş) tam iki taraflı grafiği oluşturur Kn,n . Ayrıca, her bir kişinin ilgilendiği insanları sıraladığını varsayıyoruz. Bunlar grafikte kenar ağırlıkları olarak gösterilebilir.

Bir evlilik bir eşleştirme olduğunu ve birbirlerine çekti. Her evlilikten bir kişinin eşinden boşanabileceği ve birbirleriyle evlenebileceği ve her ikisinin de eski eşlerinden daha üst sıralarda yer aldığı biriyle sonuçlanabileceği başka bir evlilik varsa evlilik kararsızdır .(A,B)AB

Hedef

Göreviniz, her bir kişinin tercihlerini girdi olarak alan ve her bir evliliğin sabit olacağı şekilde her bir kişi için bir evlilik çıkaran eksiksiz bir program veya işlev yazmaktır.

Giriş

Giriş herhangi bir uygun biçimde olabilir; örneğin, ağırlıklı grafik, sıralı tercih listesi, sözlük / dernek, vb. İsteğe bağlı olarak toplam kişi sayısını girdi olarak alabilirsiniz, ancak başka girdiye izin verilmez.

Çıktı

Çıktı ayrıca herhangi bir uygun formatta olabilir; örneğin, tuples listesi, minimal kenar örtüsü , her bir kişiyle partnerini ilişkilendiren bir işlev, vb.

notlar

  1. O(n^2)Bu sorunu Wikipedia veya bu Numberphile videosunda çözmek için daha fazla bilgi ve bir algoritma bulabilirsiniz . Ancak, herhangi bir algoritmayı kullanmakta özgürsünüz.
  2. Standart boşluklar yasaktır.
  3. Bu . En kısa cevap (bayt cinsinden) kazanır.

15
Çekim simetrik Ha!
Luis Mendo

5
@LuisMendo Gerçekçi olmayan kelime problemleri hikayesi geleneğini sürdürüyorum :)
ngenisis

2
Sevgililer günü tho (UTC + 8 burada)
busukxuan

Yanıtlar:


7

Mathematica, 28 bayt

Düşünüyorum, bu hile yapıyor. Ben kendim için:

Combinatorica`StableMarriage
  • Erkekler ve kadınlar için tercihlerin ağırlık matrisleri ile çağrılması gerekir.
  • Kuplaj için doğrudan indeksleri döndürür.

(Evet Combinatorica, kullanımdan kaldırıldı ancak maliyeti bayttan daha az FindIndependentEdgeSet)


Örnek (GoT benzeri): (Adil olmak gerekirse - ağırlıkları tahmin ettim ... ama sonuçlara iyiyim)

resim açıklamasını buraya girin

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
Mathematica'nın kod golfçüleri dışındaki herkese yararsız destansı kütüphanesinden yararlanmak için +1.
SIGSTACKFAULT

2
Birinin var olmadığından emin olduğumda bile yerleşiklere izin vermeme alışkanlığına
girmeliyim

Mathematicas yerleşiklerini asla küçümsemeyin; D
Julien Kluge
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.