2010-12-14 19 views
48

Scrivo un piccolo pezzo di pitone come compito a casa e non riesco a farlo funzionare! Non ho molta esperienza con Python, ma conosco un sacco di Java. Sto cercando di implementare un algoritmo di ottimizzazione Particle Swarm, ed ecco cosa ho:Errore del compilatore Python, x non accetta argomenti (1 dato)

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) 

Ora, non vedo alcun motivo per cui questo non dovrebbe funzionare. Tuttavia, quando l'eseguo, ottengo questo errore:

"TypeError: updateVelocity() non prende argomenti (1) dato"

che non capisco! Non sto dando alcun argomento!

Grazie per l'aiuto,

Linus

+0

Si prega di evidenziare il codice e fare clic sul pulsante "010101" per formattarlo correttamente. –

+0

Non ci sono righe vuote nella mia fonte, questo è solo il modo in cui questo sito lo formatta. – Linus

+1

Domanda di bassa qualità: molti codice non correlato con molti errori di sintassi dovuti a spazi e tabulazioni misti. Duplicazione della domanda migliore http://stackoverflow.com/q/6614123/448474 – hynekcer

risposta

99

Python passa implicitamente l'oggetto da chiamate di metodo, ma è necessario dichiarare in modo esplicito il parametro per esso. Questo è abitualmente chiamato self:

def updateVelocity(self): 
+0

Oh, fantastico! Grazie! – Linus

+4

Ho appena iniziato ad imparare Python. Almeno per ora penso che sia brutto. – shaffooo

+0

@fred Ero curioso di averlo imparato esplorando lungo il percorso mentre lavoravo su un progetto IronPython o hai avuto modo di eseguire il debug di questo tipo di errore? Ad ogni modo mi piacerebbe imparare = D –

5

Il tuo metodo updateVelocity() manca l'esplicita self parametro nella sua definizione.

dovrebbe essere qualcosa di simile:

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

I suoi altri metodi (ad eccezione di __init__) hanno lo stesso problema.

6

Assicurarsi che tutte dei tuoi metodi di classe (updateVelocity, updatePosition, ...) prendere almeno un argomento posizionale, che viene canonicamente chiamato self e si riferisce all'istanza corrente della classe.

Quando si chiama particle.updateVelocity(), il metodo chiamato ottiene implicitamente un argomento: l'istanza, qui particle come primo parametro.

0

Sono stato un po 'sconcertato per questo problema, dal momento che sono relativamente nuovo in Python. Non riesco ad applicare la soluzione al codice fornito dall'interrogato, poiché non è auto eseguibile. Così ho portare un codice molto semplice:

from turtle import * 

ts = Screen(); tu = Turtle() 

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

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

done() 

Come si può vedere, la soluzione consiste nel utilizzando due (fittizie) argomenti, anche se non vengono utilizzati sia per la funzione stessa o in chiamarlo! Sembra pazzesco, ma credo che ci debba essere una ragione (nascosto dal novizio!).

Ho provato un sacco di altri modi ('self' incluso). È l'unico che funziona (almeno per me).

Problemi correlati