2015-05-20 89 views
1

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

更新:

这是我设法提出的。代码是一团糟,我承认这一点,因为我在处理这类语言方面真的很糟糕。我用维基百科的例子测试过它,似乎有效。

代码太长,所以这里是一个pastebin

回答

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)  

祝你好运,希望它有帮助!如果能够帮助他人,请给予一些反馈。

+0

谢谢,我们将在周末尝试一下并提供反馈。 –

+1

我已经设法写了一些似乎可行的东西。我更新了这篇文章,并给出了一段代码链接。我不确定这是最好的解决方案,但它的工作原理。 –