Problema matrimoniale stabile


12

sfondo

Supponiamo che ci siano 2*npersone da sposare e supponiamo inoltre che ogni persona sia attratta esattamente da naltre persone sotto i vincoli che:

  1. L'attrazione è simmetrica ; cioè se la persona Aè attratta da persona B, allora la persona Bè attratta da persona A.
  2. L'attrazione è antitransitiva ; cioè se persona Ae persona Bsono attratte ciascuna da persona C, allora persona Ae persona Bnon sono attratte l'una dall'altra.

Pertanto la rete di attrazioni costituisce il grafico bipartito completo (non indirizzato) Kn,n. Supponiamo anche che ogni persona abbia classificato le persone a cui sono attratte. Questi possono essere rappresentati come spigoli del bordo nel grafico.

Un matrimonio è un accoppiamento in (A,B)cui Ae Bsono attratti l'uno dall'altro. Il matrimonio è instabile se esiste un altro matrimonio in cui una persona per ciascun matrimonio può divorziare dal proprio partner e sposarsi a vicenda ed entrambi finiscono con qualcuno che hanno classificato più in alto rispetto al loro ex partner.

Obbiettivo

Il tuo compito è quello di scrivere un programma o una funzione completa che prenda le preferenze di ogni persona come input e produca un matrimonio per ogni persona in modo tale che ogni matrimonio sia stabile.

Ingresso

L'input può essere in qualsiasi formato conveniente; ad es. grafico ponderato, elenco ordinato di preferenze, dizionario / associazione, ecc. È possibile prendere facoltativamente il numero totale di persone come input, ma non è consentito nessun altro input.

Produzione

L'output può anche essere in qualsiasi formato conveniente; es. elenco di tuple, copertura minima del bordo , una funzione che associa a ciascuna persona il proprio partner, ecc. Si noti che l'unico vincolo è che ogni matrimonio è stabile, non ci sono altri requisiti di ottimalità.

Appunti

  1. Puoi trovare ulteriori informazioni e un O(n^2)algoritmo per risolvere questo problema su Wikipedia o su questo video di Numberphile . Sei libero di usare qualsiasi algoritmo, comunque.
  2. Sono vietate le scappatoie standard .
  3. Questo è . La risposta più breve (in byte) vince.

15
L'attrazione è simmetrica !
Luis Mendo,

5
@LuisMendo Continuo nella leggendaria tradizione dei problemi con le parole non realistiche :)
ngenesi

2
È il giorno di San Valentino (UTC + 8 qui)
busukxuan,

Risposte:


7

Mathematica, 28 byte

On penserebbe, questo è barare. Per me stesso così:

Combinatorica`StableMarriage
  • Deve essere chiamato con le matrici di peso delle preferenze per uomini e donne.
  • Restituisce gli indici diretti per l'accoppiamento.

(Sì Combinatoricaè obsoleto ma costa meno byte di FindIndependentEdgeSet)


Esempio (GoT-like): (Per essere onesti - ho indovinato i pesi ... ma sto bene con i risultati)

inserisci qui la descrizione dell'immagine

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 per sfruttare l'epica libreria di Mathematica con funzioni di golfisti inutili a tutti tranne il codice.
SIGSTACKFAULT

2
Devo prendere l'abitudine di non consentire i built-in anche quando sono sicuro che non esista :)
ngenesi

Non sottovalutare mai gli integrati di Mathematicas; D
Julien Kluge,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.