2015-01-31 4 views
1

기본 PSO (입자 군 최적화)를 코딩 중이며 파티클 ​​인스턴스에 아무런 속성이 없습니다.이 오류는 __getitem__입니다. 모든 것이 잘된 것 같지만 particle 클래스에는 오류가있는 것 같습니다. particle 클래스를 살펴보십시오.입자 인스턴스에 '__getitem__'속성이 없습니다.

from numpy import array 
from random import random 
from math import sin, sqrt, cos, pi 
import matplotlib.pyplot as plt 
import pylab 

## Settings 

c1 = 2 
c2 = 2 
size = 100 
bad_size = 10 
dim = 10 
max_iterations = 20 
Error_limit = 0.00001 

def functR(k): 
    val = 10*dim 
    for i in range(dim): 
     val = val + (k[i])**2 - 10*cos(2*pi*k[i]) 
    return val 
#print functR([0]*20) 

class particle(): 
    def __init__(self, pos, fitness,vel, pbestpos, pbestfit): 
     self.pos = pos 
     self.fitness = fitness 
     self.vel = vel 
     self.pbestpos = pbestpos 
     self.pbestfitness = pbestfit 

class swarm(): 
    def __init__(self, size, bad_size, dim): 
     #self.gbest = gbest 
     self.size = size 
     self.bad_size = bad_size 
     self.dim = dim 
    def create(self): 
     particles = [] 
     for i in range(size + bad_size): 
      p = particle() 
      p.pos = array([random() for i in range(dim)]) 
      p.vel = 0.0 
      p.fitness = 0.0 
      p.pbestpos = p.pos 
      p.pbestfit = p.fitness 
      #p = particle(pos, fitness,vel, pbestpos, pbestfit) 
      particles.append(p) 
     return particles 

def optimizer(): 
    s = swarm(size, bad_size, dim) 
    new_swarm = s.create() 
    gbest = new_swarm[0] 
    gbestfit = functR(gbest) 
    i = 0 
## The iterative loop 
    while i < max_iterations: 
     for p in s: 
      fitness = functR(p.pos) 

      if fitness > p.fitness: 
       p.fitness = fitness 
       p.pbestpos = p.pos 

      if fitness > gbestfit: 
       gbest = p 
    ## Plotting    
      pylab.xlim([0,10]) 
      pylab.ylim([0,1.5]) 
      plt.plot(i,gbest.fitness, "bo") 

    ## Velocity and Position update 
      vel = p.vel + c1 * random() * (p.pbestpos - p.pos) \ 
        + c2 * random() * (gbest.pos - p.pos) 
      p.pos = p.pos + vel 
     plt.show()  
     i += 1 

    print "gbest fitness :", gbestfit 
    print "Best particle :", gbest.pos 

print optimizer() 

답변

1

당신은 여기에서 목록으로 단일 particle() 인스턴스를 치료하고 있습니다 :

val = val + (k[i])**2 - 10*cos(2*pi*k[i]) 

kparticle()의 인스턴스는 [i] 구문은 해당 인스턴스에 __getitem__ 호출로 변환합니다.

현재 해당 인스턴스에 전달됩니다

gbest = new_swarm[0] 
gbestfit = functR(gbest) 

대신 .pos 매개 변수를 전달 다른 곳에서 동안 :

for p in s: 
    fitness = functR(p.pos) 

그래서 아마 당신이 gbestfit 라인 동일한 기능을 수행 할 의미 :

gbest = new_swarm[0] 
gbestfit = functR(gbest.pos) 
+0

답장을 보내 주셔서 감사합니다. 따라서 __geti를 구현해야합니다. 내 입자 클래스의 tem__ 메서드가 맞습니까? – ankitom

+0

@ankitom : 알고리즘으로 무엇을하고 싶은가에 달려 있습니다. 다른 곳에서는'particle.pos' 속성을 사용하여 대신'functR()'에 전달합니다. –

+0

예, 맞습니다. gbest.pos이어야합니다. – ankitom