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}
  • 相关阅读:
    关于工作流程引擎中的岗位的设置的问题
    将要发布的开源CCOA的照片一览
    关于多个checkbox在IE6下自由表单设计器中的兼容问题
    ccflow流程自动发起功能增加,如何按指定的时间触发方式发起流程?
    Windows 如何远程强行关机
    Report bulder
    微软sample and code down web address
    如何查看sql server的死锁情况
    如何读取数据的所有用户表
    复制和数据库镜像
  • 原文地址:https://www.cnblogs.com/waterr/p/13948023.html
Copyright © 2011-2022 走看看