概要: 私は Python の初心者で、Python でローカリゼーション アルゴリズムを実装しています。このコードを実行するロボットは、最初にその環境を感知しsensor_right
、セルの色がリストの色と一致する場合に確率分布を乗算しmeasurements
ます。このmove
関数は、移動が成功する確率 0.8 でロボットを目的の場所に移動します。
コード :
colors = [['red', 'green', 'green', 'red' , 'red'],
['red', 'red', 'green', 'red', 'red'],
['red', 'red', 'green', 'green', 'red'],
['red', 'red', 'red', 'red', 'red']]
measurements = ['green', 'green', 'green' ,'green', 'green']
motions = [[0,0],[0,1],[1,0],[1,0],[0,1]]
sensor_right =1
p_move = 0.8
def show(p):
for i in range(len(p)):
print p[i]
p = []
sum=0
for i in range(len(colors)):
for j in range(len(colors[i])):
sum+=1
p=[[1.0/sum for j in range(len(colors[i]))] for i in range(len(colors))]
def sense(p,z):
q=[]
sum=0
for i in range(len(colors)):
new=[]
for j in range(len(colors[i])):
if (colors[i][j]==z) :
new.append(p[i][j]*sensor_right)
sum+=p[i][j]*sensor_right
else :
new.append(p[i][j]*(1-sensor_right))
sum+=p[i][j]*(1-sensor_right)
q.append(new)
for i in range(len(q)):
for j in range(len(q)):
q[i][j]/=sum
return q
def move(lst,u=[]):
q=[]
if (u[0]!=0) :
for i in range(len(lst)):
new=[]
for j in range(len(lst[i])):
val=lst[j-u[0]][i]*p_move
new.append(val)
q.append(new)
elif (u[1]!=0) :
for i in range(len(lst)):
new=[]
for j in range(len(lst[i])):
val=lst[i][j-u[1]]*p_move
new.append(val)
q.append(new)
return q
for i in range(len(measurements)):
p=sense(p,measurements[i])
p=move(p,motions[i])
show(p)
問題: コンパイラは次の出力を返します:
in sense
new.append(p[i][j]*(1-sensor_right))
IndexError: list index out of range
メソッドにコメントを付けて呼び出したときmotions
、コンパイラはエラーをスローせず、正しい出力を示しました。奇妙なことに、motions
メソッドの出力を確認したところ、メソッドによって返された 2 次元リストは、ループで呼び出されたときにメソッドに渡された 2 次元リストと同じ次元sense
でした。また、コンパイラがスローしなかったのはなぜですかでのエラー
new.append(p[i][j]*sensor_right)
sum+=p[i][j]*sensor_right
インデックスが範囲外の場合。
コンパイラがこのエラーをスローするのはなぜですか?