Você está na página 1de 3

UDESC UNIVERSIDADE DO ESTADO DE SANTA CATARINA

CENTRO DE CIENCIAS TECNOLOGICAS CCT


Joinville DEPARTAMENTO DE ENGENHARIA ELETRICA DEE

Redes para Automao Industrial (RAI) Aula Pratica

Prof. Eduardo Bonci Cavalca

Aluno:

Aluno:

IMPLEMENTAAO DO ALGORITMO DE DIJKSTRA

Objetivo: Apresentar ao aluno as dificuldades e caractersticas da


implementao do Algoritmo de Dijkstra utilizado para roteamento.

Prtica

Considere a figura abaixo, representando uma rede simples, com ns


suas ligaes e seus respectivos pesos:

Deseja-se determinar a menor distancia, com relao aos pesos


apresentados na figura, entre o no a" (no 1) e o no b" (no 5).

1) Desenvolva um cdigo em Scilab que implemente o Algoritmo de Dijkstra


para a rede apresentada. Utilize o Scinotes para editar e salvar seu cdigo.
Salve o arquivo com o nome no seguinte formato:
sobrenome1 sobrenome2.sce"

2) Utilize // para fazer os comentrios pertinentes no cdigo e envie o


arquivo final por e-mail ao professor. Este Cdigo ja ira contar como relatorio.
nos = [1 2 3 4 5 6]; //declara quais so os ns que existem na rede
lig(1).no = [2 3 6]; //declara quais so os ns que esto ligados em cada n da rede
lig(2).no = [1 3 4];
lig(3).no = [1 2 4 6];
lig(4).no = [2 3 5];
lig(5).no = [4 6];
lig(6).no = [1 3 5];
peso(1).lig = [7 9 14]; //declara quais so os pesos das ligaes de cada n, seguindo a
// mesma sequncia que declarou quais os ns ligados a rede
peso(2).lig = [7 10 15];
peso(3).lig = [9 10 11 2];
peso(4).lig = [15 11 6];
peso(5).lig = [6 9];
peso(6).lig = [14 2 9];

inf=1e12; //define o valor de infinito para a comparao dos valores da rede

no_inicio=1; //define o n inicial


no_destino=5; //define o n final

clear peso_no; // Zerar as variveis para ter certeza que comeam com zero
clear fora;
clear no_pai;
clear rota;

peso_no=[inf inf inf inf inf inf]; //define o peso de incio de todos os ns como infinito
peso_no(no_inicio)=0; //zera o peso do n incio, porque o peso de sair dele e chegar a ele
//mesmo zero.
fora=[0 0 0 0 0 0]; //define o vetor fora, que ir dizer se um n est fora da rota ou no
no_pai=[0 0 0 0 0 0]; //seta todas as componentes do no_pai para zero
no_pai(no_inicio)=no_inicio; //o n_pai do n_inicio o prprio n_inicio
no_atual = no_inicio; //inicialmente o n atual o n_inicio

while no_atual ~=0 do //a rotina abaixo ocorrer enquanto o n_atual for diferente de zero
for j= 1:length(lig(no_atual).no) do // J ir variar de 1 at o tamanho do vetor LIG do n
//atual
if peso(no_atual).lig(j)+peso_no(no_atual) < peso_no(lig(no_atual).no(j)) then
//a rotina abaixo ser executada se o peso da ligao do n atual
//mais o peso j armazenado nele mesmo for menor que o peso da ligao
//do n no n atual
peso_no(lig(no_atual).no(j)) = peso(no_atual).lig(j)+peso_no(no_atual);
// caso o peso seja menor, o novo peso armazenado
no_pai(lig(no_atual).no(j))=no_atual; //o n pai recebe o n anterior para ficar
// com a rota mais curta
end //encerra a rotina do if
end //encerra a rotina do for

fora(no_atual)=1; //o vetor fora recebe 1 na posio do n atual, indicando que este n
//j foi analisado e no precisa ser novamente analisado
for i=1:length(lig(no_atual).no) do // i vai variar de 1 at o tamanho do vetor LIG do n
//atual, para verificar quais ns esto ligados
if fora(lig(no_atual).no(i))==0 then //se o n atual no estiver fora da anlise, continua
//e entra no comando do if
no_atual = lig(no_atual).no(i); //o n atual recebe as ligaes existentes no n de
//analise
break //para a anlise e volta para o prximo valor de i
end //encerra a rotina do if
end //encerra a rotina do for
if sum(fora) == length(nos) then //compara se o nmero de ns que esto fora da
//anlise igual ao nmero total de ns.

no_atual=0; //se o no_atual for igual a zero , indica que todos os ns foram analisados
end //encerra a rotina if
end //encerra a rotina while

no_atual=no_destino; //o n destino armazenado no n atual, pois a anlise de rota feita


//do final ao incio
rota=[no_destino]; // o vetor rota inicialmente tem s um elemento, que o n de destino

while no_atual ~= no_inicio do //esta parte do programa vai do ltimo n


rota = [no_pai(no_atual) rota] //at o primeiro, sempre atravs do no_pai, que o
// melhor caminho, armazenando no vetor ROTA
no_atual = no_pai(no_atual); //isso garante que o vetor ROTA contenha o melhor
//caminho possvel, n na ordem do incio at o fim
end //encerra a rotina while