2014-11-17 4 views
0

두 노드 간의 모든 경로를 찾으려면 scilab에 깊이 우선 검색을 구현하려고합니다.깊이 우선 탐색을 구현할 때 가로 세로 오류가 발생 함

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

는 잡담 : I에 유래하는 새입니다. 제가 규칙이나 관습에 위배되는 일을한다면 제게 말해주십시오. 지금이나 미래에 그것을 고칠 최선을 다할 것입니다.

미리 조언 해 주셔서 감사합니다. Paulien

+0

신속하게 오류를 재현하려고 시도한 결과,'visited (1, node) = 1;'행이 단일 값을'방문한 '것으로 보았습니다. 이제 나는 그 이유를 알아봐야 만합니다. Vreemd .... – spoorcc

답변

0

범위가 지정된 것으로 보입니다.

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

전역 변수를 1으로 덮어 씁니다. 이 문제가 발생하지 않도록하려면 dfs 함수 내에 global으로 선언하십시오.

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

@ user1149326 답변 해 주셔서 감사합니다. 이것은 실제로 오류 메시지를 해결합니다. 불행하게도, 변수가'visited'를 덮어 쓰고 그 안에 정보를 보관하지 않기 때문에, 알고리즘의 작동을 멈추는 것처럼 보입니다. 이것을 할 수있는 다른 방법이 있습니까? – pauw13

+0

visited를 dfs 함수에 인수로 추가하면 항상 올바른 인스턴스를 갖게됩니다. 전역은 일반적으로 악합니다. – spoorcc

+0

@ user1149326 다시 한 번 감사드립니다. 지금 올바르게 작동하고 있습니다. 만약 누군가가 미래에 그것을 사용하기를 원한다면 나는 어떻게 코드를 추가 할 것인가? – 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