Algoritmos Genéticos
Aplicación de los algoritmos genéticos al problema de cargar la "mochila"
Para la solución del problema vamos a utilizar el software R y las librerías correspondientes a
algoritmos genéticos.
El programa R puede bajarse de cualquier ropositorio CRAN, es disponible en la mayor parte de
sistemas operativos. Para facilitar la utilización de los comandos de línea se recomienda la
instalación de R-Studio, posteriormente a R. R-Studio localiza el programa R en forma automática
durante su ejecución. R está basado en un lenguaje estadístico de alto nivel basado en S, al cual un
conjunto de contribuidores en todo el mundo han colaborado para la creación de librerías
especializadas en temas específicos. En nuestro caso utilizaremos una librería de algoritmos
genéticos "genalg", y un paquete de graficación "ggplot2".
Para correr R-Studio solo basta oprimir el ícono.
a) Explicación del problema
Una persona va a pasar un mes en un ambiente salvaje. Existe un límite, el peso máximo permitido
es de 20 kg. Existe un número máximo de 20 kg. La persona tiene un nùmero de elementos
disponibles, cada cual con un número de puntos para la supervivencia. El objetivo es maximizar el
número de puntos de supervivencia.
La tabla siguiente presenta los elementos, los puntos de supervivencia de cada uno de ellos y su
peso.
Elementos Puntos de Supervivencia Pesos
Navaja suiza 10 1
Porotos 20 5
Uniones 2 1
Papas 15 10
Bolsa de Dormir 30 7
Soga 10 5
Compás 30 1
b) Correr R.
Empezamos corriendo R-Studio. Debemos instalar los paquetes "genalg" y "ggplot2". Para ello
debemos o tener la computadora conectada a internet y desde R-Studio instalamos los programas, o
debemos bajarlos localmente y luego instalarlos desde R. Para instalarlos desde R-Studio, vamos a
"Tools" -Herramientas- en la barra de tareas superior, luego a "Install Packages" -instalar paquetes-,
y por último en la solapa que se despliega colocar el nombre de las librerías. Alternativamente,
desde el comendo de línea que figura en el recuadro inferior a la izquierda, se escribe:
> install.packages(genlag)
> install.packages(ggplot2)
Una vez instaladas las librerías en la máquina, también desde el comando de línea, realizamos una
llamada de las librerías para la presente sección.
> library(genalg)
> library(ggplot2)
Para construir el conjunto de datos, volcaremos los datos que definimos en la tabla.
Para eso utilizamos la función “data.frame”, que toma como argumentos una lista con los nombres
de los elementos, una con los puntos de supervivencia, y por último, otro con los pesos. De esta
manera construye tres variables con sus respectivos datos. La tabla va a ser almacenada en
"dataset".
> dataset <- data.frame(item = c("navaja suiza", "porotos", "papas", "uniones",
"bolsa de dormir", "soga", "compas"), supervivenciapuntos = c(10, 20, 15, 2, 30,
10, 30), pesos = c(1, 5, 10, 1, 7, 5, 1))
> limitedepeso <- 20
Luego de crear el modelo, vamos a configurar una función de evaluación. La función de evaluación
evaluará los diferentes individuos ( cromosomas ) de la población de acuerdo al valor de su
configuración genética.
Un individuo puede tener, por ejemplo, la siguiente configuración genética: 1001100.
Cada número en esta cadena binaria representa si se puede o no tomar un elemento. El valor de 1 se
refiere a colocar determinado elemento en la mochila, mientras que 0 se refiere a dejarlo en la casa.
Dado la siguiente configuración genética podríamos tener los siguientes elementos:
chromosome = c(1, 0, 0, 1, 1, 0, 0)
dataset[chromosome == 1, ]
En R c( , , ) es una lista de elementos, y el signo = está asignando está lista a cromosoma.
## elemento supervivenciapuntos pesos
## 1 navaja suiza 10 1
## 4 uniones 2 1
## 5 bolsa de dormir 30 7
Podemos chequear la suma del conjunto de puntos de supervivencia de esta configuración.
cat(chromosome %*% dataset$supervivenciapuntos)
## 42
Más abajo vamos a tener el valor de una configuración genética dado un cromosoma dado. Esto es
lo que hace la función de evaluación.
El algoritmo "genalg" trata de optimizar hacia el valor mínimo. De esta forma, el valor es calculado
como se muestra más abajo y multiplicado con -1.
Una configuración que lleva a exceder las restricciones de peso retorna un valor de 0 ( un valor más
algo también se puede dar ).
La función de evaluación va a ser definida como sigue. Para ello ingresamos las siguientes líneas al
comando de línea.
> evalFunc <- function(x) {
current_solution_survivalpoints <- x %*% dataset$supervivenciapuntos
current_solution_weight <- x %*% dataset$pesos
if (current_solution_weight > limitedepeso)
return(0) else return(-current_solution_survivalpoints)
}
Luego, vamos a elegir el número de iteraciones, diseño y correremos el modelo.
> iter = 100
Corrida del modelo:
> GAmodel <- rbga.bin(size = 7, popSize = 200, iters = iter, mutationChance = 0.01,
elitism = T, evalFunc = evalFunc)
Una vez que corremos el modelo vamos a tener el siguiente resultado:
> cat(summary.rbga(GAmodel))
## GA Settings
## Type = binary chromosome
## Population size = 200
## Number of Generations = 100
## Elitism = TRUE
## Mutation Chance = 0.01
##
## Search Domain
## Var 1 = [,]
## Var 0 = [,]
##
## GA Results
## Best Solution : 1 1 0 1 1 1 1
La mejor solución qu encontró es 1111101. Esto corresponde a los siguientes elementos que
deberíamos llevar en nuestro viaje a un ambiente salvaje.
Para visualizar la lista de elementos debemos correr los siguientes dos comandos:
> solution = c(1, 1, 1, 1, 1, 0, 1)
> dataset[solution == 1, ]
## elements supervivenciapuntos pesos
## 1 navata suiza 10 1
## 2 porotos 20 5
## 3 papas 15 10
## 4 uniones 2 1
## 5 bolsa de dormir 30 7
## 7 compas 30 1
Para conocer el número total de puntos de supervivencia relizamos los siguientes comandos.
# solución versus disponible
cat(paste(solution %*% dataset$supervivenciapuntos, "/", sum(dataset$supervivenciapuntos)))
## 107 / 117
Vamos a ver una visualización de como el modelo evoluciona:
> animate_plot <- function(x) {
for (i in seq(1, iter)) {
temp <- data.frame(Generation = c(seq(1, i), seq(1, i)), Variable = c(rep("mean",
i), rep("best", i)), supervivenciapuntos = c(-GAmodel$mean[1:i], -GAmodel$best[1:i]))
pl <- ggplot(temp, aes(x = Generation, y = supervivenciapuntos, group = Variable,
colour = Variable)) + geom_line() + scale_x_continuous(limits = c(0,
iter)) + scale_y_continuous(limits = c(0, 110)) + geom_hline(y =
max(temp$supervivenciapuntos),
lty = 2) + annotate("text", x = 1, y = max(temp$supervivenciapuntos) +
2, hjust = 0, size = 3, color = "black", label = paste("Best solution:",
max(temp$supervivenciapuntos))) + scale_colour_brewer(palette = "Set1") +
opts(title = "Evolución del Modelo de optimización de la mochila")
print(pl)
}
}
Podríamos querer salvar la animación. Para eso, instalamos y llamamos a la librería animation y
ejecutamos los siguientes comandos:
> library(animation)
> saveMovie(animate_plot(), interval = 0.1, outdir = getwd())