2010-12-14 104 views
48

J'écris un petit morceau de python comme devoir, et je ne le fais pas fonctionner! Je n'ai pas beaucoup d'expérience Python, mais je connais pas mal de Java. Je suis en train de mettre en œuvre un algorithme d'optimisation Swarm des particules, et voici ce que j'ai:Erreur de compilateur Python, x ne prend pas d'arguments (1 donné)

class Particle:  

    def __init__(self,domain,ID): 
     self.ID = ID 
     self.gbest = None 
     self.velocity = [] 
     self.current = [] 
     self.pbest = [] 
     for x in range(len(domain)): 
      self.current.append(random.randint(domain[x][0],domain[x][1])) 
      self.velocity.append(random.randint(domain[x][0],domain[x][1])) 
      self.pbestx = self.current   

    def updateVelocity(): 
    for x in range(0,len(self.velocity)): 
     self.velocity[x] = 2*random.random()*(self.pbestx[x]-self.current[x]) + 2 * random.random()*(self.gbest[x]-self.current[x]) 


    def updatePosition():  
     for x in range(0,len(self.current)): 
      self.current[x] = self.current[x] + self.velocity[x]  

    def updatePbest(): 
     if costf(self.current) < costf(self.best): 
      self.best = self.current   

    def psoOptimize(domain,costf,noOfParticles=20, noOfRuns=30): 
     particles = [] 
     for i in range(noOfParticles):  
      particle = Particle(domain,i)  
      particles.append(particle)  

     for i in range(noOfRuns): 
      Globalgbest = [] 
      cost = 9999999999999999999 
     for i in particles:  
     if costf(i.pbest) < cost: 
       cost = costf(i.pbest) 
      Globalgbest = i.pbest 
      for particle in particles: 
       particle.updateVelocity() 
       particle.updatePosition() 
       particle.updatePbest(costf) 
       particle.gbest = Globalgbest  


     return determineGbest(particles,costf) 

Maintenant, je ne vois aucune raison pour laquelle cela ne devrait pas fonctionner. Cependant, quand je le lance, je reçois cette erreur:

"TypeError: updateVelocity() ne prend aucun argument (1)" données

Je ne comprends pas! Je ne donne aucun argument!

Merci pour l'aide,

Linus

+0

Veuillez mettre en évidence votre code et cliquez sur le bouton "010101" pour le formater correctement. –

+0

Il n'y a pas de lignes vides dans ma source, c'est juste la façon dont ce site le met en forme. – Linus

+1

Question de mauvaise qualité: beaucoup de code sans rapport avec de nombreuses erreurs de syntaxe dues aux espaces et onglets mélangés. Dupliquer de meilleure question http://stackoverflow.com/q/6614123/448474 – hynekcer

Répondre

99

Python passe implicitement l'objet d'appels de méthode, mais vous devez déclarer explicitement le paramètre pour elle. Ceci est habituellement nommé self:

def updateVelocity(self): 
+0

Oh, super! Merci! – Linus

+4

Je viens de commencer à apprendre Python. Au moins pour l'instant je pense que c'est moche. – shaffooo

+0

@fred J'étais curieux de l'apprendre en explorant le chemin en travaillant sur un projet IronPython ou aviez-vous un moyen de déboguer ce type d'erreur? De toute façon j'adorerais apprendre = D –

5

Votre méthode updateVelocity() manque le paramètre self explicite dans sa définition.

devrait être quelque chose comme ceci:

def updateVelocity(self):  
    for x in range(0,len(self.velocity)): 
     self.velocity[x] = 2*random.random()*(self.pbestx[x]-self.current[x]) + 2 \ 
      * random.random()*(self.gbest[x]-self.current[x]) 

Vos autres méthodes (sauf pour __init__) ont le même problème.

6

Assurez-vous que tous les de vos méthodes de classe (updateVelocity, updatePosition, ...) prendre au moins un argument de position, qui est canoniquement nommé self et fait référence à l'instance actuelle de la classe.

Lorsque vous appelez particle.updateVelocity(), la méthode appelée obtient implicitement un argument: l'instance, ici particle en tant que premier paramètre.

0

J'ai été énormément déconcerté avec ce problème, car je suis vraiment nouveau en Python. Je ne peux pas appliquer la solution au code donné par le questionné, puisque ce n'est pas auto-exécutable. Donc, je vous apporte un code très simple:

from turtle import * 

ts = Screen(); tu = Turtle() 

def move(x,y): 
    print "move()" 
    tu.goto(100,100) 

ts.listen(); 
ts.onclick(move) 

done() 

Comme vous pouvez le voir, la solution consiste à en utilisant deux (fictifs) arguments, même si elles ne sont pas utilisés soit par la fonction elle-même ou à l'appeler! Cela semble fou, mais je crois qu'il doit y avoir une raison pour cela (caché au novice!).

J'ai essayé beaucoup d'autres façons ('self' inclus). C'est le seul qui fonctionne (pour moi, au moins).