最优停止策略
·
xiebro
37%法则的智慧
当你面对一连串的选择(比如租房、招聘、甚至约会),如何在不回头的情况下最大化选到最佳选项的概率?最优停止理论给出了一个优雅的解决方案——37%法则。
核心思想
- 观察期:拒绝前37%的选项(仅用于建立标准)。
- 选择期:在剩下的选项中,选择第一个比观察期内所有选项都好的。
- 如果后续没有更好的,则必须接受最后一个。
为什么是37%?
数学证明,当选项数量足够大时,37%(即1/e)是最优观察比例,并且能让你以约37%的概率选到最佳选项。这一策略平衡了探索(收集信息)和利用(做出选择),适用于许多现实决策场景。
蒙特卡洛-模拟验证
library(tidyverse)
library(scales)
library(furrr)
set.seed(42)
plan(multisession, workers = availableCores() - 1)
# 创建规则函数 -----------------------------------------------------------------
# 模拟1次策略执行的过程
# 参数:
# glb_nums: 全局可选项
# obs_ratio: 观察期比例(例如0.37)
# 返回:
# boll, 是否选到全局最优
rule_func <- function(glb_opts, obs_ratio) {
n <- length(glb_opts)
# 全局最优选项
glb_best <- max(glb_opts)
# “观察期”最优选项
obs_n <- floor(n * obs_ratio)
obs_opts <- glb_opts[1:obs_n]
obs_best <- max(obs_opts)
# “选择期”选择结果
slct_opts <- glb_opts[(obs_n + 1):n]
if (obs_best == glb_best) {
# 当全局最优结果已在“观察期”出现,则接受“选择期”的最后1个选项
selected <- tail(slct_opts, 1)
}else{
# 否则,在“选择期”寻找第一个比“观察期最优”更好的值
for (i in seq_along(slct_opts)) {
if (slct_opts[i] > obs_best) {
selected <- slct_opts[i]
break
}
}
}
# 返回是否选择了全局最优
selected == glb_best
}
# 执行模拟验证 -----------------------------------------------------------------
step <- 0.01 # 模拟“观察期”比例的步长
ratios <- seq(0.01, 0.99, by = step) # 模拟不同的“观察期”长度
trials <- 100000 # 对每个“观察期”的模拟次数
opts <- 1:100 # 全局选项(数字越大则代表越优)
res <- ratios |>
future_map(~ {
ratio <- .x
1:trials |> map_vec(~ {
rule_func(glb_opts = sample(opts), obs_ratio = ratio)
})
}, .progress = TRUE) |>
map_dbl(mean)
optimal_ratio <- round(ratios[which.max(res)], 4)
optimal_success_rate <- round(max(res), 4)
# 可视化 -----------------------------------------------------------------------
data.frame(ratios = ratios, rate = res) |>
ggplot(aes(x = ratios, y = rate)) +
geom_line(linewidth = 1, color = "steelblue") +
geom_vline(xintercept = optimal_ratio, lty = 4, col = "salmon") +
geom_hline(yintercept = optimal_success_rate, lty = 4, col = "salmon") +
scale_x_continuous(labels = scales::percent) +
scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
labs(
x = "Observation Ratio",
y = "Probability of Selecting the Best Option",
title = "Optimal Stopping Strategy Success Rate Analysis",
subtitle = sprintf(
"Optimal point: %.1f%% observation → %.1f%% success",
optimal_ratio * 100, optimal_success_rate * 100
)
) +
theme_minimal()

从模拟结果中看到,当选项数量为100个时,最优“观察期”长度是0.38(接近于37%),基于该“观察期”长度,选到最优选项的概率是0.372(也同样接近于37%,也许这就是—-数学之美)。
37%法则的数学证明中提到:“当选项数量趋近于无穷时,最优“观察期”长度也将逼近37%(1/e)”。所以在不同选项数量的情况下,要酌情考虑是否使用37%作为“观察期”。