Стабільна проблема шлюбу


12

Фон

Припустимо, є 2*nлюди, які мають одружитися, і припустімо, що кожну людину приваблюють саме nінші люди з обмеженнями, які:

  1. Привабливість симетрична ; тобто якщо людина Aпритягується до людини B, то людина Bпритягується до людини A.
  2. Атракція антитранзитивна ; тобто якщо людина Aі людина Bпритягуються до людини C, то людина Aі людина Bне притягуються один до одного.

Таким чином, мережа атракціонів формує (непрямий) повний двосторонній графік Kn,n . Ми також припускаємо, що кожна людина класифікувала людей, яких вони приваблюють. Вони можуть бути представлені у вазі ребер на графіку.

Шлюб спаровування , (A,B)де Aі Bпритягуються один до одного. Шлюб є нестабільним, якщо є інший шлюб, коли одна людина з кожного шлюбу могла б розлучитися зі своїм партнером і одружитися один з одним, і обидва закінчилися з тим, кого вони посіли вище, ніж колишнім партнером.

Мета

Ваше завдання полягає в тому, щоб написати повну програму або функцію, яка враховує вподобання кожної людини як вихідні дані і виводить шлюб для кожної людини таким чином, щоб кожен шлюб був стабільним.

Вхідні дані

Введення може бути в будь-якому зручному форматі; наприклад, зважений графік, упорядкований список налаштувань, словник / асоціація тощо. Ви можете за бажанням взяти загальну кількість людей як вхід, але не вводити жодного іншого введення.

Вихідні дані

Вихід також може бути в будь-якому зручному форматі; наприклад, список кортежів, мінімальна обкладинка краю , функція, яка асоціює кожну людину зі своїм партнером тощо. Зауважте, що єдиним обмеженням є те, що кожен шлюб є ​​стабільним, інших вимог щодо оптимальності немає.

Примітки

  1. Ви можете знайти більше інформації та O(n^2)алгоритм вирішення цієї проблеми у Вікіпедії або цьому відеоролику Numberphile . Однак ви можете використовувати будь-який алгоритм.
  2. Стандартні лазівки заборонені.
  3. Це . Найкоротша відповідь (у байтах) виграє.

15
Атракціон симетричний Ha!
Луїс Мендо

5
@LuisMendo Я продовжую вести традицію нереальних проблем зі словом :)
ngenisis

2
Це день Святого Валентина (UTC + 8 тут)
busukxuan

Відповіді:


7

Математика, 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

Блок-котирування


3
+1 для використання епічної бібліотеки Mathematica про корисні для всіх, крім коду, гольфістські функції.
SIGSTACKFAULT

2
Мені потрібно звикнути забороняти вбудовані модулі, навіть коли я впевнений, що таких не існує :)
ngenisis

Ніколи не недооцінюйте вбудовані програми Mathematicas; D
Жульєн Клуге
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.