# Definir la función objetivo
<- function(vector) {
objective_function return(sum(vector^2))
}
# Generar un número aleatorio en el intervalo [min, max]
<- function(min, max) {
rand_in_bounds return(min + ((max-min) * runif(1)))
}
# Generar un vector aleatorio en el espacio de búsqueda
<- function(minmax) {
random_vector #minmax <- matrix(bounds,nrow = problem_size, ncol = problem_size, byrow = FALSE)
return(runif(length(minmax), min = minmax[,1], max = minmax[,2]))
}
# Dar un paso en una dirección aleatoria
<- function(minmax, current, step_size) {
take_step <- numeric(length(current))
position for (i in 1:(length(current)/problem_size)) {
<- max(minmax[i,1], current[i]-step_size)
min <- min(minmax[i,2], current[i]+step_size)
max <- rand_in_bounds(min, max)
position[i]
}return(position)
}
# Dar un paso grande en una dirección aleatoria
<- function(iter, step_size, s_factor, l_factor, iter_mult) {
large_step_size if (iter > 0 && iter %% iter_mult == 0) {
return(step_size * l_factor)
else {
} return(step_size * s_factor)
}
}
# Dar un paso y un gran paso en direcciones aleatorias
<- function(bounds, current, step_size, big_stepsize) {
take_steps <- list()
step <- list()
big_step $vector <- take_step(bounds, current$vector, step_size)
step$cost <- objective_function(step$vector)
step$vector <- take_step(bounds, current$vector, big_stepsize)
big_step$cost <- objective_function(big_step$vector)
big_stepreturn(list(step, big_step))
}
# Inicializar un dataframe para almacenar los resultados
<- data.frame(iteration = integer(), cost = numeric())
results
# Realizar la búsqueda aleatoria adaptativa
<- function(max_iter, bounds, init_factor, s_factor, l_factor, iter_mult, max_no_impr) {
search <- (bounds[1,2]-bounds[1,1]) * init_factor
step_size <- list()
current $vector <- random_vector(bounds)
current$cost <- objective_function(current$vector)
current<- 0
count for (iter in 1:max_iter) {
<- large_step_size(iter, step_size, s_factor, l_factor, iter_mult)
big_stepsize <- take_steps(bounds, current, step_size, big_stepsize)
steps if (steps[[1]]$cost <= current$cost || steps[[2]]$cost <= current$cost) {
if (steps[[2]]$cost <= steps[[1]]$cost) {
<- big_stepsize
step_size <- steps[[2]]
current else {
} <- steps[[1]]
current
}<- 0
count else {
} <- count + 1
count if (count >= max_no_impr) {
<- step_size / s_factor
step_size <- 0
count
}
}# Almacenar los resultados en el dataframe
<<- rbind(results, data.frame(iteration = iter, cost = current$cost))
results
}return(current)
}
# Configuración del problema
<- 2
problem_size <- matrix(c(-5, 5), nrow = problem_size, ncol = 2, byrow = TRUE)
bounds
# Configuración del algoritmo
<- 100
max_iter <- 0.05
init_factor <- 1.3
s_factor <- 3.0
l_factor <- 10
iter_mult <- 30
max_no_impr
# Ejecutar el algoritmo
<- search(max_iter, bounds, init_factor, s_factor, l_factor, iter_mult, max_no_impr) best
Taxonomía
El algoritmo Adaptative Random Search
pertenece al conjunto general de enfoques conocidos como Optimización Estocástica
y Optimización Global
.
Es un método de búsqueda directa, en el sentido de que no requiere derivadas para para navegar por el espacio de búsqueda. Adaptative Random Search
es una extensión de los algoritmos Random Search
.
Estrategia
El algoritmo Adaptative Random Search
fue diseñado para abordar las limitaciones del tamaño de paso fijo en el algoritmo de Localized Random Search
.
La estrategia de la Adaptative Random Search
consiste en realizar paso óptimo necesario para alcanzar el óptimo global en el espacio de búsqueda. Esto se consigue probando y adoptando tamaños de paso menores o mayores sólo si mejoran el rendimiento de la búsqueda.
La estrategia del algoritmo Adaptive Step Size Random Search
(la técnica específica revisada) consiste en probar un paso mayor en cada iteración y adoptarlo si mejora el resultado. Los pasos muy grandes se prueban de la misma manera, aunque con una frecuencia mucho menor. Esta estrategia de preferir movimientos grandes tiene por objeto permitir que la técnica escape a los óptimos locales. Los pasos más pequeños se adoptan si no se produce ninguna mejora durante un periodo prolongado.
Procedimiento
Heurística
Adaptative Random Search
fue diseñado para dominios de problemas de optimización de funciones continuas.
Los candidatos con igual costo deben considerarse mejoras para permitir que el algoritmo progrese a través de mesetas en la superficie de respuesta.
Adaptative Random Search
puede adaptar la dirección de búsqueda además del tamaño del paso.
El tamaño del paso puede adaptarse para todos los parámetros o para cada parámetro individualmente.
Código
En el ejemplo, el algoritmo se ejecuta durante un número fijo de iteraciones y devuelve la mejor solución candidata descubierta. El problema del ejemplo es un caso de optimización de una función continua que busca
\(min f(x)\) donde \(f = ∑_{i=1}^n X_i^2\), \(-5.0<=x_i<=5.0\) y \(n=2\).
La solución óptima para esta función es \((v_0,...,v_{n-1})=0.0\)
Revisamemos el comportamiento del algoritmo para encontrar la solución óptima:
library(ggplot2)
# Crear modificaciones al plot
<- function() {
crear_tema theme_minimal() +
theme(
plot.background = element_rect(fill = "white", color = NA),
panel.grid.major = element_line(color = "white", size = 0.2),
panel.grid.minor = element_line(color = "white", size = 0.2),
panel.background = element_rect(fill = "white", color = NA),
plot.title = element_text(face = "bold", size = 14, color = "#4d6080"),
axis.title = element_text(face = "bold", size = 12, color = "#4d6080"),
axis.text = element_text(size = 10, color = "#4d6080"),
axis.line = element_line(size = 1.5, colour = "#de6f41"),
legend.background = element_rect(fill = "#4d6080", color = NA),
legend.key = element_rect(fill = "grey90", color = NA),
axis.ticks.x = element_line(color = "#de6f41", size = 1),
axis.ticks.y = element_line(color = "#de6f41", size = 1)
)
}
ggplot(results, aes(x = iteration, y = cost)) +
geom_line() +
labs(title = "Progreso de la función objetivo",
x = "Iteración", y = "Costo")+
crear_tema()
La solución óptima es entonces:
$vector best
[1] 0.1144359 -0.1796417 0.0000000 0.0000000
Cómo citar
@online{chiquito_valencia2023,
author = {Chiquito Valencia, Cristian},
title = {Adaptative {Random} {Search}},
date = {2023-11-13},
url = {https://cchiquitovalencia.github.io/posts/2023-11-13-adaptative_random_search/},
langid = {en}
}