2010-12-14 23 views
48

Tôi đang viết một mẩu nhỏ python làm bài tập về nhà và tôi không chạy nó! Tôi không có nhiều kinh nghiệm Python, nhưng tôi biết khá nhiều về Java. Tôi đang cố gắng để thực hiện một thuật toán tối ưu hóa hạt Swarm, và đây là những gì tôi có:Lỗi trình biên dịch Python, x không có đối số (1 đã cho)

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) 

Bây giờ, tôi thấy không có lý do tại sao điều này không nên làm việc. Tuy nhiên, khi tôi chạy nó, tôi nhận được lỗi này:

"Lỗi Loại: updateVelocity() không có đối số (1 nhất định)"

Tôi không hiểu! Tôi không đưa ra bất kỳ lý lẽ nào!

Thanks for the help,

Linus

+0

Vui lòng đánh dấu mã của bạn và nhấp vào nút "010101" để định dạng mã đúng cách. –

+0

Không có dòng trống nào trong nguồn của tôi, đó chỉ là cách trang web này định dạng nó. – Linus

+1

Câu hỏi chất lượng thấp: nhiều mã không liên quan với nhiều lỗi cú pháp do không gian và tab hỗn hợp. Bản sao câu hỏi hay hơn http://stackoverflow.com/q/6614123/448474 – hynekcer

Trả lời

99

Python ngầm vượt qua đối tượng để các cuộc gọi phương pháp, nhưng bạn cần phải tuyên bố một cách rõ ràng các tham số cho nó. Đây thông thường được đặt tên self:

def updateVelocity(self): 
+0

Ồ, tuyệt vời! Cảm ơn! – Linus

+4

Tôi mới bắt đầu học python. Ít nhất là bây giờ tôi nghĩ rằng đó là xấu xí. – shaffooo

+0

@fred Tôi đã tò mò bạn đã học điều này bằng cách khám phá trên đường đi trong khi làm việc trên một dự án IronPython hoặc bạn đã có một cách gỡ lỗi loại lỗi? Dù bằng cách nào tôi cũng thích học = D –

5

phương pháp updateVelocity() của bạn thiếu self thông số rõ ràng trong định nghĩa của nó.

nên được một cái gì đó như thế này:

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

phương pháp khác của bạn (trừ __init__) có cùng một vấn đề.

6

Hãy chắc chắn rằng tất cả các phương pháp lớp học của bạn (updateVelocity, updatePosition ...) phải mất ít nhất một đối số vị trí, mà là theo giáo luật đặt tên self và đề cập đến các trường hợp hiện tại của lớp.

Khi bạn gọi particle.updateVelocity(), phương thức được gọi ngầm nhận được một đối số: ví dụ, tại đây particle làm thông số đầu tiên.

0

Tôi đã bối rối rất nhiều với vấn đề này, vì tôi đang sống mới trong Python. Tôi không thể áp dụng các giải pháp cho mã được đưa ra bởi các câu hỏi, vì nó không phải là tự thực thi. Vì vậy, tôi mang một mã rất đơn giản:

from turtle import * 

ts = Screen(); tu = Turtle() 

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

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

done() 

Như bạn có thể thấy, các giải pháp bao gồm trong sử dụng hai (dummy) lập luận, ngay cả khi họ không được sử dụng hoặc bằng các chức năng riêng của mình hoặc kêu gọi nó! Nghe có vẻ điên rồ, nhưng tôi tin rằng phải có một lý do cho nó (ẩn từ người mới!).

Tôi đã thử nhiều cách khác (bao gồm cả 'tự'). Đó là người duy nhất hoạt động (ít nhất là đối với tôi).

Các vấn đề liên quan