############################################################################
### Mestrado em Engenharia da Computacao - Computacao Inteligente ##########
### Enxame de particulas - Aluno: Andre Caetano Alves Firmo ################
############################################################################
from random import random
from copy import copy
from math import *
def l_to_m(the_list, n, m):
the_matrix = [] # :p
for i in range(n):
the_matrix.append([])
for j in range(m):
index = (i * m) + j
the_matrix[-1].append(the_list[index])
return the_matrix
class esfera:
def min(self):
return -100
def max(self):
return 100
def fitness(self,posicao):
soma=0
for xi in posicao:
soma+= xi*xi
return round(soma,3)
class rosenbrock:
def min(self):
return -30
def max(self):
return 30
def fitness(self,x):
res = 0
for i in range(len(x)-1):
res += 100*(x[i+1] - (x[i])**2)**2 + (x[i]-1)**2
return res
class particula:
""" Classe da Particula """
def __init__(self,posicao,velocidade,fitness,pbest,fbest):
self.posicao = posicao
self.velocidade = velocidade
self.fitness = fitness
self.pbest = pbest
self.fbest = fbest
class pso:
""" Classe do Enxame """
def __init__(self,funcao,dimensoes,tamanho_populacao):
self.funcao = funcao
self.dimensoes = dimensoes
self.tamanho_popu = tamanho_populacao
self.populacao = []
def vipopu(self):
for i in range(self.tamanho_popu):
print "%s | %s" % (str(self.populacao[i].fitness),str(self.populacao[i].posicao))
def ordenar(self):
troca = True
while troca:
troca = False
for i in range(self.tamanho_popu-1):
part1 = self.populacao[i]
part2 = self.populacao[i+1]
if part1.fitness < part2.fitness:
self.populacao[i] = part2
self.populacao[i+1] = part1
troca = True
def log(self,geracao,y):
f = open('fitness'+ str(y)+'.log','a')
f.write('%d;%s;%s\n'%(geracao, str(self.gbest.fitness).replace('.',','),str(self.gbest.posicao)))
f.close()
def iniciar(self):
for i in range(self.tamanho_popu):
posicao=[]
velocidade =[]
for i in range(self.dimensoes):
velocidade.append(0.0)
posicao.append(self.funcao.min()+(self.funcao.max()- self.funcao.min())* random())
fitness = self.funcao.fitness(posicao)
self.populacao.append(particula(posicao,velocidade,fitness,posicao,fitness))
self.ordenar()
self.gbest=self.populacao[-1]
def rodar(self,x,iteracoes=1000,w=0.7812,c1=1.49,c2=1.49):
for itera in range(iteracoes):
for p in self.populacao:
for dim in range(self.dimensoes):
p.velocidade[dim]=p.velocidade[dim]*w+c1*random()*(p.pbest[dim]-p.posicao[dim])+c2*random()*(self.gbest.posicao[dim]-p.posicao[dim])
p.posicao[dim] = round((p.posicao[dim] + p.velocidade[dim]),6)
if p.posicao[dim] < self.funcao.min(): p.posicao[dim] = round((p.velocidade[dim]*-0.7812),6)
if p.posicao[dim] > self.funcao.max(): p.posicao[dim] = round((
p.velocidade[dim]*-0.7812),6)
p.fitness = self.funcao.fitness(p.posicao)
if(p.fitness<p.fbest):
p.fbest = copy(p.fitness)
p.pbest = copy(p.posicao)
self.ordenar()
if self.populacao[-1].fitness<self.gbest.fitness:
self.gbest=copy(self.populacao[-1])
self.log(itera,x)
print itera,
if round((self.populacao[-1].fbest),3) == 0.0:
break
return " Melhor posicao encontrada %s" % str(self.populacao[-1].fitness)
f = esfera()
x = pso(f,30,10)
##x.iniciar()
###x.rodar()