Problema matrimonial estable

12

Antecedentes

Suponga que hay 2*npersonas para casarse, y suponga además que cada persona se siente atraída por notras exactamente bajo las restricciones que:

  1. La atracción es simétrica ; es decir, si la persona Ase siente atraída por la persona B, entonces Bse atrae a la persona A.
  2. La atracción es antitransitiva ; es decir, si la persona Ay la persona Bse sienten atraídas por la persona C, entonces la persona Ay la persona Bno se sienten atraídas entre sí.

Así, la red de atracciones forma el gráfico bipartito completo (no dirigido) Kn,n. También suponemos que cada persona ha clasificado a las personas que le atraen. Estos pueden representarse como pesos de borde en el gráfico.

Un matrimonio es un emparejamiento (A,B)donde Ay Bse sienten atraídos el uno al otro. El matrimonio es inestable si hay otro matrimonio en el que una persona de cada matrimonio podría divorciarse de su pareja y casarse entre sí y ambos terminan con alguien que clasificaron más alto que su pareja anterior.

Objetivo

Su tarea es escribir un programa o función completa que tome las preferencias de cada persona como entrada y produzca un matrimonio para cada persona de modo que cada matrimonio sea estable.

Entrada

La entrada puede estar en cualquier formato conveniente; por ejemplo, gráfico ponderado, lista ordenada de preferencias, diccionario / asociación, etc. Opcionalmente, puede tomar el número total de personas como entrada, pero no se permite ninguna otra entrada.

Salida

La salida también puede estar en cualquier formato conveniente; por ejemplo, lista de tuplas, cobertura mínima de borde , una función que asocia a cada persona su pareja, etc. Tenga en cuenta que la única restricción es que cada matrimonio es estable, no hay otros requisitos de optimización.

Notas

  1. Puede encontrar más información y un O(n^2)algoritmo para resolver este problema en Wikipedia o en este video de Numberphile . Sin embargo, puede utilizar cualquier algoritmo.
  2. Las lagunas estándar están prohibidas.
  3. Este es el . La respuesta más corta (en bytes) gana.
ngenisis
fuente
15
La atracción es simétrica ¡Ja!
Luis Mendo
55
@LuisMendo Continúo en la tradición histórica de problemas
verbales
2
Es el día de San Valentín aunque (UTC + 8 aquí)
busukxuan

Respuestas:

7

Mathematica, 28 bytes

En pensaría, esto es hacer trampa. A mí mismo me gusta esto:

Combinatorica`StableMarriage
  • Necesita ser llamado con las matrices de peso de las preferencias para hombres y mujeres.
  • Devuelve los índices directos para el acoplamiento.

(Sí Combinatoricaestá en desuso pero cuesta menos bytes que FindIndependentEdgeSet)


Ejemplo (similar a GoT): (Para ser justos, adiviné los pesos ... pero estoy de acuerdo con los resultados)

ingrese la descripción de la imagen aquí

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

Julien Kluge
fuente
3
+1 para explotar la biblioteca épica de Mathematica de funciones inútiles para todos excepto golfistas de código.
SIGSTACKFAULT
2
Necesito conseguir en el hábito de no permitir muebles empotrados, incluso cuando estoy seguro de que no existe uno :)
ngenisis
Nunca subestimes las incorporaciones de Mathematicas; D
Julien Kluge