Visita percorsi

di il
2 risposte

Visita percorsi

Salve, ho un dubbio,
Ho sviluppato un algoritmo che fà la seguente:


nodo 1 visita i nodi adiacenti , e li salvo in un vettore(conta,destinazione) e poi i nodi adiacenti diventano sorgenti e tutte le destinazioni li salvo incrementanto il contatore e cosi via fino quanto trovo il nodo di arrivo.

il problema sarebbe come si potrebbe lavorare sui vettori per poter individuare tutte le possibili destinazioni dal nodo di partenza fino di arrivo.

Oppure ho usato questo algoritmo
:




n=size(matriz_costo,1);
S(1:n) = 0;    
dist(1:n) = inf;   
prev(1:n) = n+1;  

dist(s) = 0;


while sum(S)~=n
    candidate=[];
    for i=1:n
        if S(i)==0
            candidate=[candidate dist(i)];

display(candidate);


        else
            candidate=[candidate inf];
        end
    end
    [u_index u]=min(candidate);
    S(u)=1;
    for i=1:n
        if(dist(u)+matriz_costo(u,i))<dist(i)
            dist(i)=dist(u)+matriz_costo(u,i);
            prev(i)=u;
            
            
        end
    end
end



sp = [d];



while sp(1) ~= s
    if prev(sp(1))<=n
        sp=[prev(sp(1)) sp];
    else
        error;
    end
end;


Ma alla fine eseguendolo mi da informazioni solo sulla riga della sorgente fino ad arrivare alla destinazione e non sui singoli percorsi, come mai? eppure ho seguito la procedura

2 Risposte

  • Re: Visita percorsi

    
      for j6=1:length(nodi_visitati)
                                         
                                         %se il nodo non è stato trovato vedo i
                                         %nodi adiacenti e li visito
                                   vertices.conta_righe=vertices.conta_righe+1;
                               
                                   
                                   %se il nodo visitato è uguale a vb 
                                   
                                   
                                 
                                   display('nodo visitato 1');
                                   
                                   
                                   display(nodi_visitati(j6));
                                   
         
         display(vertices.conta_righe);
         
         if vertices.conta_righe==1 
             
             
             for j=1:length(nodi_visitati)
           
                 
                 
       self.vettore_percorso(vertices.conta_righe,j)=nodi_visitati(j6);
    
            
                                     
                                     
         end
                            
         end
       
         
     
         
                [n1,m1]=size(self.vettore_percorso);         
                      
                            
                           
                           %possibili sorgenti
                           
                                       
                           
                           conta_edge=0;
                           
                           
                           
    
                            %dimensione riga e colonna  
                                    
                            
                            for j2=1:m1
                                
                                
                                
                                
                             %verifico che la sorgente esiste nel
                             %vettore_percorso
                                
                           if nodi_visitati(j6)==self.vettore_percorso(n1,j2)
                              
                               
                               
                               
    
                              
                              
                              %se esiste prelevo tutte le destinazioni del nodo
                            
                              if nodi_visitati(j6)~=vb
                              
                           edges2=ver.connectedEdges(edges,nodi_visitati(j6));
    
    %copio in un vettore in una nuova riga e nella stessa colonna il valore
    %della destinazione
    
    
                              end
    
    %tutte le destinazioni le imposto sorgenti 
                                    for j8=1:length(edges2)
                       
                                             
                                conta_nodi_sorgenti=conta_nodi_sorgenti+1;
                               nodi_sorgenti(conta_nodi_sorgenti)=edges2(j8);
                                    
                              
                              
                                    end 
                                                  
                                                  
    
                           
                           
    
                           
    
                           
                           %copio tutte le destinazioni 
                           for j=1:length(edges2)
                        
                               
                               
                                   
                                                      
                               
                               if length(edges2)>=2
    
    if vertices.conta_righe==1
        
        
        
                                   
                                   conta_edge=conta_edge+1;
    
                                   
                                   vertices.conta_colonne=conta_edge;
    end
    
                                 
                                   
                               end
                           
                               conta_edge=conta_edge+1;
                                   
                                   %scorro le righe
                                   for k=1:n1
                                           
                                           %copio i valori in una nuova colonna
                                           %dei valori in quanto esisite un
                                           %nuovo percorso
                                           
                                           
                                           if k==n1
                                                                                      
                                             self.vettore_percorso(k,m1+conta_edge)=self.vettore_percorso(n1,j2);
    
                                               
                                           self.vettore_percorso(k+1,j2)=edges2(j);
    
                                          
                                          
                                         
                                            
                                           
                                           
                                   
                                           
                                   end
                                           
                                           
                               
                           
                           
                           
    
                           
                            
                             
                          
                           
                           end
                           
                               
                           end
                               
                           
                           
                          
                           end
                           
                           
                                  
                                    
                                    
                           
                           
                           
                            end
                            
      
                           
      end
      
      
                                        end
    
                           
    Ho provato con questo con i vettori ma nn ci riesco, qualche suggerimento?
  • Re: Visita percorsi

    signfra ha scritto:


    
      for j6=1:length(nodi_visitati)
                                         
                                         %se il nodo non è stato trovato vedo i
                                         %nodi adiacenti e li visito
                                   vertices.conta_righe=vertices.conta_righe+1;
                               
                                   
                                   %se il nodo visitato è uguale a vb 
                                   
                                   
                                 
                                   display('nodo visitato 1');
                                   
                                   
                                   display(nodi_visitati(j6));
                                   
         
         display(vertices.conta_righe);
         
         if vertices.conta_righe==1 
             
             
             for j=1:length(nodi_visitati)
           
                 
                 
       self.vettore_percorso(vertices.conta_righe,j)=nodi_visitati(j6);
    
            
                                     
                                     
         end
                            
         end
       
         
     
         
                [n1,m1]=size(self.vettore_percorso);         
                      
                            
                           
                           %possibili sorgenti
                           
                                       
                           
                           conta_edge=0;
                           
                           
                           
    
                            %dimensione riga e colonna  
                                    
                            
                            for j2=1:m1
                                
                                
                                
                                
                             %verifico che la sorgente esiste nel
                             %vettore_percorso
                                
                           if nodi_visitati(j6)==self.vettore_percorso(n1,j2)
                              
                               
                               
                               
    
                              
                              
                              %se esiste prelevo tutte le destinazioni del nodo
                            
                              if nodi_visitati(j6)~=vb
                              
                           edges2=ver.connectedEdges(edges,nodi_visitati(j6));
    
    %copio in un vettore in una nuova riga e nella stessa colonna il valore
    %della destinazione
    
    
                              end
    
    %tutte le destinazioni le imposto sorgenti 
                                    for j8=1:length(edges2)
                       
                                             
                                conta_nodi_sorgenti=conta_nodi_sorgenti+1;
                               nodi_sorgenti(conta_nodi_sorgenti)=edges2(j8);
                                    
                              
                              
                                    end 
                                                  
                                                  
    
                           
                           
    
                           
    
                           
                           %copio tutte le destinazioni 
                           for j=1:length(edges2)
                        
                               
                               
                                   
                                                      
                               
                               if length(edges2)>=2
    
    if vertices.conta_righe==1
        
        
        
                                   
                                   conta_edge=conta_edge+1;
    
                                   
                                   vertices.conta_colonne=conta_edge;
    end
    
                                 
                                   
                               end
                           
                               conta_edge=conta_edge+1;
                                   
                                   %scorro le righe
                                   for k=1:n1
                                           
                                           %copio i valori in una nuova colonna
                                           %dei valori in quanto esisite un
                                           %nuovo percorso
                                           
                                           
                                           if k==n1
                                                                                      
                                             self.vettore_percorso(k,m1+conta_edge)=self.vettore_percorso(n1,j2);
    
                                               
                                           self.vettore_percorso(k+1,j2)=edges2(j);
    
                                          
                                          
                                         
                                            
                                           
                                           
                                   
                                           
                                   end
                                           
                                           
                               
                           
                           
                           
    
                           
                            
                             
                          
                           
                           end
                           
                               
                           end
                               
                           
                           
                          
                           end
                           
                           
                                  
                                    
                                    
                           
                           
                           
                            end
                            
      
                           
      end
      
      
                                        end
    
                           
    Ho provato con questo con i vettori ma nn ci riesco, qualche suggerimento?

    
    
    
     function [vertice,nodi]=DFS_Visit(edges,vertices,self,nodi_visitati,vb,conta_impo_colore,conta_nodo_trovato)
        
        
        
        %con un ciclo copio sul vettore nodi_sorgenti tutte le destinazioni
        %raggiugibili da dove poi viene passatto come terzo parametro alla chiamata 
        %DFS_Visit(edges,vertices,self,nodi_visitati,vb,conta_impo_colore,conta_nodo_trovato)
        
        
        for j6=1:length(nodi_visitati)
                                         
      
            
            
            
           vertices.conta_righe=vertices.conta_righe+1;
                               
                                   
                                   
              
                                
                           
                
                           	
             
                                   
    %copio tutte le possibili destinazioni sul vettore
    %percorso solo una volta
                        
                        
         
         display(vertices.conta_righe);
         
         if vertices.conta_righe==1 
             
             
     for j=1:length(nodi_visitati)
           
                 
                 
       self.vettore_percorso(vertices.conta_righe,j)=nodi_visitati(j6);
    
            display(self.vettore_percorso);
                                     
                                     
         end
                            
         end
         
         
       
         [n1,m1]=size(self.vettore_percorso);
         
         
           for j2=1:m1
    
           if nodi_visitati(j6)==self.vettore_percorso(n1,j2)
                              
         
      if nodi_visitati(j6)~=vb
         
                      
                            
                           
        %possibili sorgenti
                           
                                       
                           
     conta_edge=0;
                           
      conta_nodi_sorgenti=0;
    
                           
    
       %dimensione riga e colonna  
                                    
                            
     [n1,m1]=size(self.vettore_percorso);         
    
    
                                                                    
       display(self.vettore_percorso);
                                                                   
                               
                               
                               
    
                              
                              
     %se esiste prelevo tutte le destinazioni del nodo
                            
                              
                                  
                                  
    
       edges2=ver.connectedEdges(edges,nodi_visitati(j6));
                           
                           
                           
      
                           
                           
                           
                           
        for j8=1:length(edges2)
                       
       %contatore nodi sorgenti
                                  
                           
     conta_nodi_sorgenti=conta_nodi_sorgenti+1;
        nodi_sorgenti(conta_nodi_sorgenti)=edges2(j8);
                               
                               
                               
                               
         if nodi_sorgenti(conta_nodi_sorgenti)==vb
                                   
    indice=conta_nodi_sorgenti;
     end
    %copio in un vettore in una nuova riga e nella stessa colonna il valore
    %della destinazione
    
    
    display('edg');
    
    
    display(edges2);
                              
        
    
         end
    
                           
                                              
       [n2,m2]=size(self.vettore_percorso);         
                             
        %copio sul vettore tutti i  valori pari a
         %valore delle destinazioni nella colonna j2
           %trovata  da dove risiede la sorgente trovata
           
           
           
           if self.vettore_percorso(n1,j2)~=vb
                 for k=1:n2
    
              for j=1:length(edges2)
                                        
                 self.vettore_percorso(k,m2+j)=self.vettore_percorso(k,j2);
               display(self.vettore_percorso);
    
                                          end
           if k==n2
                                                          
            for k3=1:length(edges2)
                                                              
        %copio su tutti
           %ivettori le
            %destinazioni
               %ragggiungibili
               %sul vettore
              %self.vettore_percorso
                                                          
        self.vettore_percorso(n2+1,m2+k3)=edges2(k3);
                                                      end
                                          end
                                          
                                end
                                             
                                end
                                
                                            
                                                            
       
      end                            
                           
                                                 
                                                 
                                
                           
      
      
                           
                           end
                                  
                                  
                                  
                                   
                                   end
                             
        end
           
            
           
                     
           
                                                                   
                           
                       
                                    
                                                         
    
          
              
                       
                    
         [n,m]=size(self.vettore_percorso);
                    
     %chiamata della funzione DFS
           
     for j=1:length(nodi_sorgenti)
                                  
          if nodi_sorgenti(j)~=vb
                                      
                                      
                                      
                               
          self.conta_v=1;
                             
     display(conta_visita);
                                        
      display('nkl');
    
                              
             display(conta_visita);
                              
           display(nodi_sorgenti);
                              
          
           
          else
              
              self.conta_v=0;
              
          end
          
     end
           if self.conta_v==0
                                  
                                  
          DFS.DFS_Visit(edges,vertices,self,nodi_sorgenti,vb,conta_impo_colore,0);
    
                              
                             
     end
                              
    
     end
                           
                           
    
                              
                           
                                        
    
            
                          
       %copio sul vettore tutte i percorsi fino a raggiungere
           %la destinazione
             
             
        [n3,m3]=size(self.vettore_percorso);
                 
                                                           
       
         for j3=1:m3
    
    
     if self.vettore_percorso(j4,j3)==vb
                                                         
                                                           
         conta_nodo_trovato=1;
                                                           
                                                           
                                                           
     [n3,m3]=size(self.vettore_percorso);         
                
                                                           
                                                           
    display('j3');
         conta_visita=1;
    display(j3);
                                                         
    conta_percorso=conta_percorso+1;    
        for j7=1:m3
    
            
            if j7==j3
                    for j8=1:n3
    vettore_nuovo_percorso(conta_percorso,j8)=self.vettore_percorso(j8,j3);
                  display(vb);
             
      end
                                                           
        
            end
                
        end                              
                       
     
                                                           
                                      
                                                                                                        
                                                     end                                      
                                                      
                                                                    
                                                                    
                                                           end
                                                                            
                                                   
    
        
        end
            
            
    
    

    vettore_nuovo_percorso =

    1 2 3 4

    nodi

    nodi =

    1 2 3 4


    nodi_sorgenti =

    1 4

    'BLACK'

    'BLACK'

    'BLACK'

    'BLACK'


    ans =

    1 1 1 1 1 1 1
    0 2 3 2 2 2 2
    0 0 0 3 4 3 3
    0 0 0 0 0 1 4


    conta_nodo_trovato =

    0


    ans =

    1 1 1
    0 2 3


    nodi_sorgenti =

    2 3


    vettore_nuovo_percorso =

    []

    nodi

    nodi =

    []


    nodi_sorgenti =

    2 3

    'BLACK'

    'BLACK'

    'BLACK'

    'WHITE'


    ans =

    1 1 1
    0 2 3


    nodi =

    []

    perchè mi cancalla il vettore?
Devi accedere o registrarti per scrivere nel forum
2 risposte