J'écris un petit morceau de python comme devoir, et je ne le fais pas courir! Je n'ai pas beaucoup d'expérience en Python, mais je connais pas mal Java. J'essaie d'implémenter un algorithme d'optimisation de l'essaim de particules, 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 aucune raison pour que cela ne fonctionne pas. Cependant, quand je le lance, j'obtiens cette erreur:
"TypeError: updateVelocity () ne prend aucun argument (1 donné)"
Je ne comprends pas! Je ne lui donne aucun argument!
Merci pour l'aide,
Linus
Python transmet implicitement l'objet aux appels de méthode, mais vous devez déclarer explicitement le paramètre correspondant. Ceci est habituellement nommé self
:
def updateVelocity(self):
Assurez-vous que toutes de vos méthodes de classe (updateVelocity
, updatePosition
, ...) prennent au moins un argument de position, nommé canoniquement self
et faisant 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
comme premier paramètre.
Le paramètre explicite self
dans sa définition manque dans votre méthode updateVelocity()
.
Devrait être quelque chose comme ça:
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 (à l'exception de __init__
) ont le même problème.
Ce problème me laisse beaucoup perplexe, car je suis relativement nouveau en Python. Je ne peux pas appliquer la solution au code donné par le questionné, car ce n'est pas auto-exécutable. Alors j'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 constater, la solution consiste à utiliser deux arguments (factices), même s'ils ne sont utilisés ni par la fonction ni par l'appel! Cela semble fou, mais je crois qu’il doit y avoir une raison (cachée au novice!).
J'ai essayé beaucoup d'autres moyens («moi» inclus). C'est le seul qui fonctionne (pour moi, au moins).