美文网首页程序员技术栈
算法: 选举机制里的 Schulze 方法

算法: 选举机制里的 Schulze 方法

作者: 写代码的海怪 | 来源:发表于2019-02-19 00:59 被阅读22次

    简介

    Schulze 方法是选举机制里比较出名的算法。假设有 n 个候选人,选民们都为它们打分进行选举,在选民打分完后就形成了该选民心中的候选人顺序。如下图所示,有 ABCDE 5 个候选人,选民对他们进行打分排序。

    当然这个是已经排好序了,具体怎么打分这里不讨论。

    现在的问题是怎么从上面的这个表上选一个合适的 Order of Preference 呢?难道直接选投票最多的那个么?那就太不科学了,所以就有 Schulze 方法。

    抽象

    为了能够抽象化这张表,我们先定义 d[X, Y] 表示 X 候选人在前,Y 候选人在后,即选民更喜欢 X。用上图举个例子 d[A, B] 为喜欢 A 候选人的人数,那么

    d[A, B] = 5 + 5 +3 + 7 = 20

    现在我们将每种情况都算出来,并做成下面的表格

    其中绿色表示更优的,红色表示更差。比如 d[B, A] = 25,而 d[A, B] = 20,所以 d[B, A] 要更好一些。这里可以发现它们都是对称的,一红对应一绿。

    有没有发现这个表格有点像我们以前看到的邻接矩阵呀,ABCDE 每个代表一个节点,表格里的数字是连接节点边的权值,所以我们可以用下面的图里表示(注意这里只表示更优的情况)

    优化选择顺序

    这时候你可能发现 d[A, B] 表示的就是以 A 为起点 B 为终点的路,而数值是这条路里最小权值的边。如 d[A, B] 的路是 A -> D -> C -> B 最小边为 D -> C 28。而这个 28 是比 d[B, A] = 25 大的,所以此时 A 比 B 更优,选民更喜欢 A。

    上面是一个例子,现在我们将别的都表示出来(注意这里不再是 d[X, Y],而是使用了 p[X, Y]

    这时我们的表格就要再更新一次了

    通过上面的比较我们容易得出候选人的顺序 E A C B D.

    相关文章

      网友评论

        本文标题:算法: 选举机制里的 Schulze 方法

        本文链接:https://www.haomeiwen.com/subject/mzrasqtx.html