经典秘书问题:问题设定、目标、历史背景

好,咱们正式开始聊最优停止理论。

我个人觉得,要理解这个理论,最好的切入点就是那个流传了几十年的经典谜题——秘书问题。你别看它名字叫“秘书问题”,听起来有点老派,但它背后的数学结构,几乎能套用到你生活中所有“选人、选时机、做决策”的场景里。

问题设定:一个简单的面试场景

想象一下,你是一家公司的老板。现在要招聘一名秘书。

规则是这样的:

  • N 个候选人,一个接一个来面试。
  • 每次面试完一个人,你必须当场决定:录用 还是 拒绝
  • 一旦拒绝,就不能回头再找这个人。
  • 你的目标只有一个:选到 最优秀 的那个人。

嗯,这里要注意。你并不知道所有人的整体水平。你只能通过面试,知道“到目前为止,谁是最好的”。

说白了,你就像在黑暗中摸索。你只能比较,不能预知未来。

目标:不是“差不多”,而是“最好”

这个问题的目标非常苛刻。不是“选一个不错的”,也不是“选一个及格的”。

你的目标是:最大化选到最优秀候选人的概率

我当年第一次看到这个设定时,心里想:“这怎么可能?完全靠运气啊!”

但数学告诉我们,不是的。这里面有一个非常漂亮的策略。

核心目标公式:

P(成功) = 最大化 P(选到第 i 个候选人 | 第 i 个候选人是最优的)

其中,i 是你的决策点。

历史背景:从一道数学谜题到诺贝尔奖

这个问题的历史,其实挺有意思的。

它最早出现在 20 世纪 50 年代。当时一些数学家,比如 Merrill M. Flood,在玩一个叫“相亲问题”的游戏。后来被正式命名为“秘书问题”。

为什么会火起来?

因为它太贴近生活了。你想想看,找工作、找房子、甚至找对象,本质上都是这个问题。

我曾在一次量化团队的面试中,被问到过这个问题。面试官问我:“如果你有 100 个交易策略要测试,但只能上线一个,你怎么选?”

我当时就笑了。这不就是秘书问题吗?

后来,这个理论被数学家们不断扩展。从最初的“只选最好的”,发展到了“选到前几名就行”、“允许反悔几次”等等变种。

它甚至影响了 最优停止理论 的整个框架。这个理论后来被广泛应用在金融、经济学、甚至人工智能领域。

核心逻辑:一张图看懂

为了让你更直观地理解,我画了一张流程图。它展示了秘书问题的决策逻辑。

秘书问题决策流程图 开始面试 N 人 是否在“观察阶段”? 继续面试 记录当前最佳 进入决策 比之前所有人都好? (是当前最佳) 录用! 结束

💡 个人经验: 我在做高频交易策略回测时,经常遇到类似问题。比如有 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