Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Optimización por Enjambre de Partículas | Algoritmos Basados en Enjambres
Algoritmos Bioinspirados

bookOptimización por Enjambre de Partículas

Note
Definición

La Optimización por Enjambre de Partículas (PSO, por sus siglas en inglés) es un algoritmo bioinspirado basado en poblaciones que toma su inspiración del comportamiento colectivo de bandadas de aves y bancos de peces. En PSO, se trabaja con un enjambre de agentes simples llamados partículas. Cada partícula representa una solución potencial al problema de optimización y se desplaza por el espacio de búsqueda actualizando su posición y velocidad.

Conceptos clave

El movimiento de cada partícula está influenciado por dos factores principales:

  • Mejor personal: La mejor posición conocida que la propia partícula ha descubierto hasta el momento;
  • Mejor global: La mejor posición conocida encontrada por todo el enjambre en cualquier momento durante la búsqueda.

Esta dinámica permite que el enjambre explore el espacio de soluciones de manera eficiente, equilibrando la exploración (búsqueda de nuevas áreas) y la explotación (refinamiento de áreas ya conocidas) a medida que las partículas se comunican y aprenden unas de otras.

Conceptos clave en PSO:

  • Partículas: agentes que representan posibles soluciones;
  • Posición: la ubicación actual de una partícula en el espacio de búsqueda;
  • Velocidad: la dirección y rapidez del movimiento de la partícula;
  • Mejor posición personal: la mejor posición encontrada por cada partícula hasta el momento;
  • Mejor posición global: la mejor posición encontrada por cualquier partícula en el enjambre.

Mediante la actualización iterativa de posiciones y velocidades basándose en estos principios, PSO permite resolver problemas complejos de optimización de manera flexible y eficiente.

Ejemplo: Implementación básica de PSO

123456789101112131415161718192021222324252627282930313233343536373839404142434445
import numpy as np # Objective function: simple 1D quadratic (minimum at x=3) def objective(x): return (x - 3) ** 2 + 2 # PSO parameters num_particles = 20 num_iterations = 50 w = 0.5 # Inertia coefficient c1 = 1.5 # Cognitive (personal) coefficient c2 = 1.5 # Social (global) coefficient # Initialize particle positions and velocities positions = np.random.uniform(-10, 10, num_particles) velocities = np.zeros(num_particles) personal_best_positions = positions.copy() personal_best_scores = objective(positions) global_best_idx = np.argmin(personal_best_scores) global_best_position = personal_best_positions[global_best_idx] # PSO loop for iteration in range(num_iterations): # Evaluate current positions scores = objective(positions) # Update personal bests better_mask = scores < personal_best_scores personal_best_scores[better_mask] = scores[better_mask] personal_best_positions[better_mask] = positions[better_mask] # Update global best global_best_idx = np.argmin(personal_best_scores) global_best_position = personal_best_positions[global_best_idx] # Update velocities and positions r1 = np.random.rand(num_particles) r2 = np.random.rand(num_particles) velocities = ( w * velocities + c1 * r1 * (personal_best_positions - positions) + c2 * r2 * (global_best_position - positions) ) positions += velocities print(f"Best position found: {global_best_position:.3f}") print(f"Objective value: {objective(global_best_position):.3f}")
copy

Paso a paso: Actualización de posición y velocidad en PSO

  1. Evaluar cada partícula: Para cada partícula, calcular la función objetivo en su posición actual;
  2. Actualizar el mejor personal: Si la posición actual proporciona una mejor puntuación que cualquier posición anterior, almacenarla como el nuevo mejor personal;
  3. Actualizar el mejor global: Identificar la mejor puntuación entre todos los mejores personales y actualizar la posición global en consecuencia;
  4. Actualizar la velocidad: Para cada partícula, calcular la nueva velocidad utilizando:
    • El término de inercia (w * velocity), que incentiva a la partícula a continuar en su dirección actual;
    • El término cognitivo (c1 * r1 * (personal_best - position)), que atrae a la partícula hacia su mejor experiencia propia;
    • El término social (c2 * r2 * (global_best - position)), que atrae a la partícula hacia el mejor resultado encontrado por el enjambre;
  5. Actualizar la posición: Sumar la nueva velocidad a la posición actual para obtener la nueva ubicación de la partícula en el espacio de búsqueda.

Las partículas repiten estos pasos durante un número determinado de iteraciones o hasta que se cumplan los criterios de convergencia.

Ejemplo: Visualización de trayectorias de partículas

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
import numpy as np import matplotlib.pyplot as plt # Objective function: simple 1D quadratic (minimum at x=3) def objective(x): return (x - 3) ** 2 + 2 # PSO parameters num_particles = 20 num_iterations = 50 w = 0.5 # Inertia coefficient c1 = 1.5 # Cognitive (personal) coefficient c2 = 1.5 # Social (global) coefficient # Re-run the PSO loop, recording particle trajectories positions = np.random.uniform(-10, 10, num_particles) velocities = np.zeros(num_particles) personal_best_positions = positions.copy() personal_best_scores = objective(positions) global_best_idx = np.argmin(personal_best_scores) global_best_position = personal_best_positions[global_best_idx] trajectories = [positions.copy()] for iteration in range(num_iterations): scores = objective(positions) better_mask = scores < personal_best_scores personal_best_scores[better_mask] = scores[better_mask] personal_best_positions[better_mask] = positions[better_mask] global_best_idx = np.argmin(personal_best_scores) global_best_position = personal_best_positions[global_best_idx] r1 = np.random.rand(num_particles) r2 = np.random.rand(num_particles) velocities = ( w * velocities + c1 * r1 * (personal_best_positions - positions) + c2 * r2 * (global_best_position - positions) ) positions += velocities trajectories.append(positions.copy()) trajectories = np.array(trajectories) # Plot trajectories plt.figure(figsize=(10, 6)) for i in range(num_particles): plt.plot(trajectories[:, i], label=f"Particle {i+1}", alpha=0.5) plt.axhline(3, color='red', linestyle='--', label='Optimum (x=3)') plt.title('Particle Trajectories in PSO') plt.xlabel('Iteration') plt.ylabel('Position') plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', fontsize='small') plt.tight_layout() plt.show()
copy

Análisis de parámetros

La elección de los parámetros de PSO tiene un impacto significativo en el comportamiento y el rendimiento del algoritmo:

  • Coeficiente de inercia (w): Controla cuánto de la velocidad previa se retiene;
    • Valores altos fomentan la exploración y ayudan a las partículas a escapar de mínimos locales;
    • Valores bajos favorecen la explotación y aceleran la convergencia.
  • Coeficiente cognitivo (c1): Determina la fuerza con la que las partículas son atraídas hacia sus propias mejores posiciones;
    • Aumentar este valor fomenta la exploración independiente y ayuda a mantener la diversidad del enjambre.
  • Coeficiente social (c2): Regula la atracción hacia la mejor posición global;
    • Incrementar este valor acelera la convergencia al promover el aprendizaje colectivo;
    • Valores excesivamente altos pueden causar estancamiento prematuro.

La sintonización cuidadosa de estos coeficientes es esencial para lograr un rendimiento de optimización robusto en diferentes dominios de problemas. Ajustar los parámetros para equilibrar la exploración y la explotación, asegurando que las partículas busquen de manera efectiva sin atascarse o converger demasiado rápido.

question mark

¿Cuáles afirmaciones sobre la Optimización por Enjambre de Partículas (PSO) son correctas? Selecciona todas las que correspondan.

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 3. Capítulo 2

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Suggested prompts:

Can you explain how to choose good values for the PSO parameters?

What happens if I set the inertia or cognitive/social coefficients too high or too low?

Can you give examples of how parameter changes affect the optimization process?

Awesome!

Completion rate improved to 6.25

bookOptimización por Enjambre de Partículas

Desliza para mostrar el menú

Note
Definición

La Optimización por Enjambre de Partículas (PSO, por sus siglas en inglés) es un algoritmo bioinspirado basado en poblaciones que toma su inspiración del comportamiento colectivo de bandadas de aves y bancos de peces. En PSO, se trabaja con un enjambre de agentes simples llamados partículas. Cada partícula representa una solución potencial al problema de optimización y se desplaza por el espacio de búsqueda actualizando su posición y velocidad.

Conceptos clave

El movimiento de cada partícula está influenciado por dos factores principales:

  • Mejor personal: La mejor posición conocida que la propia partícula ha descubierto hasta el momento;
  • Mejor global: La mejor posición conocida encontrada por todo el enjambre en cualquier momento durante la búsqueda.

Esta dinámica permite que el enjambre explore el espacio de soluciones de manera eficiente, equilibrando la exploración (búsqueda de nuevas áreas) y la explotación (refinamiento de áreas ya conocidas) a medida que las partículas se comunican y aprenden unas de otras.

Conceptos clave en PSO:

  • Partículas: agentes que representan posibles soluciones;
  • Posición: la ubicación actual de una partícula en el espacio de búsqueda;
  • Velocidad: la dirección y rapidez del movimiento de la partícula;
  • Mejor posición personal: la mejor posición encontrada por cada partícula hasta el momento;
  • Mejor posición global: la mejor posición encontrada por cualquier partícula en el enjambre.

Mediante la actualización iterativa de posiciones y velocidades basándose en estos principios, PSO permite resolver problemas complejos de optimización de manera flexible y eficiente.

Ejemplo: Implementación básica de PSO

123456789101112131415161718192021222324252627282930313233343536373839404142434445
import numpy as np # Objective function: simple 1D quadratic (minimum at x=3) def objective(x): return (x - 3) ** 2 + 2 # PSO parameters num_particles = 20 num_iterations = 50 w = 0.5 # Inertia coefficient c1 = 1.5 # Cognitive (personal) coefficient c2 = 1.5 # Social (global) coefficient # Initialize particle positions and velocities positions = np.random.uniform(-10, 10, num_particles) velocities = np.zeros(num_particles) personal_best_positions = positions.copy() personal_best_scores = objective(positions) global_best_idx = np.argmin(personal_best_scores) global_best_position = personal_best_positions[global_best_idx] # PSO loop for iteration in range(num_iterations): # Evaluate current positions scores = objective(positions) # Update personal bests better_mask = scores < personal_best_scores personal_best_scores[better_mask] = scores[better_mask] personal_best_positions[better_mask] = positions[better_mask] # Update global best global_best_idx = np.argmin(personal_best_scores) global_best_position = personal_best_positions[global_best_idx] # Update velocities and positions r1 = np.random.rand(num_particles) r2 = np.random.rand(num_particles) velocities = ( w * velocities + c1 * r1 * (personal_best_positions - positions) + c2 * r2 * (global_best_position - positions) ) positions += velocities print(f"Best position found: {global_best_position:.3f}") print(f"Objective value: {objective(global_best_position):.3f}")
copy

Paso a paso: Actualización de posición y velocidad en PSO

  1. Evaluar cada partícula: Para cada partícula, calcular la función objetivo en su posición actual;
  2. Actualizar el mejor personal: Si la posición actual proporciona una mejor puntuación que cualquier posición anterior, almacenarla como el nuevo mejor personal;
  3. Actualizar el mejor global: Identificar la mejor puntuación entre todos los mejores personales y actualizar la posición global en consecuencia;
  4. Actualizar la velocidad: Para cada partícula, calcular la nueva velocidad utilizando:
    • El término de inercia (w * velocity), que incentiva a la partícula a continuar en su dirección actual;
    • El término cognitivo (c1 * r1 * (personal_best - position)), que atrae a la partícula hacia su mejor experiencia propia;
    • El término social (c2 * r2 * (global_best - position)), que atrae a la partícula hacia el mejor resultado encontrado por el enjambre;
  5. Actualizar la posición: Sumar la nueva velocidad a la posición actual para obtener la nueva ubicación de la partícula en el espacio de búsqueda.

Las partículas repiten estos pasos durante un número determinado de iteraciones o hasta que se cumplan los criterios de convergencia.

Ejemplo: Visualización de trayectorias de partículas

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
import numpy as np import matplotlib.pyplot as plt # Objective function: simple 1D quadratic (minimum at x=3) def objective(x): return (x - 3) ** 2 + 2 # PSO parameters num_particles = 20 num_iterations = 50 w = 0.5 # Inertia coefficient c1 = 1.5 # Cognitive (personal) coefficient c2 = 1.5 # Social (global) coefficient # Re-run the PSO loop, recording particle trajectories positions = np.random.uniform(-10, 10, num_particles) velocities = np.zeros(num_particles) personal_best_positions = positions.copy() personal_best_scores = objective(positions) global_best_idx = np.argmin(personal_best_scores) global_best_position = personal_best_positions[global_best_idx] trajectories = [positions.copy()] for iteration in range(num_iterations): scores = objective(positions) better_mask = scores < personal_best_scores personal_best_scores[better_mask] = scores[better_mask] personal_best_positions[better_mask] = positions[better_mask] global_best_idx = np.argmin(personal_best_scores) global_best_position = personal_best_positions[global_best_idx] r1 = np.random.rand(num_particles) r2 = np.random.rand(num_particles) velocities = ( w * velocities + c1 * r1 * (personal_best_positions - positions) + c2 * r2 * (global_best_position - positions) ) positions += velocities trajectories.append(positions.copy()) trajectories = np.array(trajectories) # Plot trajectories plt.figure(figsize=(10, 6)) for i in range(num_particles): plt.plot(trajectories[:, i], label=f"Particle {i+1}", alpha=0.5) plt.axhline(3, color='red', linestyle='--', label='Optimum (x=3)') plt.title('Particle Trajectories in PSO') plt.xlabel('Iteration') plt.ylabel('Position') plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', fontsize='small') plt.tight_layout() plt.show()
copy

Análisis de parámetros

La elección de los parámetros de PSO tiene un impacto significativo en el comportamiento y el rendimiento del algoritmo:

  • Coeficiente de inercia (w): Controla cuánto de la velocidad previa se retiene;
    • Valores altos fomentan la exploración y ayudan a las partículas a escapar de mínimos locales;
    • Valores bajos favorecen la explotación y aceleran la convergencia.
  • Coeficiente cognitivo (c1): Determina la fuerza con la que las partículas son atraídas hacia sus propias mejores posiciones;
    • Aumentar este valor fomenta la exploración independiente y ayuda a mantener la diversidad del enjambre.
  • Coeficiente social (c2): Regula la atracción hacia la mejor posición global;
    • Incrementar este valor acelera la convergencia al promover el aprendizaje colectivo;
    • Valores excesivamente altos pueden causar estancamiento prematuro.

La sintonización cuidadosa de estos coeficientes es esencial para lograr un rendimiento de optimización robusto en diferentes dominios de problemas. Ajustar los parámetros para equilibrar la exploración y la explotación, asegurando que las partículas busquen de manera efectiva sin atascarse o converger demasiado rápido.

question mark

¿Cuáles afirmaciones sobre la Optimización por Enjambre de Partículas (PSO) son correctas? Selecciona todas las que correspondan.

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 3. Capítulo 2
some-alt