【发布时间】:2022-01-06 13:25:02
【问题描述】:
编辑:感谢论文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 左右。
【问题讨论】:
-
为什么 {2,3} 在您的第一个样本中不是一个获胜的子集?
-
你说得对,我编辑了这个问题。对不起这个错误
标签: r algorithm tree subset weighted