基于排名的最佳会议位置

时间:2015-01-05 18:12:42

标签: python algorithm

这听起来像是一个非常普遍的问题。也许有一个网站可以为我解决它?如果没有,我肯定必须有一些python库和几行代码才能提供帮助。

假设我有10个人和5个可能的会议地点。我如何找到最佳会议地点?我知道人们的偏好,例如,人员1会将位置从最佳到最差排列为:位置D,位置A,位置C;人2 - 位置B,位置A,位置D,位置C;等等。请注意,排名可能不包括所有5个位置,换句话说 - 我将如何处理缺失的排名?

我如何在Python中编写代码以找到最佳解决方案?或者也许我可以使用在线服务来解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:2)

如果它们仅排名且未加权,则这是Condorcet vote的示例。 Schulze方法的伪代码看起来是here

ADDITION

只需在Google上搜索" Python Condorcet" - 使用免费代码显示许多结果。

附加2

github上首次列出的项目名称:

bradbeattie/python-vote-core

radii/condorcet

StackExchange代码评论: https://codereview.stackexchange.com/questions/42359/condorcet-voting-method-in-oop-python

前面提到的维基百科链接的相关引文:

  

实施Schulze方法的唯一困难步骤是计算最强的路径优势。然而,这是图论中的一个众所周知的问题,有时被称为最宽的路径问题。因此,计算强度的一种简单方法是Floyd-Warshall算法的变体。以下伪代码说明了算法。

# Input: d[i,j], the number of voters who prefer candidate i to candidate j.
# Output: p[i,j], the strength of the strongest path from candidate i to candidate j.

for i from 1 to C
    for j from 1 to C
      if (i ≠ j) then
         if (d[i,j] > d[j,i]) then
            p[i,j] := d[i,j]
         else
            p[i,j] := 0

for i from 1 to C
   for j from 1 to C
      if (i ≠ j) then
         for k from 1 to C
            if (i ≠ k and j ≠ k) then
               p[j,k] := max ( p[j,k], min ( p[j,i], p[i,k] ) )
  

该算法是有效的,并且具有与C3成比例的运行时间,其中C是候选者的数量。 (这并不考虑计算d []值的运行时间,如果以最直接的方式实施,则需要的时间与选民数量的C2倍成比例。)