MATLAB中的Sprague-Grundy定理

时间:2015-03-06 01:04:39

标签: matlab graph-theory game-theory

我正在尝试实施" Sprague–Grundy theorem"在MATLAB中。这个定理本质上试图找到数组中的最小被排除元素,例如在数组[0 1 3 4 5]中,该值为2.除此之外,该函数需要能够沿着不同的行递归。矩阵(具体来自图论的邻接矩阵)例如,如果我有邻接矩阵:

1 0 0 0 0

1 0 0 0 0

0 0 0 1 0

0 1 0 0 0

0 0 1 0 0

如果我使用这个矩阵作为输入,并且函数从第5行开始,那么它将遍历行" 0 0 1 0 0"当它看到第3列中的1时,该函数将递归到第3行,然后递归到第4行,然后是第2行,然后是第1行。

我遇到的麻烦是进行递归,其中函数输入是矩阵/数组。我认为当函数输入是一个整数时递归很简单,但是使用矩阵/数组我不知道如何保持"保持"跟踪值并获得我想要的最终数组。到目前为止,这是我的matlab代码:

function [ y ] = S_Grundy( X,r,m )
%   Recursively finds the SG value given an adj matrix, 

Row_ones = find(X(r,:) == 1)
y=0.*size(Row_ones,2);

% if(numel(Row_ones)==0)
%     y(:)=0;
%     return
% end


for i=1:size(Row_ones,2)

    if(Row_ones(i) >= m) 
       y = S_Grundy(X,Row_ones(i),m);
    end
end

if (Row_ones(i) < m)

    for j=0:max(Row_ones)
        if(isempty(find(Row_ones==j)));%&&(isempty(find(Row_ones==0))))
            y(i)=j;
        else
            y(i)=777;

%                 if(isempty(find(Row_ones==j)))
%                     y(i)=j;
%                 end
            end    
        end

    end   
end 

1 个答案:

答案 0 :(得分:0)

所以,为了重新解释你的问题,你试图找到一个具有最小索引的顶点,这样它就不能从起始顶点到达,这是正确的吗?

我根本不会使用递归;我逐渐建立了到目前为止到达的顶点可到达的顶点集,直到我找不到为止。

graph = [1 0 0 0 0; 1 0 0 0 0; 0 0 0 1 0; 0 1 0 0 0; 0 0 1 0 0]

start = 5

component = graph(start, :)
lastcomponent = zeros(1, 5)

while (sum(component) > sum(lastcomponent))
    lastcomponent = component
    component = sign(sum(graph(find(component == 1), :), 1) + lastcomponent)
endwhile

result = min(find(component == 0))

(有人可能写得更好,我没有专业的matlab。但你应该明白这个想法)