在SciLab中实施Schulze投票方法

时间:2015-05-20 19:22:33

标签: scilab voting-system

我必须在SciLab中实现Schulze方法。不幸的是,我对这个工具完全陌生,我也不擅长这种工作。任何人都可以建议在哪里寻找一些示例和工具尽可能快速和简单地做到这一点?程序不应该是非常灵活或定性的,如果只是使用一些硬编码输入就可以了。据我所知,Schulze方法可以使用图形来实现,我已经为SciLab找到了toolbox。我应该用吗?

更新

这是我设法提出的。代码是一团糟,我承认它,因为我在使用这种语言时非常糟糕。我用维基百科的例子对它进行了测试,似乎有效。

代码太长,所以这里是pastebin

1 个答案:

答案 0 :(得分:1)

您可以找到a pseudo implementation on Wikipedia

# 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] ) )

将此翻译为SciLab需要使用functionsfor-loopsif-else constructsmaxmin

下面我简单地将伪代码翻译成Scilab代码。我还没有对它进行过测试,你必须找出要求它的论据。

function p = schulzeMethod(d, C)

    // Initialize a zero matrix p of the same size as d
    p = zeros(size(d))

    for i = 1:C
        for j = 1:C
            if i ~= j then
                if d(i,j) > d(j,i) then
                    p(i,j) = d(i,j)
                else
                    p(i,j) = 0
                end
            end
        end
    end

    for i = 1:C
        for j = 1:C
            if i ~= j then
                for k = 1:C
                    if (i ~= k) & ( j ~= k) then
                        p(j,k) = max(p(j,k), min(p(j,i), p(i,k)))
                    end
                end
             end
         end
     end

endfunction

// Create some random values
C = 10
d = rand(C, C)

// Call the function above
p = schulzeMethod(d, C)

disp(p)    
祝你好运,希望它有所帮助!如果能帮助他人,请提供一些反馈。