安定した結婚問題


12

バックグラウンド

2*n結婚する人がいると仮定し、さらに、各人が次nのような制約の下で正確に他の人に惹かれると仮定します。

  1. 引力は対称的です。すなわち人Aが人に引き付けられるならば、人はBBに引き付けられAます。
  2. 魅力は反推移的です。人ならば、すなわちA人がB一人一人に魅了されC、その後、人Aと人がBお互いに惹かれていません。

したがって、アトラクションのネットワークは(無向)完全な2部グラフを 形成しますKn,n。また、各人が自分が惹かれている人をランク付けしたと仮定します。これらは、グラフのエッジの重みとして表されます。

結婚はペアリングであるとお互いに魅了されています。各結婚の1人がパートナーと離婚し、お互いに結婚する可能性がある別の結婚がある場合、結婚は不安定です。(A,B)AB

ゴール

あなたの仕事は、各人の好みを入力として、各結婚が安定するように各人の結婚を出力する完全なプログラムまたは機能を書くことです。

入力

入力は任意の便利な形式にすることができます。たとえば、重み付きグラフ、設定の順序付きリスト、辞書/関連付けなど。オプションで、総人数を入力として使用できますが、他の入力は許可されません。

出力

出力は任意の便利な形式にすることもできます。たとえば、タプルのリスト、最小エッジカバー、各人にパートナーを関連付ける機能など。唯一の制約は、各結婚が安定していることであり、他の最適化要件はないことに注意してください。

ノート

  1. ウィキペディアまたはこのNumberphileビデオで、このO(n^2)問題を解決するための詳細情報とアルゴリズムを見つけることができます。ただし、任意のアルゴリズムを自由に使用できます。
  2. 標準的な抜け穴は禁止されています。
  3. これはです。最短回答(バイト単位)が優先されます。

15
アトラクションは対称的です!
ルイスメンドー

5
@LuisMendo私は非現実的な単語の問題の
名高い

2
それはバレンタインデーです(ここではUTC + 8)
busukxuan

回答:


7

Mathematica、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
Mathematicaのエピックなライブラリを活用することで、誰もが使用できないコードゴルファー関数を利用できます。
SIGSTACKFAULT

2
ビルトインが存在しないと確信している場合でも、ビルトインを拒否する習慣を身に
付ける必要

Mathematicaの組み込みを過小評価しないでください; D
Julien Kluge
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.