2023-05-06 20:10:20 -07:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
|
|
Created on Sun May 15 22:37:00 2016
|
|
|
|
|
|
|
|
@author: Hossam Faris
|
|
|
|
"""
|
|
|
|
|
|
|
|
import random
|
|
|
|
import numpy
|
2023-05-06 20:12:43 -07:00
|
|
|
from .solution import solution
|
2023-05-06 20:10:20 -07:00
|
|
|
import time
|
|
|
|
|
|
|
|
|
|
|
|
def PSO(objf, lb, ub, dim, PopSize, iters):
|
|
|
|
|
|
|
|
# PSO parameters
|
|
|
|
|
|
|
|
Vmax = 6
|
|
|
|
wMax = 0.9
|
|
|
|
wMin = 0.2
|
|
|
|
c1 = 2
|
|
|
|
c2 = 2
|
|
|
|
|
|
|
|
s = solution()
|
|
|
|
if not isinstance(lb, list):
|
|
|
|
lb = [lb] * dim
|
|
|
|
if not isinstance(ub, list):
|
|
|
|
ub = [ub] * dim
|
|
|
|
|
|
|
|
######################## Initializations
|
|
|
|
|
|
|
|
vel = numpy.zeros((PopSize, dim))
|
|
|
|
|
|
|
|
pBestScore = numpy.zeros(PopSize)
|
|
|
|
pBestScore.fill(float("inf"))
|
|
|
|
|
|
|
|
pBest = numpy.zeros((PopSize, dim))
|
|
|
|
gBest = numpy.zeros(dim)
|
|
|
|
|
|
|
|
gBestScore = float("inf")
|
|
|
|
|
|
|
|
pos = numpy.zeros((PopSize, dim))
|
|
|
|
for i in range(dim):
|
|
|
|
pos[:, i] = numpy.random.uniform(0, 1, PopSize) * (ub[i] - lb[i]) + lb[i]
|
|
|
|
|
|
|
|
convergence_curve = numpy.zeros(iters)
|
|
|
|
|
|
|
|
############################################
|
|
|
|
print('PSO is optimizing "' + objf.__name__ + '"')
|
|
|
|
|
|
|
|
timerStart = time.time()
|
|
|
|
s.startTime = time.strftime("%Y-%m-%d-%H-%M-%S")
|
|
|
|
|
|
|
|
for l in range(0, iters):
|
|
|
|
for i in range(0, PopSize):
|
|
|
|
# pos[i,:]=checkBounds(pos[i,:],lb,ub)
|
|
|
|
for j in range(dim):
|
|
|
|
pos[i, j] = numpy.clip(pos[i, j], lb[j], ub[j])
|
|
|
|
# Calculate objective function for each particle
|
|
|
|
fitness = objf(pos[i, :])
|
|
|
|
|
|
|
|
if pBestScore[i] > fitness:
|
|
|
|
pBestScore[i] = fitness
|
|
|
|
pBest[i, :] = pos[i, :].copy()
|
|
|
|
|
|
|
|
if gBestScore > fitness:
|
|
|
|
gBestScore = fitness
|
|
|
|
gBest = pos[i, :].copy()
|
|
|
|
|
|
|
|
# Update the W of PSO
|
|
|
|
w = wMax - l * ((wMax - wMin) / iters)
|
|
|
|
|
|
|
|
for i in range(0, PopSize):
|
|
|
|
for j in range(0, dim):
|
|
|
|
r1 = random.random()
|
|
|
|
r2 = random.random()
|
|
|
|
vel[i, j] = (
|
|
|
|
w * vel[i, j]
|
|
|
|
+ c1 * r1 * (pBest[i, j] - pos[i, j])
|
|
|
|
+ c2 * r2 * (gBest[j] - pos[i, j])
|
|
|
|
)
|
|
|
|
|
|
|
|
if vel[i, j] > Vmax:
|
|
|
|
vel[i, j] = Vmax
|
|
|
|
|
|
|
|
if vel[i, j] < -Vmax:
|
|
|
|
vel[i, j] = -Vmax
|
|
|
|
|
|
|
|
pos[i, j] = pos[i, j] + vel[i, j]
|
|
|
|
|
|
|
|
convergence_curve[l] = gBestScore
|
|
|
|
|
|
|
|
if l % 1 == 0:
|
|
|
|
print(["At iteration " + str(l + 1) + " the best fitness is " + str(gBestScore)])
|
|
|
|
timerEnd = time.time()
|
|
|
|
s.endTime = time.strftime("%Y-%m-%d-%H-%M-%S")
|
|
|
|
s.executionTime = timerEnd - timerStart
|
|
|
|
s.convergence = convergence_curve
|
|
|
|
s.optimizer = "PSO"
|
|
|
|
s.bestIndividual = gBest
|
|
|
|
s.objfname = objf.__name__
|
|
|
|
|
|
|
|
return s
|