pivot-libre/tideman

Tideman排序对算法的实现

0.8.1 2020-02-19 02:10 UTC

This package is auto-updated.

Last update: 2024-09-05 08:51:05 UTC


README

Travis status Coveralls coverage Codacy Badge PDD status

目的

该算法通过对所有选票中所有候选人的排名集合进行处理,使用T.N. Tideman的排序对算法生成一个相对公平的汇总排名。

背景

本文档的目标读者是程序员。有关面向普通人的解释,请参阅维基百科的排序对文章或加拿大国会议员Ron McKinnon的condorcet.ca

摘要

此算法首先计算所有选票中所有候选人配对之间的支持差异。这种两位候选人的差异称为差额。接下来,算法按差额的降序对差额进行排序。然后,算法通过从最大的差额到最小的差额迭代排序后的差额列表,为每个差额的获胜候选人和失败候选人添加一个指向失败候选人的边来构建图数据结构。如果添加差额的边会引入循环,则忽略该差额。完成图后,没有指向他们的边的候选人就是获胜候选人。换句话说,获胜者是完成图中的源节点。如果希望有多个获胜者,则可以不考虑已经获胜的候选人重复整个算法。

用法

pivot-libre/tideman添加到项目中的composer.json依赖项。有关示例用法,请参阅tests/RankedPairsCalculatorTest.php

详细信息

论文

原始1987年排序对论文缺少平局解决规则。1989年的后续论文增加了平局解决规则。

配对平局解决

在排名候选人配对时,可能两位候选人之间的支持差异等于两位其他候选人之间的支持差异。在这种情况下,必须通过配对平局解决规则来解决候选人配对之间的平局。该库根据用户指定的平局解决投票对象来打破配对平局。如果用户指定了包含平局的平局解决投票对象(即候选人之间的平局),则库使用PHP的默认随机数生成器来打破该投票对象中的所有平局。库不强制执行平局解决投票对象来源。如果用户希望遵循Zavist, Tideman 1989中指定的平局解决规则,则应从选民提交的投票对象中随机选择一个,并将其用作平局解决投票对象。

阅读材料

贡献

设置

  • 安装PHP 7.1和composer。
  • 已知当以下PHP扩展安装时,库可以正常工作,尽管可能需要的扩展列表更短(参见问题#51):ctype,curl,dom,iconv,json,mbstring,openssl,pdo,pdo_sqlite,phar,sqlite3,tokenizer,xmlreader,xmlwriter,zlib

与代码合作

  • 将此存储库分支。
  • 克隆您的分支。
  • 将此存储库作为上游添加。
    • 示例
      • git remote add upstream git@github.com:pivot-libre/tideman.git
      • git remote add upstream https://github.com/pivot-libre/tideman.git
  • 下载依赖项
    • composer install
  • 构建项目
    • vendor/bin/phing
    • 此命令检查文件语法,运行测试,检查格式符合性,并执行静态代码质量分析。
  • 在输出结束时,您应该看到BUILD FINISHED。您不应看到BUILD FAILLED

可视化测试覆盖率

  • 确保您已安装了xdebug
  • 运行
  • vendor/bin/phing coverage
  • 在网页浏览器中打开file:///<file-path-to-cloned-repo>tideman/build/coverage/index.html
  • 例如: file:///home/john_doe/src/tideman/build/coverage/index.html

分享您的作品

  • 使用Git addcommit您的本地更改
  • 将您的更改推送到GitHub分支
    • git push origin
  • 在您的分支和PivotLibre/tideman存储库之间创建拉取请求。

获取更新

  • git fetch upstream
  • 根据您是使用基于合并的工作流程还是基于rebase的工作流程,您将运行以下之一
    • git merge upstream/0.x
    • git rebase upstream/0.x