{{ :bie5782:01_curso_atual:alunos:trabalho_final:vialrogo:2017-05-04_15.02.14_small.jpg?300 |}}
====== Victor Alberto Romero ======
Engenheiro eletrônico e de computação. Mestrando em Engenharia Mecânica na USP. Atualmente vinculado ao laboratório de Acústica e Meio Ambiente ([[http://lacmam.poli.usp.br/|LACMAM]]). Desenvolve pesquisa em acústica submarinha, especificamente no levantamento e análise de paisagens acústicas.
===== Exercícios =====
[[.:exec]]
===== Proposta trabalho final =====
==== Plano A: compareSort ====
Muitos dos que têm chegado no R, têm sido motivados pela necessidade de processar seus dados e automatizar as tarefas que já vinham desenvolvendo com outras ferramentas. Porém, a grande maioria não tem experiência prévia programando. Depois de ter um domínio razoável do R, para muitas pessoas pode ser interessante aprofundar mais os conceitos formais da programação, especificamente na criação de algoritmos. Existem múltiplas técnicas para ensinar a fazer isto, mas uma das mas divertidas e didáticas é através dos algoritmos de ordenação (por exemplo, é o caminho usado por Cormen em seu célebre [[https://mitpress.mit.edu/books/introduction-algorithms|"Introduction to Algorithms"]]). Para isto estou propondo uma função que permita comparar algoritmos de ordenação graficamente para estudá-los. Adicionalmente vão ser criadas algumas funções auxiliares de ordenação (inicialmente estou pensando em 3: [[https://pt.wikipedia.org/wiki/Quicksort|quicksort]], [[https://pt.wikipedia.org/wiki/Merge_sort|mergesort]] e [[https://pt.wikipedia.org/wiki/Insertion_sort|insertionsort]]) como exemplo.
Função principal:
compareSort(fun, vals, step=0.5, ...)
fun -> é o nome da função de ordenação a comparar. Pode ser uma lista de funções.
vals -> é um vetor com valores numéricos a serem ordenados.
step -> é o intervalo entre uma imagem e outra.
... -> parâmetros a serem passados às funções de ordenação e a função par
A saída esperada da função é um gráfico com uma ou mais animações comparando os algoritmos. Algo parecido com isto:
{{ :bie5782:01_curso_atual:alunos:trabalho_final:vialrogo:fq0a8hx.gif?direct&200 |}}
Funções auxiliares (aplicáveis para todas):
quicksort(vals)
retorna um vetor com os valores ordenados pelo método quicksort.
==== Plano B ====
Fazer uma função que pinte o fractal de [[https://pt.wikipedia.org/wiki/Curva_de_Koch|koch]]!!
{{ :bie5782:01_curso_atual:alunos:trabalho_final:vialrogo:von_koch_curve.gif?direct&200 |}}
A função proposta é:
kochPlot(n, step, ...)
n -> é um número como o nível de profundidade desejado do fractal
step -> é o intervalo entre uma imagem e outra.
... -> os parâmetros que vão ser repassados para a função segment
Olá Victor,
Vejo que você escolheu tarefas clássicas de cursos de computação! A animação da comparação das funções de ordenação é muito interessante. Um exercício desses não é típico para um estudo de R, em parte porque a perda de eficiência ao se implementar suas próprias funções de baixo nível em R é enorme em comparação com as funções base, implementadas em C. Sugiro como curiosidade que você faça a comparação de eficiência entre a sua implementação de qualquer sort com o sort do r-base, é impressionante. Outra peculiaridade do R, como costuma acontecer em linguagens de alto-nível, é que a escolha da estrutura de dados determina a performance de operações em cima desses dados. Isso é só um comentário de alguém que se interessa pelo assunto! Agora preciso comentar diretamente as suas escolhas de proposta.
Uma das exigências para esse trabalho é que as funções sejam *genéricas*. Sua proposta B é muito pouco genérica, dado que ela só desenha esse fractal específico. Dessa forma, recomendo que você faça a proposta A, ou alguma variação dela.
A proposta A é bem ambiciosa, dado que pra fazer uma animação dessas você vai precisar guardar a ordenação do vetor a cada operação. Como isso vai ter que ser implementado por você, imagino que o parâmetro "fun" vai ser uma opção dentro de um número bem limitado de opções, não? Sugiro não se preocupar a princípio em plotar muitas funções ao mesmo tempo - na verdade fazer a animação de uma ordenação só de cada vez já seria bom pra começar. Por outro lado, se você só implementar um método de ordenação, a função fica muito pouco genérica. Você poderia incluir algum output em texto também por exemplo, o número total de operações que foi usado para ordenar.
----//[[marinacs@gmail.com|Mali]]//
===== Página de Ajuda =====
sortComparing package:unknown R Documentation
Compara dois algoritmos de ordenação.
Description:
A função recebe dois funções funA e funB e um conjunto de números vals e
retorna um video em mp4 com a comparação da execução dessas funções sobre
o conjunto de números. A função pode ser chamada com qualquer algoritmo
enquanto ele retorne todos os estados intermediários em forma de matriz.
Usage:
compareSort(funA, funB, vals, interval=0.05, width=800, height=600, ...)
Arguments:
funA: Uma função de ordenação que retorna uma matriz com todos os estados.
funB: Uma função de ordenação que retorna uma matriz com todos os estados.
vals: Um vetor de valores a serem ordenados
interval: O intervalo entre cada plot da animação
width: A largura da animação
height: A altura da animação
...: Parâmetros a serem passados para barplot
Details:
As funções funA e funB podem ser qualquer função de ordenação da forma:
funA(vect, stepLog=FALSE)
Na qual vect e um vetor numérico e stepLog define se a função retorna só o
valor final ou os passos intermediários.
Value:
A função vai criar um vídeo animation.mp4 com a comparação de funA e funB
Note:
A função requer o pacote animagion.
Author(s):
Victor Alberto Romero
vialrogo@gmail.com
References:
https://pt.wikipedia.org/wiki/Insertion_sort
https://pt.wikipedia.org/wiki/Selection_sort
See Also:
animation, barplot
Examples:
compareSort(selectionSort, insertionSort, vals = sample(seq(1,30)), interval=0.01)
compareSort(insertionSort, selectionSort, vals = sample(seq(1,100),30), interval=0.01)
===== Código da Função =====
# insertionSort: Função para ordernar numero ascendentemente mediante o algoritmo
# insertion sort: https://pt.wikipedia.org/wiki/Insertion_sort
insertionSort <- function(vect, stepLog=FALSE) {
acc <- c() # matriz que vai contener todos os estados gerados
for( i in seq(1,length(vect))) { # Para cada posição do vetor
for(j in seq(1,(length(vect)-1))) { # Para cada uma das outras posições
if(vect[j] > vect[i]) { # Comparo se a posição atual é menor que as outras
aux <- vect[i] # Guardo o valor numa variavel auxiliar
vect[i] <- vect[j] # Troco os dos números
vect[j] <- aux # Recupero o número guardado na variavel auxiliar
}
acc <- c(acc,vect) # Guardo o estado intermediario na matriz
}
}
acc <- matrix(acc, nrow= length(vect)) # formato a matriz em forma matriz
if (stepLog) # Pergunto se quer a saida completa ou só a final
return(acc) # retorno toda a matriz de saida
else # se quer só o vetor final
return(vect) # retorno só o vetor final
}
# selectionSort: Função para ordernar numero ascendentemente mediante o algoritmo
# selection sort: https://pt.wikipedia.org/wiki/Selection_sort
selectionSort <- function(vect, stepLog=FALSE) {
acc <- c() # matriz que vai contener todos os estados gerados
for( i in seq(1,length(vect))) { # Para cada posição do vetor
minor <- Inf # No começo de cada ciclo, o mínimo é infinito
minj <- i # a menor posição é a mesma no começo de cada ciclo
for(j in seq(i,length(vect))) { # Para cada posição MAIS NA FRENTE
if(vect[j] < minor) { # Se encontro um valor menor
minor <- vect[j] # Guardo o valor menor encontrado
minj <- j # Guardo o indice do menor valor encontrado
}
acc <- c(acc,vect) # Guardo o estado intermediario na matriz
}
aux <- vect[i] # Guardo o valor numa variavel auxiliar
vect[i] <- vect[minj] # Troco os dos números
vect[minj] <- aux # Recupero o número guardado na variavel auxiliar
}
acc <- matrix(acc, nrow= length(vect)) # formato a matriz em forma matriz
if (stepLog) # Pergunto se quer a saida completa ou só a final
return(acc) # retorno toda a matriz de saida
else # se quer só o vetor final
return(vect) # retorno só o vetor final
}
library(animation) # Biblioteca para gerar as animações
# compareSort: Função que recebe duas outras funções de ordenação e um vetor de
# valores e gera uma animação para comparar elas.
compareSort <- function(funA, funB, vals, interval=0.05, width=800, height=600,...){
outA <- funA(vals, TRUE) # Evalua a função A
outB <- funB(vals, TRUE) # Evalua a função B
# Define as propriedades da animação
ani.options(interval=interval, ani.width=width, ani.height=height)
saveVideo({ # Começa a salvar as imagens para a animação
nStepsMax <- max(ncol(outA), ncol(outB)) # Calcula qual é mais longa
par(mfrow=c(1,2)) # define o layout do plot
for (i in 1:nStepsMax) { # para cada imagem que vai ser gerada
ia <- i # que indice vai ser plotado para a primeira imagem
ib <- i # que indice vai ser plotado para a segunda imagem
if (i > ncol(outA)) ia <- ncol(outA) # Se terminou, plota o último
if (i > ncol(outB)) ib <- ncol(outB) # Se terminou, plota o último
barplot((outA)[,ia],...) # plota o estado atual
barplot((outB)[,ib],...) # plota o estado atual
}
})
}
===== Arquivos da Função =====
{{:bie5782:01_curso_atual:alunos:trabalho_final:vialrogo:help.txt|}}
{{:bie5782:01_curso_atual:alunos:trabalho_final:vialrogo:sortscomparing.r|}}