Algorytm dijakstra

H1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

Witam,
mam problem z kodem do polecenia poniżej w screenie. Jest prawie cały, brakuje paru rzeczy, których nie mogę przeskoczyć.
Z góry dziękuje za pomoc.
Kod ma być w języku scilab.
Tam gdzie jest wykropkowane to znaczy, że czegoś brakuje

Kopiuj
function [D,R]=dijkstra(S,b)
    // S -- macierz symetryczna odleglosci miedzy wezlami, n x n
    // b -- wezel poczatkowy
    // D -- wektor odl. od poczatkowego do pozostalych
    // R -- drogi z b do pozostalych wezlow
    // macierz n x n o formacie k-tego wiersza
    // [b,w1,w2,w3,...,wp,k,0,0,..,0] gdzie
    // b-w1-w2-...-wp-k to droga z b do k
    n=size(S,1);
    big=1.0e12;
    R=zeros(n,n);       R(b,1)=b;               // b -- numer wezla poczatkowego
    D=big*ones(n,1);    D(b)=0;                 // odleglosci z b do pozostaly
    P=[b];              K=1:n;      K(b)=[];    // zbiory celow i poczatkow
    while K~=[]
        S1=S(P,K);                              // macierz odl. miedzy pocz. i celami
        for i=1:size(P,2)
            S1(i,:)=S1(i,:)+.......             // dodajemy do odlegl. celow odl. poczatkow
        end
        [S1k,pos]=min(S1,'r');                  // te trzy linijki konieczne w ogolnym przyp.
        [S1kr,k]=.....;                         // nr. kolumny gdzie min
        r=pos(k);                               // nr. wiersza gdzie min
        D(K(k))=....;                           // odlegl. do znalezionego
        R(K(k),:)=R(P(r),:);                    // przepisujemy pocz. drogi
        R(K(k),sum(R(K(k),:)>0)+1)=K(k);        // dopisujemy wezel konc.
        P=[P,K(k)];                             // usuwamy ostatni znaleziony z celow
        K(k)=....;
    end
endfunction

screenshot-20200702151800.png

H1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

Nie wiem gdzie jest błąd, S1(i,:)=S1(i,:)+S1(:,i); w tej chwili błąd powstaje

Kopiuj
//function [D,R]=dijkstra(S,b)
    // S -- macierz symetryczna odleglosci miedzy wezlami, n x n
    // b -- wezel poczatkowy
    // D -- wektor odl. od poczatkowego do pozostalych
    // R -- drogi z b do pozostalych wezlow
    // macierz n x n o formacie k-tego wiersza
    // [b,w1,w2,w3,...,wp,k,0,0,..,0] gdzie
    // b-w1-w2-...-wp-k to droga z b do k
    n=size(S,1);
    big=1.0e12;
    R=zeros(n,n);       R(b,1)=b;               // b -- numer wezla poczatkowego
    D=big*ones(n,1);    D(b)=0;                 // odleglosci z b do pozostaly
    P=[b];              K=1:n;      K(b)=[];    // zbiory celow i poczatkow
    while K~=[]
        S1=S(P,K);                              // macierz odl. miedzy pocz. i celami
        for i=1:size(P,2)
            S1(i,:)=S1(i,:)+S1(:,i);            // dodajemy do odlegl. celow odl. poczatkow
        end
        [S1k,pos]=min(S1,'r');                  // te trzy linijki konieczne w ogolnym przyp.
        [S1kr,k]=min(S1k,'c');                  // nr. kolumny gdzie min
        r=pos(k);                               // nr. wiersza gdzie min
        D(K(k))=S1kr;                           // odlegl. do znalezionego
        R(K(k),:)=R(P(r),:);                    // przepisujemy pocz. drogi
        R(K(k),sum(R(K(k),:)>0)+1)=K(k);        // dopisujemy wezel konc.
        P=[P,K(k)];                             // ostatni znaleziony konc. do pocz.
        K(k)=[];                                // usuwamy ostatni znaleziony z celow
    end
//endfunction

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.