---
title: 【數學理論】 02. 如何利用數學策略找到真愛 (下) — 最佳停止點理論 (Optimal Stopping Theory)
tags:
- 【數學理論】
url: https://hackmd.io/e1f_0iYZQauCW0_3aHA_3A
lastSync: 2025-05-25T08:45:19.364Z
hackmd:
url: https://hackmd.io/e1f_0iYZQauCW0_3aHA_3A
title: 【數學理論】 02. 如何利用數學策略找到真愛 (下) — 最佳停止點理論 (Optimal Stopping Theory)
lastSync: 2025-05-25T08:51:47.292Z
---
如何利用數學策略找到真愛 (下)
===
<font size=4><font color=gray>最佳停止點理論 (Optimal Stopping Theory)</font><br></font><br>
---
<!-- 20250525 -->
上一篇我已經詳細介紹了最佳停止點問題以及自然常數 $e$ ,本篇就來詳細講解**最佳停止點理論 (Optimal stopping theory)**
<br>
我相信有些人可能等得不耐煩了,所以我先說這個策略,以撿石頭為例。
<br>
>[!Tip] **策略**
>假設總共有 $n$ 顆石頭,先看前面 $k$ 顆石頭,並且將這 $k$ 顆石頭中最大顆的大小記住,接著從第 $k+1$ 顆開始,只要找到比 $k$ 顆石頭中最大顆的還大,那就就撿起來,這樣你撿到最大顆的機率就會是 $37\%$。
<br>
下面讓我來分析一下。
<br>
## 策略分析
按照上面這個策略,我們設定 $n=10, \ k=5$ 也就是總共有 $10$ 顆石頭,**先看前面五顆石頭**來跟**後面五顆石頭**比較大小。
<br>
接下來會有幾種情況。
<br>
<font size=4>**情況一、<font color=red>第六顆</font>就是最大顆的石頭。**</font><br>
這樣撿到最大顆的機率就會是 $\dfrac{1}{10}$
<br>
<img src="https://raw.githubusercontent.com/lewisjjj800soic/HackMD-images-backup/main/Mathematic-Theorems/02/01.png" alt="圖片描述" style="display: block; margin: 0 auto;" width="600">
<br>
<br>
<font size=4>**情況二、<font color=red>第七顆</font>才是最大顆的石頭。**</font><br>
那就代表,在前面六顆當中最大顆的<font color=blue>(藍色石頭)</font>只能在**前五顆**,不能在<font color=blue>**第六顆**</font>,否則你看完前面五顆,看到第六顆都比前面五顆大,你就會撿走前六顆中最大的<font color=blue>**第六顆**</font>,而不是這十顆裡面最大顆的<font color=red>**第七顆**</font>。
<br>
<img src="https://raw.githubusercontent.com/lewisjjj800soic/HackMD-images-backup/main/Mathematic-Theorems/02/02.png" alt="圖片描述" style="display: block; margin: 0 auto;" width="600">
<br>
這樣撿到最大顆的機率就會是 $\dfrac{1}{10}\times \dfrac{5}{6}$
<br>
<font size=4>**情況三、<font color=red>第八顆</font>才是最大顆的石頭。**</font><br>
那就代表,在前面七顆當中最大顆的只能在**前五顆**,不能在<font color=blue>**第六顆**</font>或是<font color=blue>**第七顆**</font>,否則你看完前面五顆,看到<font color=blue>**第六顆**</font>或<font color=blue>**第七顆**</font>都比前面五顆大,你就會撿走前面七顆當中最大的,而不是這十顆裡面最大顆的<font color=red>**第八顆**</font>。
<br>
<img src="https://raw.githubusercontent.com/lewisjjj800soic/HackMD-images-backup/main/Mathematic-Theorems/02/03.png" alt="圖片描述" style="display: block; margin: 0 auto;" width="600">
<br>
這樣撿到最大顆的機率就會是 $\dfrac{1}{10}\times \dfrac{5}{7}$
<br>
<font size=4>**情況四、<font color=red>第九顆</font>才是最大顆的石頭。**</font><br>
那就代表,在前面八顆當中最大顆的只能在**前五顆**,不能在<font color=blue>**第六顆**</font>、<font color=blue>**第七顆**</font>或是<font color=blue>**第八顆**</font>,否則你看完前面五顆,看到<font color=blue>**第六顆**</font>、<font color=blue>**第七顆**</font>或是<font color=blue>**第八顆**</font>都比前面五顆大,你就會撿走前面八顆當中最大的,而不是這十顆裡面最大顆的<font color=red>**第九顆**</font>。
<br>
<img src="https://raw.githubusercontent.com/lewisjjj800soic/HackMD-images-backup/main/Mathematic-Theorems/02/04.png" alt="圖片描述" style="display: block; margin: 0 auto;" width="600">
<br>
這樣撿到最大顆的機率就會是 $\dfrac{1}{10}\times \dfrac{5}{8}$
<br>
<font size=4>**情況五、<font color=red>**第十顆**</font>才是最大顆的石頭。**</font><br>
那就代表,在前面九顆當中最大顆的只能在**前五顆**,不能在<font color=blue>**第六顆**</font>、<font color=blue>**第七顆**</font>、<font color=blue>**第八顆**</font>或是<font color=blue>**第九顆**</font>,否則你看完前面五顆,看到<font color=blue>**第六顆**</font>、<font color=blue>**第七顆**</font>、<font color=blue>**第八顆**</font>或是<font color=blue>**第九顆**</font>都比前面五顆大,你就會撿走前面九顆當中最大的,而不是這十顆裡面最大顆的<font color=red>**第十顆**</font>。
<br>
<img src="https://raw.githubusercontent.com/lewisjjj800soic/HackMD-images-backup/main/Mathematic-Theorems/02/05.png" alt="圖片描述" style="display: block; margin: 0 auto;" width="600">
<br>
這樣撿到最大顆的機率就會是 $\dfrac{1}{10}\times \dfrac{5}{9}$
<br>
把這五種情況的機率都加起來就會得到
\begin{aligned}
P&=\dfrac{1}{10}+\dfrac{1}{10}\times \dfrac{5}{6}+\dfrac{1}{10}\times \dfrac{5}{7}+\dfrac{1}{10}\times \dfrac{5}{8}+\dfrac{1}{10}\times \dfrac{5}{9}\\
&= \dfrac{1}{10}\times (1+\dfrac{5}{6}+\dfrac{5}{7}+\dfrac{5}{8}+\dfrac{5}{9})\\
&\approx 0.37281746031
\end{aligned}
假如你從這 $10$ 顆石頭裡面選一顆,選到最大顆的機率只有 $\dfrac{1}{10}$ ,利用這種策略你可以將機率提高到 $37 \%$
<br>
你可能會問:**「一條路上可能不只有 $10$ 顆石頭,只要路夠長,可能有趨近於無限多顆嗎?」**
<br>
沒錯,所以我們現在將情況拓展到無限多種,來進行**最佳停止點理論的數學證明**。
<br>
## 數學證明
先來回顧一下最佳停止點理論在無限多種選項時的策略:
<br>
>[!Tip] **策略**
>令撿到最大顆的機率為 $P(k)$ ,總共有 $n \to \infty$ 顆石頭,先看前面 $k$ 顆石頭。
<br>
這樣 $P(k)$ 就會是
\begin{aligned}
P(k) &=(\dfrac{k}{n}\times (\dfrac{1}{k}+\dfrac{1}{k+1}+\dfrac{1}{k+2}+...+\dfrac{1}{n-1}))\\
&= (\dfrac{k}{n}\times \displaystyle\sum_{m=k}^{n-1}\dfrac{1}{m})
\end{aligned}
<br>
接下來我們就針對上面的 $P(k)$ 來進行證明。
---
### 1. 級數近似
<br>
首先,我們把 $\displaystyle\lim_{n\to\infty}\displaystyle\sum_{m=k}^{n-1}\dfrac{1}{m}$ 稍微改寫如下:
\begin{aligned}
\displaystyle\lim_{n\to\infty}\displaystyle\sum_{m=k}^{n-1}\dfrac{1}{m}&=\displaystyle\lim_{n\to\infty}\displaystyle\sum_{m=k+1}^{n}\dfrac{1}{m-1}
\end{aligned}
<br>
此時由於 $n \rightarrow \infty$ ,因此以下兩個極限相等。
\begin{aligned}
\displaystyle\lim_{n\to\infty}\displaystyle\sum_{m=k+1}^{n}\dfrac{1}{m-1}&=\displaystyle\lim_{n\to\infty}\displaystyle\sum_{m=k+1}^{n}\dfrac{1}{m}
\end{aligned}
<br>
所以我們可以得出以下這個結果:
\begin{aligned}
\displaystyle\lim_{n\to\infty}\displaystyle\sum_{m=k+1}^{n}\dfrac{1}{m-1}&=\displaystyle\lim_{n\to\infty}\displaystyle\sum_{m=k+1}^{n}\dfrac{1}{m}
\end{aligned}
> 只有在 $n \rightarrow \infty$ 時,上面這個等式才會成立,否則令 $k=1$、$n=5$ 試試看,會發現兩個極限結果不相等。
<br>
接著再稍微改寫一下
\begin{aligned}
\displaystyle\lim_{n\to\infty}\displaystyle\sum_{m=k+1}^{n}\dfrac{1}{m}&=\displaystyle\lim_{n\to\infty}\displaystyle\sum_{m=k+1}^{n}\dfrac{n}{m}\cdot\dfrac{1-0}{n}
\end{aligned}
<br>
眼尖的人大概發現了,上面這個形式跟黎曼和的極限,也就是 **黎曼積分(Riemann integral)** 。
<br>
> [!Note] **黎曼積分(Riemann integral)**
>
> $$
> \displaystyle\lim_{n\to\infty}\displaystyle\sum_{m=1}^{n}f(x^*_m) \cdot \dfrac{b-a}{n}=\int_{a}^{b}f(x)dx
> $$
> 上面符號的涵義後面會說明
<br>
但其實比較一下,會發現我們推導出來的結果 $\displaystyle\lim_{n\to\infty}\displaystyle\sum_{m=k+1}^{n}\dfrac{n}{m}\cdot\dfrac{1-0}{n}$ 當中是 $m=k+1$ 而非黎曼積分當中的 $m=1$ 。
<br>
**接下來就是我覺得最絕妙的地方了。**
<br>
---
### 2. 黎曼積分小區間的縮減與上下限的變化
<br>
$\displaystyle\lim_{n\to\infty}\displaystyle\sum_{m=k+1}^{n}\dfrac{n}{m}\cdot\dfrac{1-0}{n}$ 就不是黎曼積分了嗎?其實還是,只是上下限改變了,讓我用數學的方式來證明:
<br>
我們考慮一個函數 $f(x)$ 在區間 $[a,b]$ 的黎曼積分,並將區間 $[a,b]$ 劃分成 $n$ 等份,這樣就有 $n$ 個小區間,而每個小區間的長度為 $\Delta x=\dfrac{b-a}{n}$
<br>
接下來我們定義 $x_m=a+m\Delta x$ 是小區間的「端點」,而 $x^*_m$ 就是小區間內的一個點,這樣我們就有以下這個黎曼和。
\begin{aligned}
\Phi_n&=\displaystyle\sum_{m=1}^{n}f(x^*_m) \Delta x
\end{aligned}
<br>
此時當我們將 $n$ 個小區間中前 $k$ 個拿走,這樣這個黎曼和 $\Phi_n$ 就會發生變化。
<br>
首先這樣黎曼和 $\Phi_n$ 的區間 $[a,b]$ 就會變成 $[a+k\Delta x,b]$,因為原本有 $n$ 個小區間,現在只剩下 $n-k$ 個小區間,區間的起點發生平移了,所以原始的黎曼和 $\Phi_n$ 就會發生以下變化:
:::info
- 區間起點:$a\longrightarrow a'=a+k\Delta x$
- 小區間的數量:$n\longrightarrow n-k$
- 小區間的長度:和原本一樣是$\Delta x$
:::
<br>
因此新的黎曼和就會變成
\begin{aligned}
\Phi_{n-k}&=\displaystyle\sum_{m=k+1}^{n}f(x^*_m) \Delta x
\end{aligned}
<br>
然而只要進行轉換,令 $j=m-k$ ,新的黎曼和就能寫成
\begin{aligned}
\Phi_{n-k}&=\displaystyle\sum_{j=1}^{n-k}f(x^*_{j+k}) \Delta x
\end{aligned}
其實跟我們熟悉的黎曼和是一樣的。
<br>
所以將黎曼和推向極限時,原本的黎曼和 $\Phi_n$ 就能寫成:
\begin{aligned}
\displaystyle\lim_{n\to\infty}\Phi_n&=\displaystyle\lim_{n\to\infty}\displaystyle\sum_{m=1}^{n}f(x^*_m) \cdot \dfrac{b-a}{n}\\&=\int_{a}^{b}f(x)dx
\end{aligned}
<br>
前 $k$ 個小區間移走的黎曼和 $\Phi_{n-k}$ 由於起點 $a$ 平移成 $a+k\Delta x$ ,所以就會變成
\begin{aligned}
\displaystyle\lim_{n\to\infty}\Phi_{n-k}&=\displaystyle\lim_{n\to\infty}\displaystyle\sum_{m=k+1}^{n}f(x^*_{j+k}) \cdot \dfrac{b-a}{n}\\&=\int_{a+k\Delta x}^{b}f(x)dx
\end{aligned}
<br>
因此回過頭來看到最一開始的黎曼積分$\displaystyle\lim_{n\to\infty}\displaystyle\sum_{m=k+1}^{n}\dfrac{n}{m}\cdot\dfrac{1-0}{n}$,再跟上面的式子比較一下,我們可以發現:
- $a=0$
- $b=1$
- $\Delta x=\dfrac{1}{n}$
- $f(y)=\dfrac{1}{y}$
<br>
最後再加上我們最一開始定義的 $\dfrac{k}{n}=t$ ,黎曼積分 $\displaystyle\lim_{n\to\infty}\Phi_{n-k}$ 就可以寫成:
\begin{aligned}
\displaystyle\lim_{n\to\infty}\Phi_{n-k}&=\displaystyle\lim_{n\to\infty}\displaystyle\sum_{m=k+1}^{n}f(x^*_{j+k}) \cdot \dfrac{b-a}{n}\\&=\int_{a+k\Delta x}^{b}f(x)dx\\&=\int_{t}^{1}\dfrac{1}{y}dy
\end{aligned}
>[!NOTE] 註
> 上面提到的 $y$ 只是啞變數 (dummy variable)
<br>
---
### 3. 積分計算
將級數近似成積分的工作完成了,接下來計算積分
\begin{aligned}
\int_{t}^{1}\dfrac{1}{y}dy&=\ln(1)-\ln(t)\\
&=\ln(\dfrac{1}{t})
\end{aligned}
<br>
因為 $t=\dfrac{k}{n}$ , $P(k)$ 就會等於
\begin{aligned}
P(k)&=\dfrac{k}{n}\cdot \ln(\dfrac{1}{t})\\
&=t\cdot \ln(\dfrac{1}{t})\\
&=-t\cdot \ln(t)
\end{aligned}
<br>
最後我要求出 $P(k)$ 的極值,只要令 $\dfrac{dP(k)}{dt}=0$ 進行計算即可。
<br>
因為 $P(k)=-t\cdot \ln(t)$ 且 $\dfrac{dP(k)}{dt}=0$,所以我們可以得到以下等式:
<br>
$$
\dfrac{d(-t\cdot \ln(t))}{dt}=0
$$
<br>
$-t\cdot \ln(t)$ 的微分我們利用微分的乘積法則可得:
<br>
$$
-1- \ln(t)=0
$$
<br>
此時因為 $-1- \ln(t)=0$,因此 $\ln(t)=-1$,所以我們可以得到:
<br>
$$
t=1/e \approx0.368=36.8\%
$$
---
### 4. 證明結果
我們復盤一下。
<br>
>[!Tip] **策略**
>**撿到最大顆的機率為 $P(k)$ ,總共有 $n$ 顆石頭,先看前面 $k$ 顆石頭。**
<br>
所以 $t=\dfrac{k}{n}$ 代表著:
<br>
$\dfrac{k}{n}=\dfrac{先看的石頭數量}{總共的石頭數量}=$ 前 $t\times 100\%$ 的石頭
<br>
而 $t$ 被我們計算出來的結果是 $t=1/e\approx36.8\%$ ,所以當 $t=\dfrac{k}{n}=1/e\approx36.8\%$ 代表我先看前 $36.8\%$ 的石頭,記住這些石頭裡面最大顆的。
<br>
而當 $t=\dfrac{k}{n}=1/e\approx36.8\%$ 時
\begin{aligned}
P(k)&=-t\cdot ln(t)\\&=-1/e\cdot ln(1/e)\\
&=-1/e\cdot (-1)\\
&=1/e\approx36.8\%
\end{aligned}
剛好也是 $36.8\%$
<br>
所以後面遇到比前 $36.8\%$ 的石頭還大顆的就撿起來,這樣你撿到最大顆的機率就會是 $P(k)=1/e\approx36.8\%$
<br>
---
## 結論
所以,講了這麼多數學的東西,**最佳停止點理論 (Optimal Stopping Theory)** 就是:
<br>
>[!Important] **最佳停止點理論 (Optimal Stopping Theory)**
>假設總共有 $n$ 個選擇,先看前 $k$ 個,只看不選,並且將這 $k$ 個選擇當中最好的選擇記住,接著從第 $k+1$ 個選擇開始,只要找到比前 $k$ 個還要好的,那就選擇它,這樣你選到最好的機率就會是 $37\%$。
<br>
我們可以利用`python`寫一個程式,來呈現可視化的結果:
:::spoiler 點擊以查看程式碼
```python=
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
def calculate_optimal_probability(n):
"""計算在n個候選人中使用最優策略的成功概率"""
if n <= 1:
return 1
optimal_k = int(n/np.e) # 最優停止點
prob = 0
for i in range(optimal_k + 1, n + 1):
prob += (optimal_k / (i - 1)) # 在位置i選中最佳候選人的概率
prob /= n
return prob
def get_strategy_success_rate(n, k):
"""計算使用k作為停止點的策略成功率
n: 總候選人數
k: 觀察k個候選人後開始考慮聘用
"""
if k >= n:
return 0
prob = 0
for i in range(k + 1, n + 1):
prob += (k / (i - 1))
prob /= n
return prob
# 創建圖表
plt.style.use('seaborn-v0_8')
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10))
fig.suptitle('The Secretary Problem: Analysis of Optimal Stopping Strategy', fontsize=14, pad=20)
# 第一個子圖:不同n值的最優概率
n_values = range(1, 101)
optimal_probs = [calculate_optimal_probability(n) * 100 for n in n_values]
ax1.plot(n_values, optimal_probs, 'b-', linewidth=2)
ax1.set_xlabel('Total Number of Candidates')
ax1.set_ylabel('Success Rate (%)')
ax1.set_title('Optimal Strategy Success Rate vs. Number of Candidates')
ax1.grid(True, linestyle='--', alpha=0.7)
# 標記一些特殊點
special_ns = [10, 20, 50, 100]
for n in special_ns:
prob = calculate_optimal_probability(n) * 100
ax1.plot(n, prob, 'ro')
ax1.annotate(f'n={n}\n{prob:.1f}%',
xy=(n, prob),
xytext=(10, 10),
textcoords='offset points',
bbox=dict(boxstyle='round,pad=0.5', fc='white', ec='gray', alpha=0.7))
# 第二個子圖:固定n值下,不同k值的成功率
n_fixed = 100 # 固定候選人數為100
k_values = range(1, n_fixed)
success_rates = [get_strategy_success_rate(n_fixed, k) * 100 for k in k_values]
ax2.plot(k_values, success_rates, 'g-', linewidth=2)
ax2.set_xlabel('Observation Window (k)')
ax2.set_ylabel('Success Rate (%)')
ax2.set_title(f'Success Rate vs. Observation Window (n={n_fixed})')
ax2.grid(True, linestyle='--', alpha=0.7)
# 標記最優k值
optimal_k = int(n_fixed/np.e)
optimal_rate = get_strategy_success_rate(n_fixed, optimal_k) * 100
ax2.plot(optimal_k, optimal_rate, 'ro')
ax2.annotate(f'Optimal k={optimal_k}\n{optimal_rate:.1f}%',
xy=(optimal_k, optimal_rate),
xytext=(10, 10),
textcoords='offset points',
bbox=dict(boxstyle='round,pad=0.5', fc='white', ec='gray', alpha=0.7))
plt.tight_layout()
# 保存圖表
plt.savefig('secretary_problem.png', dpi=300, bbox_inches='tight')
# 顯示圖表
plt.show()
```
:::
由上面的程式可以輸出以下結果:
<br>
<img src="https://raw.githubusercontent.com/lewisjjj800soic/HackMD-images-backup/main/Mathematic-Theorems/02/06.gif" alt="圖片描述" style="display: block; margin: 0 auto;" width="600">
<br>
由上面這張圖分成上下兩個部分,可以看到:
**上半圖**:展示了隨著候選人總數 $n$ 的增加,使用最佳停止策略的成功率變化。
- 橫軸:候選人總數
- 縱軸:成功選中最佳候選人的概率
- <font color=red>**紅點**</font>標記了最後圖形收斂的 $n$ 值和對應的成功率
**下半圖**:展示了在固定候選人數 $n=100$ 的情況下,不同 $k$ 的成功率
- 橫軸:不同 $k$ 值
- 縱軸:成功率
- <font color=red>**紅點**</font>標記了最優的 $k=n/e$ 值和對應的成功率。
---
最後我們拿生活當中的例子來比喻一下:
<br>
如果說你今天要找**租屋**,預計要找100間,先看前37間,只看不選,將這37間當中最好的記住,接著從第38間開始,只要找到比前37間還好的那就選,這樣選到最好的那間機率就會是 $37\%$。
<br>
又或者是:
如果說你今天要找**男女朋友**,預計要找100位,先看前37位,只看不選,將這37位當中最好的記住,接著從第38位開始,只要找到比前37位還好的那就選,這樣選到最好的那位機率就會是 $37\%$。
<br>
又或者:
如果說你在夜深人靜的時候點開某種網站想看**學術影片**,預計要找100頁,先看前37頁,只看不選,將這37頁當中最好的記住,接著從第38頁開始,只要找到比前37頁還好的那就選,這樣選到最好的那頁機率就會是 $37\%$。
<br>
再不然就是:
如果說你今天要**跟朋友幹架**,預計要被打100拳,那你就先被揍37拳,只被揍不躲,將這37拳當中最痛的那拳記住,接著從第38拳開始,你醒來就會在醫院了。(本專欄不支持與提倡暴力)
<br>
你可能會覺得說:**欸不是,無論是找房子、交男女朋友,都不適用於這個方法,不要說100個,可能連10個都懶了,而且好壞跟美醜都無法量化。**
<br>
確實,這篇專欄所提到的都只是 **「策略」** 而非 **「方法」**,如果是抱持著必能選到最好的選擇而來,那肯定會失望,畢竟這個策略並非那麼的 **「實際」**。
<br>
你可能聽過一句話:**「小孩子才做選擇,大人全都要!」**,但**大人才更應該做選擇,學會選擇就是在學會放棄,選擇比努力重要,但是放棄比選擇更重要**。
<br>
***「選擇,就是承擔。」***
<br>
如果你在人生的交叉路口當中選擇,或是已經選了卻反悔了,那有一句話是這麼說的:
<br>
<font size=5><font color=red>**擇你所愛,愛你所選。**</font><br></font><br>
放下執念,生活會更美好。
<br>
我是Lewis,我們[**下一篇**](https://hackmd.io/@lewisjjj800/r1yyOQgfxx)專欄見!