In [3]:
#http://ja.wikipedia.org/wiki/%E5%AE%89%E5%AE%9A%E7%B5%90%E5%A9%9A%E5%95%8F%E9%A1%8C
#これが入力となる
men = {"こうき":("るい","ひとみ","あい"), "だいき":("るい","あい","ひとみ"), "ともき":("あい","るい","ひとみ")}
women = {"るい":("ともき","こうき","だいき"), "ひとみ":("ともき","こうき","だいき"), "あい":("だいき","ともき","こうき"),}
#目標の出力は、安定マッチング(男女3組のペア)
In [5]:
N=6
M=[[j for j in range(N)] for i in range(N)]
M
Out[5]:
In [17]:
#http://skzy.hatenablog.com/entry/2013/01/26/050459
import random
N=6
M=[[j for j in range(N)] for i in range(N)]
F=[[j for j in range(N)] for i in range(N)]
for j in range(N):
for i in range(N*5):
s=M[j][random.randint(0,N-1)]
M[j].remove(s)
M[j].append(s)
s=F[j][random.randint(0,N-1)]
F[j].remove(s)
F[j].append(s)
print M
print F
single=[ i for i in range(N)]
pair=[ -1 for i in range(N)]
while len(single)>0:
x=single.pop()
y=M[x].pop()
if pair[y]!=-1:
if F[y].index(pair[y]) < F[y].index(x):
single.insert(0,pair[y])
pair[y]=x
else:
single.insert(0,x)
else:
pair[y]=x
print M
print pair
In [13]:
pair=[ -1 for i in range(N)]
pair
Out[13]:
In [18]:
men = {"こうき":("あい","ひとみ","るい"), "だいき":("ひとみ","あい","るい"), "ともき":("ひとみ","るい","あい")}
women = {"るい":("だいき","こうき","ともき"), "ひとみ":("だいき","こうき","ともき"), "あい":("こうき","ともき","だいき"),}
single = ["こうき", "だいき", "ともき"]
pair = [1, 1, 1]
while len(single)>0:
x = single.pop()
y = M[x].pop()
if pair[y] != 1:
if F[y].index(pair[y]) < F[y].index(x):
single.insert(0, pair[y])
pair[y] = x
else:
single.insert(0, x)
else:
pair[y] = x
In [1]:
"""
引用元
http://skzy.hatenablog.com/entry/2013/01/26/050459
http://ja.wikipedia.org/wiki/%E5%AE%89%E5%AE%9A%E7%B5%90%E5%A9%9A%E5%95%8F%E9%A1%8C
http://toyokeizai.net/articles/-/11584?page=2
http://docs.python.jp/2/tutorial/datastructures.html
"""
#M,Fのindexが男性の名前を表し、内包されているリストが選好を表します。
M = [[2,1,0], [1,2,0], [1,0,2]]
F = [[1,0,2], [1,0,2], [0,2,1]]
#Mの名前をただ定義します。
single = [0, 1, 2]
#女性から見た相手のリストを仮に作ります。
pair = [-1, -1, -1]
#アルゴリズムを実行します。
while len(single)>0:
x = single.pop()
y = M[x].pop()
if pair[y] != -1:
if F[y].index(pair[y]) < F[y].index(x):
single.insert(0, pair[y])
pair[y] = x
else:
single.insert(0, x)
else:
pair[y] = x
#ペア成立した組を表示します。(M,,F)の順
for i in pair :
print (pair[i], i)
In [34]:
for i in pair :
print (i, pair[i])
In [32]:
type(len(pair))
Out[32]:
In [33]:
type(range(3))
Out[33]:
In [1]:
testit 時間をはかれる
In [ ]: