在 SciLab 中实施 Schulze 投票方法

Implementing Schulze voting method in SciLab

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

更新:

这是我想出的办法。代码一团糟,我承认,因为我真的不擅长使用这种语言。我用维基百科的例子测试过它,似乎有效。

代码太长所以这里是pastebin

你可以找到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 需要使用 functions, for-loops, if-else constructs, max, min

下面我把伪代码简单翻译成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)    

祝你好运,希望对你有所帮助!如果对其他人有帮助,请提供一些反馈。