<< 返回本书主页
<< Back to the afterword page

10 表决:方式与挑战

codes

10.1 背景问题

在一个共同体里,人们观点相异极为常见。在异见的基础上决议或得出“集体意见”,表决是一种重要方式。

孔多塞原则与孔多塞悖论

表决有几种经典设计。一个代表是孔多塞原则:

这一过程可以用有向图来表示,下图是依据孔多塞原则表决的一个例子:

孔多塞原则

在集体全排序中,边ab意味着至少(m+1)/2个个体偏好中有ab。如果投票人为奇数,任意两个节点之间有且仅有一条有向边。

这一表决原则的问题在于,可能会出现孔多塞悖论。假设三个人甲、乙、丙要对三个候选项A、B、C投票,

最终的结果:AB,BC,CA,无法形成全排序,也说不清楚谁最被偏爱。这一悖论表明,即使个体理性、制度合理,也不一定能导致群体理性。

孔多塞悖论的解决

以下两种方法可以用来解决孔多塞悖论,保证找出胜者:

完美的表决方式似乎很难找到。阿罗在1950年提出了阿罗不可能定理:不存在同时满足以下三条公理的表决聚合规则,

也就是说,任何一种表决规则至少违反以上三条公理之一。那么,是否存在对投票人的个人序做某种合理要求,能够克服阿罗不可能定理指出的困难呢?课堂上引入了一个新的标准——属性序——用以判断投票者是否足够理性,不理性的投票者的意见不予考虑。只考虑理性投票者似乎确实合理,这一方法也成功解决了孔多塞悖论。

在现实生活中,事物的性质往往能够按顺序排列,例如,候选项是建筑预算时,我们可以按照数额从大到小排列。对于这类事物,理性的投票行为应当符合单峰性质。例如,如果一个人对高、中、低三种建筑预算的排序是,这就违背了单峰性质,直观上也是不理性的选择:如果他最偏好高预算,得不到高预算时的次佳选项,应当是更接近首选的候选项,即中预算。

单峰偏好的定义如下:

单峰性质可能呈现为以下三种形态。

单峰性质

删去不理性的个体后,我们可以用中位项定理得出孔多塞全排序结果:给定满足单峰性质的m个排序R1,R2,,Rmm是奇数)。若将所有人的全排序里的第一名Ri(1)按属性序R0排列,得到S,则其中间项(Ak)是孔多塞原则下的“胜者”。

这样操作的凭依就是排序的单峰性。设S,At,,Ak,,As,(中间项为Ak)。

根据“少数服从多数”原则,中位项定理找出的Ak一定是孔多塞胜者。

这样操作第一次,设孔多塞胜者为Ak1,它就是第一名。删去每个人全排序中的Ak1,单峰性质不变。用同样的方法,找出剩下的候选项中的孔多塞胜者Ak2,它就是第二名。迭代操作,最终获得整个集体排序。

10.2 计算实践:孔多塞模型下的表决综合

codes

10.2.1 作业描述与算法思路

本次作业就是模拟表决过程,给出表决结果。如果投票人的个人排序中不存在孔多塞悖论,就按照孔多塞原则确定群体排序;如果存在,就删去非理性投票者,按照中位项定理一个个确定胜者。

设有m(奇数)个人参与对n个项目(p1,p2,,pn)的投票,每人提交一个对项目偏好的排序R1,R2,,Rm。你要做的事情是基于大家表达的偏好,尝试给出一个那些项目的群体排序R,满足:若pipj前面,必须是m个人中的多数认为pi应该在pj前面。我们知道,因为孔多塞悖论现象,基于个体偏好全序和多数原则综合的评判有可能形成不了一个体现群体意见的全序。你的任务是:

  1. 如果R1,R2,,Rm之中没有隐含孔多塞悖论,则按照孔多塞原则给出体现群体意见的全序R

  2. 如果有悖论:

    • 假设(p1,p2,,pn)是人们关心的n个项目的一种属性序,判断R1,R2,,Rm之中有哪些不满足单峰偏好性质,认为它们不是一个“理性投票”,将它们剔除。
    • 剩下的k个若不是奇数,则以(p1,p2,,pn)为附加个体序,凑成k+1(奇数)。
    • 按中位项定理的操作方法给出全序R

这一算法有三个重点:

10.2.2 编程实现与要点说明

首先,打开用户指定的数据文件,读取所有投票者的投票结果,存储在一个numpy 2d-array votes里。代码略,参见1.2.1.2。一个数据文件的例子如下:

定义一个函数compare,用以比较两个候选项中哪个候选项得到了多数人的支持。advantage大于0,ij得到了更多人支持。

定义函数condorcet,根据孔多塞定理,得到集体序order

我这里使用的是冒泡排序法。对于尚未加入集体序的元素i,把它同该序列中的元素一一比较大小,从最后一名开始比。直到找到比i更受欢迎的元素j,把i插在j后面。

如果没有找到比i更受欢迎的元素j,这意味着i是目前为止得票最多的候选项,把它放在第一位。

定义函数condorcet_paradox_check,检查投票结果是否隐含孔多塞悖论。这一函数的内部结构略微有些复杂,我定义了两个局部函数:preference_matrix_generatormost_preferred_deleter。在函数condorcet_paradox_check内部的主程序中,我先调用preference_matrix_generator,生成孔多塞有向图,在对这一有向图迭代调用most_preferred_deleter,不断删除入度为0的节点,来判断孔多塞悖论是否存在。

函数preference_matrix_generator根据投票结果votes生成孔多塞排序有向图preference_matrix,这一过程主要依靠迭代调用compare函数完成。preference_matrix[i][j] = 1表示ijpreference_matrix[i][j] = -1表示ji

接下来的任务是判断这一有向图是否存在有向环。函数most_preferred_deleter用以检查有向图中是否存在入度为0的点,如果存在,就删除它。返回该有向图是否存在入度为0的点的bool值deleter_bool,和删除入度为0的点后的有向图preference_matrix

循环调用most_preferred_deleter函数,直到无节点可删。此时,如果所有节点都删除掉了,有向图中不存在环,孔多塞悖论不存在;反之则存在孔多塞悖论。

如果孔多塞悖论存在,我们需要检查个体序是否符合单峰性质,删除非理性的投票者。我的程序中完成这一任务的是函数irrational_voters_deleter。我定义了两个局部函数monotonic_checksingle_peak_check,后者需要调用前者。在irrational_voters_deleter的主程序中,我一一检查每个节点,调用single_peak_check,检查它们是否具有单峰性,删除不具有单峰性的节点。

先定义一个函数monotonic_check,检查字典的值value是否随着键key单调变化。输入:

单峰左侧的候选项,偏好位次随着属性位次单减,返回mononotic_bool=True,否则返回mononotic_bool=False;单峰右侧的候选项,偏好位次随着属性位次单增,返回mononotic_bool=True,否则返回mononotic_bool=False

首先把字典的键和值分别按照从小到大排序,得到keysvalues

考虑处于keysi位的key。如果单调递增,处于valuesivalue应当恰好等于order_dict[key];如果单调递减,处于values从队末开始数第i位(从队首开始数第values_len - i - 1)的value应当恰好等于order_dict[key]

在检查单峰性的函数single_peak_check中,我们只需要确定最受偏好的候选项most_preferred,把它左侧的候选项存入字典leftwing中,右侧的候选项存入rightwing中,再分别调用monotonic_check即可。返回rightwing_bool and leftwing_bool:左右候选项同时通过单调测试,这一投票者的偏好序就具有单峰性。

一一检查有向图中的节点,输出不理性的投票者。

删除非理性投票者,生成新的有向图矩阵。

检查投票者是否为奇数个。如果不是,补齐一个一个投票者,其偏好序为属性序。

对于理性投票者集合,我们采用中位项定理排序。先定义函数median_identifier,给定一组投票结果votes,集合每一投票者最偏好的候选项most_preferred_choices,找出其中的中位项i,这就是当前votes中的孔多塞胜者。

为了找出中位项,我调用了numpyunique方法,得到一个字典occurences,其中记录了每一候选项成为最受偏好者的次数(被多少人选为了最佳)。

occurences的键按照属性序从小到大排列,加总每一候选项的出现次数,总和存储在变量accumulation里。当accumulation >= (n+1) // 2时,终止循环,此时的candidate即为中间项。

以下为主程序。

首先调用condorcet_paradox_check,检查投票结果是否存在孔多塞悖论。

如果不存在孔多塞悖论,就调用condorcet,按照孔多塞原则排序。

否则就调用irrational_voters_deleter,删除非理性投票者,得到votes_new

接着调用median_identifier,按照中位项定理确定当前的孔多塞胜者median_choice,然后在投票结果votes_new中删去这一候选项。迭代操作,直到所有候选项都被排到集体序中。

上面的数据例子存在孔多塞悖论。以下是一个不存在孔多塞悖论的数据例子:

<< 返回本书主页
<< Back to the afterword page