MATLAB中的Sprague-Grundy定理

MATLAB中的Sprague-Grundy定理,matlab,graph-theory,game-theory,Matlab,Graph Theory,Game Theory,我正在尝试在MATLAB中实现。这个定理本质上是试图找到数组中最小的排除元素,例如在数组[01 3 4 5]中,值为2。除此之外,函数还需要能够沿着矩阵中的不同行递归,具体来说是图论中的邻接矩阵,例如,如果我有邻接矩阵: 100 0 0 0 100 0 0 0 0 0 1 0 01 0 0 0 0 0 1 0 0 如果我使用这个矩阵作为输入,函数从第5行开始,然后它将遍历第0 0 1 0 0行,当它在第3列看到1时,函数将递归到第3行,然后递归到第4行,然后是第2行,然后是第1行 我遇到的问题是

我正在尝试在MATLAB中实现。这个定理本质上是试图找到数组中最小的排除元素,例如在数组[01 3 4 5]中,值为2。除此之外,函数还需要能够沿着矩阵中的不同行递归,具体来说是图论中的邻接矩阵,例如,如果我有邻接矩阵:

100 0 0 0

100 0 0 0

0 0 1 0

01 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 

所以,重新表述你的问题,你试图找到一个具有最小索引的顶点,这样它就不能从起始顶点到达,对吗

我根本不会使用递归;我会逐步构建一组顶点,这些顶点可以从目前为止到达的顶点中到达,直到我找不到更多的顶点为止

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

有人可能会写得更好,我不是MatlabPro。但是你应该明白这个想法

你能给出一个具体输入的具体期望输出的例子吗?输出将是最小排除值,例如,假设我们有一个矩阵,整数输入是5。如果adj矩阵的第5行是[1 0 0 1],那么程序应该检查adj矩阵的第1行和第5行,如果adj矩阵的第1行和第5行分别是[0 0 0 0 0]和[0 0 0 0 0 0 0],那么输出是1,因为第1行和第5行中的值集是集合S={0},所以最小排除值,即集合中不存在的最小值是1,所讨论的图形是否有任何特殊属性,例如,它是非循环的?对于循环图,使用递归不是一个好主意,因为您可能会进入一个无止境的循环