跳转到主要内容

多数投票投票程序的实现

项目描述

这是Michel Balinski和Rida Laraki在《测量、选举和排名的理论》中提出的多数投票投票程序的实现。

它接受由选民提供的评分总计,并提供了Python类型来包装它们,这些类型按照多数投票顺序排序。

例如

x = MajorityJudgement([5, 5])
y = MajorityJudgement([3, 7])
assert x < y

第一个是一个获得了5票0分和5票1分的候选人的评分。第二个是一个获得了3票0分和7票1分的候选人。结果,多数投票程序将第一个候选人排名在第二个候选人之下。

如果您想了解更多关于投票细节的信息,MajorityJudgement对象的行为类似于分配给它们的评分列表。

例如

assert list(MajorityJudgement([2,2])) == [0,1,0,1]

MajorityJudgement对象通常可以像其相应的评分列表一样使用。特别是它以高效的方式支持所有容器方法。

内部实现相当不同。它被编码为重复循环的列表。所以这个列表

[0, 0, 0, 1, 0, 1, 0, 1]

在内部表示为

[[[0], 3], [[1], 1], [[0, 1], 2]]

我们选择的表示方式只构建长度为一或二的循环:长度为1的循环通常在存在无歧义的中间值时构建,而长度为2的循环通常在上下中间值不同时构建(这并不完全正确。例如,投票列表[1,1,1,1]不会产生任何长度为2的循环,但这是一个很好的经验法则)

不是构建整个列表然后再压缩,而是通过工作从剩余的投票中弹出多长的运行,一次性弹出所有这些运行,一次性构建整个循环。这意味着即使是非常大的选民群体也可以高效地处理,因为结果列表实际上非常小。

在此压缩表示法上,比较也可能被高效地执行:等价关系是直观的,即两个相同的投票将产生两个相同的表示。可以通过首先弹出公共前缀来进行比较:因此,如果两个列表都以[x, n]和[x,m]开头,那么我们可以立即丢弃min(m,n)个条目,而不是必须遍历。

似乎所有投票都可以用这种形式的压缩列表表示,循环很少。我推测这可以在O(log(voters))内完成,但我还没有验证这一点。在实际上,这似乎是成立的。

项目详情


下载文件

下载适合您平台的文件。如果您不确定该选择哪个,请了解有关安装包的更多信息。

源分发

majorityjudgement-0.3.2.tar.gz (5.3 kB 查看哈希)

上传时间

支持