概述:我是 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
方法的输出时,它返回的二维列表与在循环中调用该方法时传递给该方法的二维列表具有相同的维度sense
。另外,为什么编译器没有抛出错误在
new.append(p[i][j]*sensor_right)
sum+=p[i][j]*sensor_right
如果索引超出范围。
为什么编译器会抛出这个错误?