Para esta ativiade vocês deverão:
Baixar e instalar o programa R entre aqui: https://vps.fmvz.usp.br/CRAN/ e escolha a versão que lhe serve.
Baixar e instalar o programa RStudio, para tornar sua vida mais fácil. https://posit.co/download/rstudio-desktop/
Quando os 2 estiverem rodando…
Instale o pacote: “beepr” utilizando a aba “ferramentas” (Tools)
#começa aqui
dawkinzinho<-function(atributo,taxa_de_m,tamanh_prole){
library(beepr)
#determinar início para gerador de nos. aleatórios
set.seed(1234, kind="Mersenne-Twister")
## definindo atributo formado por combinação de letras e espaço
target <- unlist(strsplit(atributo, ""))
##conjunto de caracteres que pode ser usado para formar o atributo
charset <- c(LETTERS, " ")
charset
##combinação inicial ou "parental" gerada aleatoriamente
parent <- sample(charset, length(target), replace=TRUE)
parent
##a taxa de mudanca das letras, i.e. a taxa de mutação
mutaterate <- taxa_de_m
## tamanho da prole
C <- tamanh_prole
#medida de fitness (aptidão)para cada sequência de caracteres - relativa a "frase alvo"
fitness <- function(parent, target) {
sum(parent == target) / length(target)
}
#função para gerar primeiro "atributo", i.e primeira frase
mutate <- function(parent, mutaterate, charset) {
#Probabilidades aleatórias extraidas de uma distribuição uniforme 'runif'
#Quantas? - uma para cada possível caracater no atributo
p <- runif(length(parent))
#Quantas dessas probabilidades são menores que a taxa de mutação?
nMutants <- sum(p<mutaterate)
#condição para rodar : nMutants é diferente de 0, i.e. é verdadeiro
#In the case of numeric vector, zero is taken as FALSE, rest as TRUE.
if (nMutants) {
parent[ p < mutaterate ] <-sample(charset, nMutants, replace=TRUE)
}
parent
}
#função para juntar tudo e gerar "frases filhote"
evolve <- function(parent, mutate, fitness, C, mutaterate, charset) {
#criando os filhotes de acordo com número escolhido para "C" e usando a função "mutate"
#simplify=FALSE para que seja mantido o formato
children <- replicate(C, mutate(parent, mutaterate, charset),simplify=FALSE)
#gerando lista de todos os fenótipos, i.e. pais+filhotes
children <- c(list(parent), children)
#"pinçando" filhote com fitness máximo
#'target' precisa ser definido para rodar a função 'fitness'
children[[which.max(sapply(children, fitness, target=target))]]
}
data_frame = data.frame(col1 = numeric(),
col2 = numeric(),
col3 = numeric(),
col4 = numeric(),
stringsAsFactors = FALSE)
i<-0
while ( ! all(parent == target)) {
i<-i+1
parent <- evolve(parent, mutate, fitness, C, mutaterate, charset)
resultao<-c(format(i, width=4),
format(C,width=4),
format(mutaterate,width=4),
formatC(fitness(parent, target), digits=2, format="f"))
data_frame <- rbind(data_frame,resultao,stringsAsFactors=FALSE)
}
beep(4)
names(data_frame)<-c("no.de gerações","tamanho da prole","taxa de mut.","aptidão")
print(tail(data_frame))
}
# acaba aqui
Exemplo
dawkinzinho("EU NAO SEI NADA DE R",0.1,10)
## no.de gerações tamanho da prole taxa de mut. aptidão
## 383 383 10 0.1 0.95
## 384 384 10 0.1 0.95
## 385 385 10 0.1 0.95
## 386 386 10 0.1 0.95
## 387 387 10 0.1 0.95
## 388 388 10 0.1 1.00
OBS: No atributo, utilizar apenas letras ou espaçov (nada de acentos,cedilha, etc) e utilizar “ no começo e final para especificar que é texto.
Lembrar que em cada linha do resultado temos: no. de gerações transcorridas, no. de filhotes, taxa de mutação, fitness da frase que se reproduz, e o frase (atributo).
Possível forma de analisar efeitos da taxa de mutação e tamanho da prole no no. de gerações transcorridas para gerar o atributo com fitness máximo.
Criar tabela em excel e copiar a última linha dos resultados
Rodar a simulação com novos valores (isto é rodar a função novamente com novos valores) e repetir passo 1.
Analisar relação (correlação ou outra estatística) entre valores na tabela.
Boa sorte!