zoukankan      html  css  js  c++  java
  • 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}
  • 相关阅读:
    JAVA调用WCF
    写代码之前要做什么?
    漫谈界面和数据
    UIButton 简易的UI
    数据结构利器之私房STL(中)
    有趣的位运算
    基于TCP的C/S初级网络编程1
    数据结构利器之私房STL(上)
    Unix/Linux 那些系统启动后的进程
    【字符串匹配】KMP算法之道
  • 原文地址:https://www.cnblogs.com/waterr/p/13948023.html
Copyright © 2011-2022 走看看