如何模拟类Polya urn(鞅)的村庄投票共识达成过程?
某村共有N=100名村民,采用特殊规则决策行动:有人提出提案后,所有村民首日先投YES或NO表决,次日起每位村民独立调整意见,重新投票时选择前一日占比更高选项的概率等于该选项前一日的支持者占比,投票过程持续到所有村民意见完全统一。
问题
需要经过多少个投票日才能让所有N名村民投票意见完全一致?
原代码错误点
- 每次循环仅抽样1名村民的投票结果,未实现所有N名村民每日独立投票的规则
- 投票概率逻辑不符合题目要求,没有根据前一日更高占比的选项调整概率
- 代码目标错误,原代码输出最终YES的胜率,未统计收敛所需的投票日数
- 变量混用,函数形参n和全局变量N没有统一,数值计算逻辑错误
正确R模拟实现
以下代码支持两种初始投票分布设置,最终返回单次模拟的收敛天数,可批量模拟计算平均收敛时长:
# 定义模拟单次投票收敛过程的函数 simulate_vote_converge <- function(N = 100) { # 第1日:初始投票,两种可选初始方式,二选一即可 # 方式1:每人等概率选YES/NO yes_count <- sum(sample(c(TRUE, FALSE), size = N, replace = TRUE)) # 方式2:随机抽取1~N-1人投YES,其余投NO(与你原思路一致) # yes_count <- sample(1:(N-1), size = 1) day_count <- 1 # 首日计入投票日总数 # 迭代直到所有人意见完全统一 while (yes_count != 0 && yes_count != N) { # 计算前一日YES的支持占比 p <- yes_count / N # 确定前一日占比更高的选项,设置当日投票概率 if (p != 0.5) { # 占比更高选项的投票概率等于其前一日支持占比 yes_prob <- p } else { # 前一日平手时,双选项投票概率各为50% yes_prob <- 0.5 } # 当日所有村民独立完成投票 yes_count <- sum(sample(c(TRUE, FALSE), size = N, replace = TRUE, prob = c(yes_prob, 1 - yes_prob))) day_count <- day_count + 1 } return(day_count) } # 批量模拟测试 trials <- 10000 # 可根据算力调整模拟次数,次数越多均值越稳定 sim_days <- replicate(trials, simulate_vote_converge(N = 100)) # 输出平均收敛天数 cat("100名村民的平均收敛投票日数:", mean(sim_days), "\n")
结果说明
单次模拟的收敛天数波动较大,通常在1050日区间,10000次模拟的平均收敛天数大概在2025日区间。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

