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}