-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpso_ejercicio_3_v1.py
More file actions
71 lines (53 loc) · 3.07 KB
/
Copy pathpso_ejercicio_3_v1.py
File metadata and controls
71 lines (53 loc) · 3.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# ..................................................................................
# algoritmo PSO que minimiza la funcion unimodal f(x, y) = x^2 + y^2
# ..................................................................................
import numpy as np
# funcion objetivo hiperboloide eliptico
def funcion_objetivo(x, y):
return x**2 + y**2
# parametros
num_particulas = 20 # numero de particulas
dim = 2 # dimensiones
cantidad_iteraciones = 10 # maximo numero de iteraciones
c1 = 2.0 # componente cognitivo
c2 = 2.0 # componente social
w = 0.7 # factor de inercia
limite_inf = -100 # limite inferior de busqueda
limite_sup = 100 # limite superior de busqueda
# inicializacion
particulas = np.random.uniform(limite_inf, limite_sup, (num_particulas, dim)) # posiciones iniciales de las particulas
velocidades = np.zeros((num_particulas, dim)) # inicializacion de la matriz de velocidades en cero
# inicializacion de pbest y gbest
pbest = particulas.copy() # mejores posiciones personales iniciales
fitness_pbest = np.empty(num_particulas) # mejores fitness personales iniciales
for i in range(num_particulas):
fitness_pbest[i] = funcion_objetivo(particulas[i][0], particulas[i][1])
gbest = pbest[np.argmin(fitness_pbest)] # mejor posicion global inicial
fitness_gbest = np.min(fitness_pbest) # fitness global inicial
# busqueda
for iteracion in range(cantidad_iteraciones):
for i in range(num_particulas): # iteracion sobre cada partícula
r1, r2 = np.random.rand(), np.random.rand() # generacion dos numeros aleatorios
# actualizacion de la velocidad de la particula en cada dimension
for d in range(dim):
velocidades[i][d] = (w * velocidades[i][d] + c1 * r1 * (pbest[i][d] - particulas[i][d]) + c2 * r2 * (gbest[d] - particulas[i][d]))
for d in range(dim):
particulas[i][d] = particulas[i][d] + velocidades[i][d] # cctualizacion de la posicion de la particula en cada dimension
# mantenimiento de las partículas dentro de los limites
particulas[i][d] = np.clip(particulas[i][d], limite_inf, limite_sup)
fitness = funcion_objetivo(particulas[i][0], particulas[i][1]) # Evaluacion de la funcion objetivo para la nueva posicion
# actualizacion el mejor personal
if fitness < fitness_pbest[i]:
fitness_pbest[i] = fitness # actualizacion del mejor fitness personal
pbest[i] = particulas[i].copy() # actualizacion de la mejor posicion personal
# actualizacion del mejor global
if fitness < fitness_gbest:
fitness_gbest = fitness # actualizacion del mejor fitness global
gbest = particulas[i].copy() # actualizacion de la mejor posicion global
# imprimir el mejor global en cada iteracion
print(f"Iteración {iteracion + 1}: Mejor posición global {gbest}, Valor {fitness_gbest}")
# resultado
solucion_optima = gbest # mejor posicion global final
valor_optimo = fitness_gbest # mejor fitness global final
print("\nSolucion optima (x, y):", solucion_optima)
print("Valor optimo:", valor_optimo)