私は宿題としてpythonの小さな部分を書いています、そして、私はそれを実行させていません!私はそれほど多くのPython経験を持っていません、しかし、私はかなり多くを知っていますJavaを使用しています。ParticleSwarm Optimizationアルゴリズムを実装しようとしていますが、これが次のとおりです。
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)
今、これが機能しない理由はわかりません。ただし、実行すると次のエラーが表示されます。
"TypeError:updateVelocity()は引数を取りません(1つ指定)"
わかりません!私はそれに引数を与えていません!
助けてくれてありがとう、
ライナス
Pythonはオブジェクトをメソッド呼び出しに暗黙的に渡しますが、そのパラメーターを明示的に宣言する必要があります。これは通例self
という名前です:
def updateVelocity(self):
updateVelocity()
メソッドの定義に明示的なself
パラメーターがありません。
このようなものでなければなりません:
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])
他のメソッド(__init__
を除く)にも同じ問題があります。
私はPythonが比較的新しいので、この問題に戸惑っています。それは自己実行可能ではないので、私は質問された人によって与えられたコードにソリューションを適用することはできません。だから私は非常に単純なコードをもたらします:
from turtle import *
ts = Screen(); tu = Turtle()
def move(x,y):
print "move()"
tu.goto(100,100)
ts.listen();
ts.onclick(move)
done()
ご覧のとおり、ソリューションは2つの(ダミー)引数を使用で構成されています。関数自体または呼び出しで使用されていない場合でもです。クレイジーに聞こえますが、それには理由があるに違いないと思います(初心者からは隠されています!)。
私は他の多くの方法(「自己」を含む)を試しました。動作するのはそれだけです(少なくとも私にとっては)。