Estou compartilhando hoje um trabalho interessante que eu e mais alguns amigos da faculdade desenvolvemos em MATLAB.
Não temos aulas dessa linguagem na faculdade, mas nosso professor de
programação estruturada sorteou algumas linguagens e pediu que o grupo desenvolvesse um programa de 30 a 50 linhas nessa linguagem.
Ninguém do nosso grupo tinha conhecimentos sobre
MATLAB. Tivemos pouco menos de 2 meses para aprender pelo menos um pouco sobre a linguagem por conta própria. Isso tudo com o intuito de nos incentivar a auto aprendizagem.
Inicialmente não sabia oque fazer...
Nesse semestre fizemos alguns estudos simples sobre métodos de ordenação de vetores. Eu gostei do assunto, pesquisei outros métodos e programei alguns deles em C. Isso me incentivou a fazer esse script e ver o tempo que leva para um script em
Bubble Sort ser ordenado e essa mesma ordenação em um método mais eficiente, neste caso o
Shell sort.
Tanto o Shell Sort quanto o Bubble Sort são algoritmos curtos, por isso estes foram os escolhidos. Ainda assim nosso programa ficou com 52 linhas (não contamos as linhas de comentários).
Créditos a todos os membros do grupo:
Alessandro Araujo Rodrigues;
Erick Rondinone Chalegre;
Gean Miguel Falcão Dos Anjos;
George Henrique Wurthmann;
Leandro Carvalho Nogueira;
DESCRIÇÃO DO PROGRAMA
Programa desenvolvido com MATLAB para analisar o desempenho do método de organização de dados Bubble sort e também do método Shell sort, os dados do vetor foram lidos a partir de arquivo (planilha do excel). Ao fim da organização é apresentado um gráfico comparativo entre os dois métodos. Em um deles é apresentado a
quantidade de iterações realizadas para se fazer a ordenação e no outro é apresentado o
tempo em milissegundos utilizado para se fazer toda a ordenação.
Para a realização desses testes foram utilizados 2000 (dois mil) números aleatórios que estão armazenados em um arquivo do Excel (ordenar.xlsx). Esses números foram gerados aleatoriamente através do Excel com auxilio das funções
rand e int.
Para comprovar a funcionalidade do programa, esse script ainda escreve nesse mesmo arquivo do Excel (ordenar.xlsx) os números ordenados, tanto do bubble sort quanto do shell sort.
PROGRAMA
%%%%% %%%%% %%%%%BUBBLE SORT %%%%% %%%%% %%%%%
importdata('ordenar.xlsx');
input('Números a serem ordenados: ');
disp(xlsread('ordenar.xlsx','B1:B2000'))
x = [xlsread('ordenar.xlsx','B1:B2000')]; n = length(x); iterations_bs = 0;
time_aux1 = float('single'); time_aux1 = clock;
for(i2 = 1:n-1)
troca = 0;
for(j2 = 1:n-i2)
if(x(j2) > x(j2+1))
aux = x(j2);
x(j2) = x(j2 + 1);
x(j2 + 1) = aux;
troca = 1;
end
iterations_bs = iterations_bs + 1;
end
if(troca == 0)
break;
end
end
time_aux2 = float('single');time_aux2 = clock;
time_bs = float('single'); time_bs = ((time_aux2(5)- time_aux1(5))*60)+(time_aux2(6)- time_aux1(6));
input('Ordenação Bubble sort:');
disp(x)
xlswrite('ordenar.xlsx',x,'E1:E2000');
%%%%% %%%%% %%%%%SHELL SORT %%%%% %%%%% %%%%%
input('Ordenação Shell sort:');
x = [xlsread('ordenar.xlsx','B1:B2000')]; iterations_ss = 0; time_aux1 = clock;
inc = cast(n/2,'int16');
while(inc>0)
for(i2=inc+1:n)
aux = x(i2);
j2 = i2;
while(j2>inc && x(j2-inc)>aux)
x(j2) = x(j2-inc);
j2 = j2-inc;
iterations_ss = iterations_ss + 1;
end
x(j2) = aux;
iterations_ss = iterations_ss + 1;
end
inc = cast(floor(double(inc) /2),'int16');
end
time_aux2 = clock;
time_ss = float('single'); time_ss = ((time_aux2(5)- time_aux1(5))*60)+(time_aux2(6)- time_aux1(6));
disp(x)
xlswrite('ordenar.xlsx',x,'H1:H2000');
%%%%%%%Comparação entre os modos de ordenação%%%%%%%
graph = [iterations_bs iterations_ss];
graphtime = float('single'); graphtime = [time_bs time_ss];
input('Bubble sort: Quantidade de iterações: '); disp(iterations_bs);
input('Bubble sort: Tempo em segundos: '); disp(time_bs);
input('Shell sort: Quantidade de iterações: '); disp(iterations_ss);
input('Shell sort: Tempo em milisegundos: '); disp(time_ss);
EXPLICAÇÃO DO CÓDIGO
Linha 1: Comentário para separação do método Bubble_Sort.
Linha 2: Importa os dados do arquivo “ordenar.xlsx”.
Linha 3: Informa a seguinte mensagem na tela: “Números a serem ordenados”.
Linha 4: Mostra o que o sistema leu entre as células B1 à B2000.
Linha 5: Atribui ao vetor “x” os dados de B1 à B2000, e em “n”atribuímos o tamanho do vetor “x” (2000 posições) e iniciamos a variável “iterations_bs” com valor zero.
Linha 6: Iniciamos o vetor “time_aux1” como “float” (Real), e atribuímos a mesma os valores relacionados ao relógio do computador local (Função Clock), sendo este o momento em que a ordenação se iniciou. Obs.: A função clock armazena em um vetor de 6 posições, sendo elas para: ano, mês, dia, horas, minutos, segundos.
Linha 7: Iniciamos uma repetição que ira de 1 (i2) até 1999 (n-1). Essa repetição percorrerá o vetor “x”.
Linha 8: Iniciamos a variável troca com o valor zero.
Linha 9: Repetição que irá de 1 até n-i2. Como “n” decrementa o valor de “i2” a cada repetição a posição até qual se percorrerá será diminuída em um.
Linha 10: Condição para trocar/Não Trocar.
Linha 11 à 13: É utilizada a variável “aux”, para inverter os valores de posição caso a condição seja verdadeira (Linha 10).
Linha 14: Atribui a variável “troca” o valor 1 (um). Obs.: Essa variável é utilizada para verificar se houve alguma troca durante o laço.
Linha 15: Fechamento do bloco “if”.
Linha 16: Incrementa a variável “iterations_bs” em 1 (um).
Linha 17: Fechamento do bloco “for”.
Linha 18 à 20: Se não houver troca, interrompe o laço.
Linha 21:Fechamento do bloco “for”.
Linha 22:Iniciamos o vetor “time_aux2” como float (Real), e atribuímos a mesma os valores relacionados ao relógio do computador local (Função Clock), sendo este o momento em que a ordenação se finalizou. Obs.: A função clock armazena em um vetor de 6 posições, sendo elas para: ano, mês, dia, horas, minutos, segundos.
Linha 23:Atribui a variável “time_bs” o calculo do tempo de execução. (time_aux2 - time_aux1). No calculo usamos apenas as posições 5 e 6, que são, respectivamente, referentes a minutos e segundos.
Linha 24:Informa a seguinte mensagem na tela: “Ordenação Bubble sort”.
Linha 25: Mostra o vetor “x” já ordenado.
Linha 26: Escreve no arquivo “ordenar.xlsx” o vetor “x” de E1 à E2000.
Linha 27: Comentário para separação do método Shell Sort.
Linha 28: Informa a seguinte mensagem na tela “Ordenação Shell sort”.
Linha 29: Atribui ao vetor “x” novamente os valores desordenados (B1 à B2000),iniciamos a variável “iterations_ss” com valor 0 (zero) e atribuímos a “time_aux1” os valores relacionados ao relógio do computador local (Função Clock),sendo este o momento em que a ordenação se iniciou.
Linha 30: Atribuímos a variável “inc” o valor de (n/2) e com a função cast convertemos o numero para inteiro.
Linha 31: Repetir enquanto “inc” for maior que 0 (zero).
Linha 32:Repetir de “inc+1” até “n”.
Linha 33: A variável “aux” recebe o valor do vetor x(i2) para caso seja realizada a troca posteriormente.
Linha 34: Atribui a variável “j2” o valor de “i2” (como não podemos mudar o valor de “i2”, pois é um contador, passamos o valor para “j2” para podermos manipula-lo).
Linha 35 à 37: Enquanto as condições forem verdadeiras, sãoinvertidas as posições dos valores do vetor (Iniciado a troca).
Linha 38: Incrementa a variável “iterations_ss” em 1 (um).
Linha 39: Fechamento do bloco “while”.
Linha 40: Finalizando a troca das posições do vetor.
Linha 41: Incrementa a variável “iterations_ss” em 1 (um).
Linha 42: Fechamento do bloco “for”.
Linha 43: Atribuímos a variável “inc” o valor de (n/2) e com a função cast convertemos o numero para inteiro. A função “floor” arredonda para menos e a função “double” aumenta a precisão para evitar arredondamentos errôneos.
Linha 44: Fechamento do bloco “while”.
Linha 45: Atribuímos ao “time_aux2” os valores relacionados ao relógio do computador local (Função Clock), sendo este o momento em que a ordenação se finalizou.
Linha 46: Inicia-se a variável time_ss como “float” (Real) e atribui a estao valordo calculo do tempo de execução. (time_aux2 - time_aux1).
Linha 47: Mostra os valores do vetor “x” (Números ordenados).
Linha 48: Escreve no arquivo “ordenar.xlsx” o vetor “x” ordenado, de H1 à H2000.
Linha 49: Comentário para separação da parte onde fazemos as comparações.
Linha 50: Armazena no vetor “graph” o valor “iterations_bs” e “iterations_ss”. Vetor de 2 (duas) posições.
Linha 51: O vetor “graphtime” é iniciado como “float” (Real). Atribuindo a esta o valor de “time_bs” e “time_ss”. Vetor de 2 (duas) posições.
Linha 52 à 55: Mostra ao usuário os resultados da comparação (Quantidade de iterações e Tempo de execução de cada um).
IMAGENS DO PROGRAMA
Figura 1.0 A imagem acima representa a tela inicial
do programa, onde é apresentado para o usuário os números na ordem atual (os
números a serem ordenados).
Figura 1.1A imagem acima representa a
ordenação feita pelo método Bubble sort.
Figura 1.2A imagem acima representa a
ordenação feita pelo método Shell sort.
Figura 1.3A imagem acima apresenta a tela
do programa que mostra ao usuário a quantidade de iterações e o tempo em
milissegundo de cada um dos métodos utilizados em nosso programa (Bubble sort e
Shell sort).
Figura
1.4 Ao lado podemos observar a
“Workspace” do MATLAB, onde são mostradas as variáveis utilizadas em nosso
programa.
Quatro dessas variáveis foram
utilizadas para gerar um gráfico de comparação entre os 2 métodos que
utilizamos em nosso programa. São elas: iterations_bs, iterations_ss, time_bs e
time_ss.
Os gráficos devem ser gerados a
partir de vetores ou matrizes, então armazenamos no vetor graph as variáveis iterations_bs
e iterations_ss e no vetor graphtime
as variáveis time_bs e time_ss.
Através desses vetores geramos os
dois gráficos de comparação através do botão contornado de vermelho (Select
data to plot).
Figura 1.5 A imagem acima mostra o gráfico
que compara a quantidade de iterações realizadas pelo Bubble sort (coluna
esquerda) e a quantidade de iterações realizadas pelo Shell sort (coluna
direita).
Figura 1.6 A imagem acima mostra o gráfico
que compara o tempo em que foi feita a ordenação pelo Bubble sort (coluna
esquerda) e o tempo em que foi feita a ordenação pelo Shell sort (coluna
direita).
Figura 1.7 A imagem acima mostra o arquivo
do Excel (ordenar.xlsx) onde geramos os números aleatórios utilizados em nosso
programa. Tanto para o Bubble Sort quanto para o Shell Sort foram utilizados
exatamente os mesmos números, que são os números que estão de B1 à B2000.
Figura 1.8:A imagem acima mostra o arquivo
do Excel (ordenar.xlsx) com os números já ordenados, sendo a coluna E referente
ao Bubble Sort e a coluna H referente ao Shell Sort. Podemos observar que o
resultado é exatamente o mesmo, pois, como explicado anteriormente, as
ordenações foram realizadas com os mesmos números para os dois métodos.
COMENTÁRIOS SOBRE A
LINGUAGEM DE PROGRAMAÇÃO UTILIZADA
MATLAB é uma linguagem de programação
muito poderosa. É claro que durante nossa pequena pesquisa não utilizamos todo
seu poder, mas conseguimos observar bem isso através de sua biblioteca de
funções. Existe uma quantidade enorme de comandos para os mais diversos usos.
Deparamo-nos com muito conteúdo para engenharia e
matemática. Em nossas pesquisas observamos que engenheiros e matemáticos
utilizam o MATLAB como ferramenta de pesquisa. Criam através dele modelos
matemáticos ou simbólicos (gráficos) para auxiliar em seus projetos. E ainda é
possível utiliza-lo para pesquisas cientificas, pois é de grande facilidade trabalhar
com fórmulas no MATLAB e com grande velocidade. Além de tudo isso é possível
utilizar os conceitos de orientação a objeto, criar funções, gráficos, trabalhar com som, etc.
Encontramos alguns vídeos bem explicados,
entre eles, um dos que nos mais ajudou a entender a linguagem foram os próprios
vídeos disponíveis no portal do MATLAB (http://www.mathworks.com/products/matlab/examples.html).
BIBLIOGRAFIA
CELES, Waldemar. CERQUEIRA, Renato. RANGEL, José
Lucas. Introdução a Estruturas de Dados.
2004, Elsevier Editora.
http://das.ufsc.br/~nestor/cursos/matlab/matlab/matlab.html.
Acesso em 19/10/2012 ás 15h22min.
http://www2.dcc.ufmg.br/disciplinas/aeds2_turmaA1/bubblesort.pdf.
Acesso em 24/10/2012 ás 11h17min.
http://www.del.ufms.br/tutoriais/matlab/apresentacao.htm.Acesso
em 24/10/2012 ás 11h40min.
http://www.ic.uff.br/~aconci/GuiaMatLab.pdf. Acesso
em 24/10/2012 ás 09h32min.
http://www.mathworks.com/products/matlab/examples.html.
Acesso em 25/10/2012 ás 12h09min.
http://www2.peq.coppe.ufrj.br/Pessoal/Professores/Arge/COQ897/Matlab/matlab.pdf.
Acesso em 25/10/2012 ás 14h05min.
http://www.slideshare.net/ander-san/trabalho-shell-sort.
Acesso em 19/10/2012 ás 11h16min.
http://www.youtube.com/playlist?list=PL4D57B6012FE85563.
Acesso em 24/10/2012 ás 10h27min.
http://www.youtube.com/watch?v=CmPA7zE8mx0&feature=relmfu.
Acesso em 19/10/2012 ás 10h03min.
http://www.youtube.com/watch?v=M3bS6w1R434. Acesso
em 19/10/2012 ás 09h51min.