# Definir la función objetivo
<- function(vector) {
objective_function return(sum(vector^2))
}
# Generar un vector aleatorio
<- function(minmax) {
random_vector return(runif(length(minmax), min = minmax[,1], max = minmax[,2]))
}
# Realizar la bósqueda aleatoria
<- function(search_space, max_iter) {
search <- NULL
best <- c() # Vector para almacenar los costos
costs for (iter in 1:max_iter) {
<- list()
candidate $vector <- random_vector(search_space)
candidate$cost <- objective_function(candidate$vector)
candidate<- c(costs, candidate$cost) # Almacenar el costo de la iteración actual
costs if (is.null(best) || candidate$cost < best$cost) {
<- candidate
best
}
}return(list(best = best, costs = costs)) # Devolver el mejor resultado y los costos
}
# Configuración del problema
<- 2
problem_size <- matrix(c(-5, 5), nrow = problem_size, ncol = 2, byrow = TRUE)
search_space
# Configuración del algoritmo
<- 1000
max_iter
# Ejecutar el algoritmo
<- search(search_space, max_iter)
result <- result$best
best <- result$costs costs
Taxonomía
Random Search
pertenece a los campos de la Optimización Estocástica
y la Optimización Global
. Es un método de búsqueda directa, no requiere derivadas para buscar en un dominio continuo. Este enfoque está relacionado con técnicas que proporcionan pequeñas mejoras, como la Directed Random Search
y la Adaptative Random Search
.
Estrategia
La estrategia de Random Search
consiste en muestrear soluciones de todo el espacio de búsqueda utilizando una distribución de probabilidad uniforme. Cada muestra futura es independiente de las anteriores.
Procedimiento
Heurística
Random Search
es minimalista en el sentido de que sólo requiere una rutina de construcción de soluciones candidatas y una rutina de evaluación de soluciones candidatas, ambas pueden calibrarse con el enfoque.
En el peor de los casos, el rendimiento de Random Search
para localizar el óptimo es peor que una Enumeración
del dominio de búsqueda, dado que Random Search
no tiene memoria y puede remuestrear a ciegas.
Random Search
puede devolver una aproximación razonable de la solución óptima en un tiempo razonable con problemas de baja dimensionalidad, aunque el enfoque no se escala bien con tamaño del problema (como el número de dimensiones).
Hay que tener cuidado con algunos dominios de problemas para garantizar que la construcción aleatoria de soluciones candidatas no esté sesgada.
Los resultados de una Random Search
pueden utilizarse para sembrar otra técnica de búsqueda, como una técnica de búsqueda local (como el algoritmo Hill Climbing
) que se puede utilizar para localizar la mejor solución en la vecindad de la “buena” solución candidata.
Código
El problema de ejemplo es un caso de optimizació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 un dataframe con los costos
<- data.frame(
df Iteration = 1:length(costs),
Cost = costs
)
# 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(df, aes(x = Iteration, y = Cost)) +
geom_line(colour = "#4d6080", size = 1) +
labs(
title = "Progreso de la función objetivo",
x = "Iteración",
y = "Costo"
+
) crear_tema()
La solución óptima es entonces:
$best$vector result
[1] 0.3349870 -0.6764305 0.2794488 0.4845480
Cómo citar
@online{chiquito_valencia2023,
author = {Chiquito Valencia, Cristian},
title = {Random {Search}},
date = {2023-11-13},
url = {https://cchiquitovalencia.github.io/posts/2023-11-13-random_search_algorithm/},
langid = {en}
}