本日はみなさんがいつも使っている
マッチングアプリの戦略について
考えてみました。

解説動画はこちら



さてどんな戦略を取れば良いかと言うと
その昔、数学者の秋山仁先生が
考え出したものです。

まずルールとしては
・全部で20人の相手とお見合いをする。
・断った相手とは2度と会えない。
・会う順番はランダムに与えられる。
・二股はかけられない。

事後的に順位を付けることができた場合
順位が3番目以上の相手と
結婚するための戦略を考えよ

最初の5人は無条件で見過ごす。
10人目までは、それまでで1番だと思ったら結婚する。
13人目までは、それまでで2番め以上だと思ったら結婚する。
15人目までは、それまでで3番め以上だと思ったら結婚する。
16人目の相手が、それまでで4番め以上だと思ったら結婚する。
17人目の相手が、それまでで5番め以上だと思ったら結婚する。
18人目の相手が、それまでで7番め以上だと思ったら結婚する。
19人目の相手が、それまでで10番め以上だと思ったら結婚する。
20人目の相手とは、ルール上どんな相手でも結婚する。

引用:秋山仁先生「皆殺しの数学」

さてこれを実装して
試してみることにしましょう。




import random
import numpy as np

F = [i+1 for i in range(20)]
random.shuffle(F)

res = []
for j in range(1000):
    F = [i+1 for i in range(20)]
    random.shuffle(F)
    target,num = 0,0
    tmp = []
    for N in range(20):
        if N>=5 and N<10:
            if F[N]<sorted(tmp)[0]:
                target,num = F[N],N+1
                break
        elif N>=10 and N<13:
            if F[N]<sorted(tmp)[1]:
                target,num = F[N],N+1
                break
        elif N>=13 and N<15:
            if F[N]<sorted(tmp)[2]:
                target,num = F[N],N+1
                break
        elif N>=15 and N<16:
            if F[N]<sorted(tmp)[3]:
                target,num = F[N],N+1
                break
        elif N>=16 and N<17:
            if F[N]<sorted(tmp)[4]:
                target,num = F[N],N+1
                break
        elif N>=17 and N<18:
            if F[N]<sorted(tmp)[6]:
                target,num = F[N],N+1
                break
        elif N>=18 and N<19:
            if F[N]<sorted(tmp)[9]:
                target,num = F[N],N+1
                break
        elif N==19:
            target,num = F[N],N+1
        tmp.append(F[N])
    res.append((target,num))

すこーし雑ですが
こんな感じかなーと思います。
間違っていたらすいません。

結果としては
res[0:5]
[(3, 7), (1, 14), (3, 13), (2, 10), (3, 15)]

こんな感じでマッチングした順位と
マッチングした時の番目が計算されます。

さてこれで
どんな感じになったのかを見てみましょう。

ランダム計算しているので
試行するたびに結果は変わりますが

順位の平均は
3位くらいになりました!!!

内訳としては1000回試行した場合

順位01 : 回数286 : 割合28.6%
順位02 : 回数244 : 割合24.4%
順位03 : 回数193 : 割合19.3%
順位04 : 回数112 : 割合11.2%
順位05 : 回数061 : 割合6.1%
順位06 : 回数033 : 割合3.3%
順位07 : 回数033 : 割合3.3%
順位08 : 回数012 : 割合1.2%
順位09 : 回数007 : 割合0.7%
順位10 : 回数004 : 割合0.4%
順位11 : 回数007 : 割合0.7%
順位13 : 回数001 : 割合0.1%
順位14 : 回数001 : 割合0.1%
順位15 : 回数001 : 割合0.1%
順位16 : 回数002 : 割合0.2%
順位17 : 回数001 : 割合0.1%
順位18 : 回数001 : 割合0.1%
順位19 : 回数001 : 割合0.1%

このような順位の人と出会えて
マッチングできたことになりました。

何人目の人で出会えたかの平均は
10 - 11 人くらいに落ち着きました。

と言うことで戦略としては
秋山先生の戦略をそのまま用いて

最初の5人は無条件で見過ごす
10人目まではそれまでで1番ならマッチング
13人目まではそれまでで2番目以上ならマッチング

と言う感じですね。
候補が20人いるとして
ランダムに出会うとしたら
大体13人目までで良い人には
出会えていそうな感じです。

ただし、ここには大きな落とし穴があり
数学的に順位が高めの人と出会えて
無条件で結婚できるとされているので

出会えてもマッチングできるかどうか
と言う部分が抜けています。

まあ
イケメンか金持ちに限る

と言うのがネックでしょうねーー

まあ、より良い相手を見つけるには
良い戦略ではあると思います。

皆様も是非使ってみて下さい
それでは。