ユーザ定義クラスの比較演算子で不等号を以下のように作りました。
python
1 def __lt__(self, other): 2 return any(( 3 self == other, 4 self < other, 5 ))
これを別の関数から
python
1if np.linalg.norm(boid.position - self.position) < self.perception:
というように不等号を呼び出したところ、以下のようなエラーが出ました。
python
1<ipython-input-1-a3d2dce13ecf> in __lt__(self, other) 2 41 return any(( 3 42 self == other, 4---> 43 self < other, 5 44 )) 6 45 7 8... last 1 frames repeated, from the frame below ... 9 10<ipython-input-1-a3d2dce13ecf> in __lt__(self, other) 11 41 return any(( 12 42 self == other, 13---> 43 self < other, 14 44 )) 15 45 16 17RecursionError: maximum recursion depth exceeded while calling a Python object
最大再帰処理回数を超えたということで、回数の上限を上げました
python
1import sys 2sys.setrecursionlimit(10000)
これでも同じエラーがでたので、さらに上限を上げました。
python
1import sys 2sys.setrecursionlimit(100000)
すると、kernel startingのまま止まってしまいました。(Jupyter labでコードを書いています)
jupyterではなく、.pyファイルに書いてterminalで実行すると、セグメンテーションフォルトになります。
どこを直せば良いか検討がつきません。ご教授お願いします。
[追記1]
コードを一部抜粋したものを載せました。汚いコードですみません。
実行すると、上記と同じエラーが出ます。
python
1import sys 2sys.setrecursionlimit(10000) 3 4 5class Vector: 6 def __init__(self, x, y): 7 self.x = x 8 self.y = y 9 def __add__(self, v): 10 self.x = self.x + v.x 11 self.y = self.y + v.y 12 return self 13 def __sub__(self, v): 14 self.x = self.x - v.x 15 self.y = self.y - v.y 16 return self 17 def __mul__(self, v): 18 self.x = self.x * v.x 19 self.y = self.y * v.y 20 return self 21 def sqrt(self): 22 self.x = math.sqrt(self.x) 23 self.y = math.sqrt(self.y) 24 return self 25 def __lt__(self, other): 26 return any(( 27 self == other, 28 self < other, 29 )) 30class Boid(): 31 32 def __init__(self, x, y, width, height): 33 self.position = Vector(x, y) 34 vec = (np.random.rand(2) - 0.5)*10 35 self.velocity = Vector(*vec) 36 37 vec = (np.random.rand(2) - 0.5)/2 38 self.acceleration = Vector(*vec) 39 self.max_force = 0.3 40 self.max_speed = 5 41 self.perception = 100 42 43 def apply_behaviour(self, boids): 44 alignment = self.align(boids) 45 cohesion = self.cohesion(boids) 46 separation = self.separation(boids) 47 48 self.acceleration += alignment 49 self.acceleration += cohesion 50 self.acceleration += separation 51 self.width = width 52 self.height = height 53 54 def align(self, boids): 55 steering = Vector(*np.zeros(2)) 56 total = 0 57 avg_vec = Vector(*np.zeros(2)) 58 for boid in boids: 59 if np.linalg.norm(boid.position - self.position) < self.perception: 60 avg_vec += boid.velocity 61 total += 1 62 if total > 0: 63 avg_vec /= total 64 avg_vec = Vector(*avg_vec) 65 avg_vec = (avg_vec /np.linalg.norm(avg_vec)) * self.max_speed 66 steering = avg_vec - self.velocity 67 68 return steering 69 70 71width = 1000 72height = 1000 73 74flock = [Boid(*np.random.rand(2)*1000, width, height) for _ in range(50)] 75def run(): 76 global flock 77 78 for boid in flock: 79 boid.apply_behaviour(flock) 80run()
[追記2]
そもそもVectorというオブジェクトを作らずにnumpy?など既存のものを使えば避けられる問題なのでしょうか。
回答1件
あなたの回答
tips
プレビュー