13.夏普利-舒比克权力指数

import itertools
from collections import Counter


"""
夏普利-舒比克权力指数

在投票博弈中,每个博弈参与者(代表某个政党或官员)控制着固定数量的席位或投票权,要采取行动,就必须获得多数席位或支持票。
在投票博弈中,夏普利值通常被称为夏普利-舒比克权力指数(Shapley-Shubik index of power)。通过对这个指数的计算,我们发
现一个博弈参与者(政党)控制席位(投票权)的百分比与其权力之间并不存在直接的转换。为了计算权力指数,考虑各个政党加入联盟
所有可能的次序。如果某个政党加入了一个联盟并获得绝对多数(超过1/2),那么这个政党所增加的价值等于1。在这种情况下,我们就称
这个政党是“关键的”。否则,这个政党不会增加任何价值。

既然是联盟,所有的政党目标就是一致的,比如美国选举,支持某一党派的州所组成的联盟,就存在所谓的“关键州”

假设议会中共有101个席位,分别由4个政党掌握:A党控制了40个席位、B党控制了39个席位、C党和D党则各控制了11个席位。
计算每个政党的夏普利-舒比克权力指数

简单说就是"你对票数过半,也就是51票,起到作用,你的权力就为1,否则就为0",因为没有一个政党的席位过半,所以任何一个政党
第一个加入联盟,都不会对51票起到作用,在所有的组合当中,只有前面的政党票数不过51,你的加入可以使得票数超过51则你的权力
为1,你为政党增加了价值,你属于那个“关键政党”
"""

dict_ = {
    "A":40,
    "B":39,
    "C":11,
    "D":11
}


combins = list(itertools.permutations(["A","B", "C", "D"], 4))

ss_list = []

for combin in combins:
    ss_dict = {}
    cumulative_votes = 0

    for item in combin:
        cumulative_votes += dict_[item]
        if cumulative_votes > sum(dict_.values()) / 2:
            ss_dict[item] = 1 / len(combins)
            cumulative_votes = 0
        else:
            ss_dict[item] = 0

    ss_list.append(ss_dict)

counter = Counter()
for dic in ss_list:
    counter += Counter(dic)

print(dict(counter))
{'B': 0.16666666666666666, 'C': 0.16666666666666666, 'D': 0.16666666666666666, 'A': 0.5}
原文地址:https://www.cnblogs.com/waterr/p/13948023.html