69 votes

Python erreur du compilateur, x ne prend pas d'arguments (1 donnée)

Je suis en train d'écrire un petit morceau de python comme un devoir à la maison, et je ne suis pas le faire fonctionner! Je n'ai pas beaucoup de Python-expérience, mais je sais pas mal de Java. Je suis en train de mettre en œuvre un algorithme d'Optimisation par essaims particulaires, et voici ce que j'ai:

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 pas pourquoi cela ne fonctionnerait pas. Cependant, quand je le lance, j'obtiens cette erreur:

"TypeError: updateVelocity() ne prend pas d'arguments (1 donnée)"

Je ne comprends pas! Je ne suis pas en lui donnant des arguments!

Merci pour l'aide,

Linus

135voto

Fred Larson Points 27404

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

def updateVelocity(self):

8voto

miku Points 63392

Assurez-vous que tous vos méthodes de la classe (updateVelocity, updatePosition, ...) de prendre au moins une position d'argument, qui est canoniquement nommé self , et se réfère à l'instance courante de la classe.

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

6voto

bgporter Points 11119

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

Doit ê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])

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X