2014-11-17 2 views
0

Я пытаюсь реализовать поиск глубины в scilab, чтобы найти все пути между двумя узлами.scilab error 21 при поиске глубины поиска

Я получаю сообщение об ошибке: error 21 Invalid index. Я попытался найти решение здесь и в некоторых других местах, и я не смог его найти.

Мой вопрос: может ли кто-нибудь найти ошибку в моем коде? Или, альтернативно, я неправильно делаю метод, и я должен делать это по-другому. Моя конечная цель заключается в использовании этого метода , чтобы найти все пути между двумя узлами в графике около 1800 узлов.

Мой код:

function [x] = dfs(node) 

    if node==j then 

    //print path to file 
    [nrRows,nrCols]=size(path) 

    for counter=1:nrCols 
    mfprintf(o1,'%d ',path(1,counter)) 
    end 

    mfprintf(o1,'\n') 
else 
    visited(1,node)=1; 
    path=[path,node] 

    for nr=1:n 
    if v(node,nr)==1 then //node en nr zijn neighbours 
    if visited(1,nr)==0 then 
    [y]=dfs(nr) 
    end 
    visited(1,nr)=0 
    path(:,$)=[] //verwijder laatste element uit path 
    end 
    end //for nr 
end 
x=1 
endfunction 

И я называю это так:

n=4; 
v=[ 0 1 1 0; 
    1 0 1 0; 
    1 1 0 1; 
    0 0 1 0]; 

i=1; //starting node 
j=3; //end node 
visited=zeros(1,n); 
path=zeros(1,1); 
o1 = mopen('pathsBetweenTwoNodes', 'w'); 
[a]=dfs(i); 

Asides: Я новичок в StackOverflow. Если я делаю что-то против правил или обычаев, пожалуйста, скажите мне, и я сделаю все возможное, чтобы исправить это сейчас или в будущем.

Заранее благодарим за любые советы. Paulien

+0

Быстро попытался воспроизвести вашу ошибку, я увидел, что строка 'visited (1, node) = 1;' делает 'visited' единственным значением. Теперь я должен понять, почему. Vreemd .... – spoorcc

ответ

0

Представляется, что это проблема.

... 
visited(1,node)=1; 
... 

перезапись глобальную переменную с 1. Чтобы этого не произошло, объявите его как global внутри функции dfs.

... 
global visited 
visited(1,node)=1; 
... 
+0

Благодарим вас за ответ @ user1149326. Это действительно разрешает сообщение об ошибке. К сожалению, это также мешает алгоритму работать, поскольку он перезаписывает переменную 'visited' и не сохраняет в ней информацию. Есть ли другой способ сделать это? – pauw13

+0

Добавить как аргумент в функцию dfs, тогда у вас всегда будет правильный экземпляр. Глобалы обычно злые. – spoorcc

+0

Еще раз спасибо @ пользователь1149326. Сейчас он работает правильно. Я добавлю код здесь, если я смогу узнать, как, если кто-то захочет использовать его в будущем. – pauw13

1

Благодаря ответу, у меня теперь есть код, который работает правильно. Я отправляю окончательный код здесь, если кто-либо еще ищет эту проблему и считает ее полезной.

Функция:

function dfs(node) 
global visited 
global path 

if node==j then 
    if path(1,1)==0 then 
    path(1,1)=node 
    else 
    path=[path,node] 
    end 
    [nrRows,nrCols]=size(path) 
    for counter=1:nrCols 
    mfprintf(o1,'%d ',path(1,counter)) 
    end 
    mfprintf(o1,'\n') 

else // node!=j 

    visited(1,node)=1; 
    if path(1,1)==0 then 
    path(1,1)=node 
    else 
    path=[path,node] 
    end 

    for nr=1:n 
    if v(node,nr)==1 then //node and nr are neighbours 
    if visited(1,nr)==0 then 
    dfs(nr) 
    end 
    end 
    end //for nr 
end 

//visited(1,nr)=0 
visited(1,node)=0 
path(:,$)=[] //remove last element from path 

endfunction 

Для вызова этой функции используйте:

n=4; 
v=[ 0 1 1 0; 
1 0 1 0; 
1 1 0 1; 
0 0 1 0]; 

i=1; //startnode 
j=3; //endnode 

global visited 
visited=zeros(1,n); 
global path 
path=zeros(1,1); 

o1 = mopen('pathsBetweenTwoNodes.txt', 'w'); 

dfs(i); 

Это печатает все пути между началом эн конечного узла в файл.

+0

Спасибо за ваше обновление, вы можете пометить свой ответ как правильный, чтобы указать, что это правильное решение. – spoorcc

Смежные вопросы