You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何快速查找加权多数投票博弈中的所有最小获胜联盟?

最小获胜联盟求解问题

我通过论文《A survey of algorithms for calculating power indices of weighted majority games》找到了对应解决方案。

问题描述

给定集合N={1,..,n},其权重向量W={w_1,..,w_n}按降序排列且总和为1,需要找出N的所有子集C(也称为“联盟”),满足以下两个条件:

  • C是“获胜”的:即子集C内元素的权重之和超过指定阈值(例如0.5)
  • C是“最小”的:即从C中移除任意一个元素后,该子集将不再属于“获胜”集合

示例说明

举个示例方便理解:N={1,2,3},W={0.45,0.35,0.2}

  • 该场景下的“获胜”子集为{1,2}、{2,3}、{1,3}和{1,2,3},因为它们的总权重都超过0.5
  • 其中只有{1,2}、{2,3}、{1,3}是最小获胜联盟,因为{1,2,3}可以移除任意一个元素得到上述三个获胜子集。

已实现代码

参考上述论文,实现了如下递归生成所有最小获胜联盟列表的代码:

MWC = function(w,threshold=0.5){
  n = length(w)
  l = list()
  enumerate = function(S1,n1,b1){
    if(n1==n){
      return(list(c(S1,n1)))
    }else{
      if(sum(w[(n1+1):n]) >= b1){
        l = c(l,enumerate(S1,n1+1,b1))
      }
      if(w[n1] >= b1){
        l=c(l,list(c(S1,n1)))
      }else{
        l = c(l,enumerate(c(S1,n1),n1+1,b1-w[n1]))
        return(l)
      }
    }
  }
  return(enumerate(c(),1,threshold))
}

w = c(0.46,0.3,0.19,0.05)
MWC(w)

性能瓶颈

该代码在n≈20时可以正常运行,超过该值后指数级复杂度会导致运算无法正常完成。

内容的提问来源于stack exchange,提问作者pier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:36:10