经典秘书问题:问题设定、目标、历史背景
好,咱们正式开始聊最优停止理论。
我个人觉得,要理解这个理论,最好的切入点就是那个流传了几十年的经典谜题——秘书问题。你别看它名字叫“秘书问题”,听起来有点老派,但它背后的数学结构,几乎能套用到你生活中所有“选人、选时机、做决策”的场景里。
问题设定:一个简单的面试场景
想象一下,你是一家公司的老板。现在要招聘一名秘书。
规则是这样的:
- 有 N 个候选人,一个接一个来面试。
- 每次面试完一个人,你必须当场决定:录用 还是 拒绝。
- 一旦拒绝,就不能回头再找这个人。
- 你的目标只有一个:选到 最优秀 的那个人。
嗯,这里要注意。你并不知道所有人的整体水平。你只能通过面试,知道“到目前为止,谁是最好的”。
说白了,你就像在黑暗中摸索。你只能比较,不能预知未来。
目标:不是“差不多”,而是“最好”
这个问题的目标非常苛刻。不是“选一个不错的”,也不是“选一个及格的”。
你的目标是:最大化选到最优秀候选人的概率。
我当年第一次看到这个设定时,心里想:“这怎么可能?完全靠运气啊!”
但数学告诉我们,不是的。这里面有一个非常漂亮的策略。
核心目标公式:
P(成功) = 最大化 P(选到第 i 个候选人 | 第 i 个候选人是最优的)
其中,i 是你的决策点。
历史背景:从一道数学谜题到诺贝尔奖
这个问题的历史,其实挺有意思的。
它最早出现在 20 世纪 50 年代。当时一些数学家,比如 Merrill M. Flood,在玩一个叫“相亲问题”的游戏。后来被正式命名为“秘书问题”。
为什么会火起来?
因为它太贴近生活了。你想想看,找工作、找房子、甚至找对象,本质上都是这个问题。
我曾在一次量化团队的面试中,被问到过这个问题。面试官问我:“如果你有 100 个交易策略要测试,但只能上线一个,你怎么选?”
我当时就笑了。这不就是秘书问题吗?
后来,这个理论被数学家们不断扩展。从最初的“只选最好的”,发展到了“选到前几名就行”、“允许反悔几次”等等变种。
它甚至影响了 最优停止理论 的整个框架。这个理论后来被广泛应用在金融、经济学、甚至人工智能领域。
核心逻辑:一张图看懂
为了让你更直观地理解,我画了一张流程图。它展示了秘书问题的决策逻辑。
💡 个人经验: 我在做高频交易策略回测时,经常遇到类似问题。比如有 100 个参数组合,你只能选一个上线。我习惯先用 37% 的数据做观察,剩下的 63% 做决策。这个比例,就是秘书问题给出的最优解。
为什么是 37%?
你可能会问:“那到底观察多少人,才最有可能选到最好的?”
答案是:观察前 37% 的人,然后从第 38% 开始,只要遇到一个比之前所有人都好的,就立刻录用。
这个 37% 是怎么来的?
它来自于数学推导。当 N 很大时,最优策略的阈值趋近于 1/e ≈ 0.3679。
数学结论:
P(成功) ≈ 1/e ≈ 36.79%
也就是说,即使你用了最优策略,也只有大约 37% 的概率选到最优秀的人。
听起来不高?但如果你随机选,概率只有 1/N。当 N=100 时,随机选对的概率只有 1%。
37% 已经是非常大的提升了。
一个简单的代码验证
为了让你更直观地感受,我写了一段 Python 代码。你可以跑一下,看看不同策略的效果。
import random
import math
def secretary_problem(n, strategy='optimal'):
"""模拟秘书问题"""
candidates = list(range(n))
random.shuffle(candidates)
if strategy == 'optimal':
# 观察前 37%
observe_count = int(n / math.e)
best_in_observe = max(candidates[:observe_count]) if observe_count > 0 else -1
# 从第 38% 开始选
for i in range(observe_count, n):
if candidates[i] > best_in_observe:
return candidates[i] == n-1 # 是否选到最好的
return False # 没人可选,只能选最后一个
elif strategy == 'random':
# 随机选一个
pick = random.randint(0, n-1)
return candidates[pick] == n-1
# 测试
n = 100
trials = 10000
optimal_wins = sum(secretary_problem(n, 'optimal') for _ in range(trials))
random_wins = sum(secretary_problem(n, 'random') for _ in range(trials))
print(f"最优策略成功率: {optimal_wins/trials:.2%}")
print(f"随机策略成功率: {random_wins/trials:.2%}")
⚠️ 避坑指南: 我曾经在模拟时犯过一个错误——把“观察阶段”和“决策阶段”搞混了。观察阶段你只能看,不能选。决策阶段你才能选。如果你在观察阶段就选了,那策略就失效了。
另外,这个策略假设你只关心“最好”的那个人。如果你觉得“前几名”也可以接受,那策略会有所不同。我们后面会讲到。
小结一下
经典秘书问题,说白了就是一个“何时出手”的数学问题。
它的核心思想是:先观察,再决策。观察阶段收集信息,决策阶段果断行动。
这个 37% 的阈值,是数学给我们的一个“黄金分割点”。
嗯,今天就先聊到这里。下一节我们会深入探讨这个策略的数学推导,以及它为什么是 1/e 而不是别的数字。
公众号:蓝海资料掘金营,微信deep3321