520 我用算法幫女友的網紅閨蜜選老公

我用算法幫女朋友的閨蜜選男友

用算法拯救她閨蜜

在這裏插入圖片描述
下班前收到女友的電話,說晚上要和她的網紅閨蜜一起吃個飯。
“what?這不是鴻門宴吧?”
“你想什麼呢?她最近處的一個男朋友像她求婚了,不知道要不要答應。你不是搞數據分析的嗎?想讓你幫忙理性分析一下!”
要說女朋友的閨蜜,條件是真不錯,中產家庭,高等學歷,當然最關鍵的顏值很能打,要不然也不能當網紅。可惜遇人不淑,有幾段失敗的感情經歷,也算是受了情傷。自古美女遇渣男,也算是常態。是時候用算法來拯救妹子了。

本質上是最優解問題

如果你讀過《Algorithms to live by》就知道本質上這就是一個“最優停止問題”,答案很簡單,就是37% (1/e1/e)。
我們來把這個問題說的更清晰一點:
問題描述:
我們假設網紅妹子在一生中有可能會遇到100個求婚的男人,妹子要答應第幾個男人才是最優的呢?

限制條件:

  • 男人會一個一個來求婚。
  • 妹子只能對提出過求婚請求的男人來進行打分比較。(也就是在未來有可能求婚的男人你沒有辦法進行打分,因爲還沒遇到)。
  • 已經被拒絕的求婚者,就永遠不再考慮了。

爲此,妹子可以這樣做:

  • 設立觀察期,在觀察期內對所有的求婚者只打分不接受求婚
  • 選出觀察期內的最高得分
  • 對接下來的每一個求婚者進行打分,並與觀察期內的最高得分進行比較,如果大於等於爲真,則接受求婚停止求解,否則拒絕求婚並比較下一個求婚者。

這個觀察期的停止最優解就是37%,也就是你觀察100 * 37% = 37,妹子只考察前37個求婚者,只打分不接受求婚。從第38個人開始,如果得分大於等於前37個人中的最大值,就接受她的求婚。
現在頭疼的是如何把妹子講明白呢?

用平行宇宙解釋

我們遇到這類問題之所以頭疼是因爲我們的人生只有一次。但如果這個世界存在平行宇宙,擁有多個平行宇宙的你,這個問題是不是就好解決了?
在這裏插入圖片描述
想象一下你擁有了《十二大戰》中老鼠的異能。當然你沒有也沒有關係,你可以用計算機來幫你實現。

np.random.seed(100)
lifes = np.random.uniform(0,1, size=(100000, 100))

這樣你就產生了100000個平行宇宙,在每個宇宙中妹子會遇到100個求婚者,每個求婚者的得分是隨機生成的,範圍爲0~1

蒙特卡洛算法求解

是時候放大招了,我們要在100000個平行宇宙,求最優解了,這個時候咱們就不用什麼數學證明了,直接用蒙特卡洛算法的思路去解決就好了。

蒙特卡洛算法就是通過構建大量的隨機值去模擬現實中的數據,並猜測最優解的過程。

我們先來完成核心的check函數。
把每一個平行宇宙的數據傳給check,如果我們選到了最大值返回True,否則返回False。

def check(life, stop):
    max_in_saw = max(life[:stop])
    select = 0
    for i in range(stop, len(life)):
        if life[i] >= max_in_saw:
            select = life[i]
            break
    maxall = max(life)
    if select == maxall:
        return True
    else:
        return False

接下來就遍歷100000個平行宇宙,在每個宇宙去,去嘗試不同的stop值,也就是設置不同的觀察期。

success_count = np.zeros(100)
for stop in range(1, 100):
    for life in lifes:
        if check(life, stop):
            success_count[stop] += 1

輸出success_count數組的最大值,正好是37。這意味着你用這個停止條件,獲得的最大值最多(也就是挑選到合適人選的次數)。

print(success_count.argmax())
#輸出值爲37

當然如果你的平行宇宙個數和求婚者個數和我不一樣,結果可能會有差距,但應該是在37%的位置左右。

做一個可視化,讓結果更好觀察

x_axis = np.arange(1,100)
y_axis = success_count[1:100]
plt.plot(x_axis, y_axis, 'ro-', linewidth=2.0)
plt.show()

結果可視化

所有的前任只是前戲

這種在觀察階段冒着與優秀的人選失之交臂的策略,到底值不值呢?
我們簡單的思考一下,在100箇中候選者中,我們隨機選一個人,他是最優解的概率是1%。
而在我們剛纔示例的100000個平行宇宙中,如果我們使用stop爲37的策略,我們將在37131.0個平行宇宙中獲得最優解。
在就把獲得最優解的概率提高到了37.131%。這真是巨大的提升,這就是算法的力量。
所有的前任只是前戲,只有最優解纔是高潮!**

每天只想和你做四件事——一日三餐

晚餐吃的很愉快,席間好好的給女友的閨蜜普及了一下"37%"最優解。
"你看假設你打算38歲之前把自己嫁出去,從18-38這20年間,你每年遇到一個求婚者也就是20個!"
你的觀察期最優解爲20*37%= 7.4 也就是你先觀察7個求婚者,你現在男朋友正好是第8個,從你描述你對他的評價比之前那7個人都高。所以從概率上來說,你選擇他是你的最優解!"

圖文並茂很是讓女友的閨蜜信服,收穫了無數崇拜的小星星!

晚上回家,女友問我她是我的第幾個女朋友,是不是最優解?
我肯定的回答,你就是我的最優解。
我計劃38歲結婚,從18~38,這20年間我在28歲遇到你,你不是我的最優解,誰是?
以後:“每天只想和你做四件事——一日三餐”
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章