概述:我是python新手,正在用python实现一个定位算法。执行此代码的robot首先感知其环境,如果单元格的颜色与measurements
列表中的颜色匹配,则将概率分布乘以sensor_right
。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
方法的输出时,它返回的2d列表与在循环。还有,为什么编译器没有抛出错误
new.append(p[i][j]*sensor_right)
sum+=p[i][j]*sensor_right
如果索引超出范围。你知道吗
为什么编译器会抛出此错误?你知道吗
我建议你看一下numpy,如果你打算使用这种矩阵操作的话。我已经重写了您代码的一部分,以便您可以比较并了解代码的运行情况:
你一直在说“编译器”。Python没有编译器。它是一种解释语言,这意味着它在找到程序时直接执行程序的文本。(在
pyc
中有一个中间步骤,它是文本的编译版本,但实际上并不相关)。你知道吗如果您习惯于编译语言,那么这可能会令人困惑。问题不在于编译器在静态上下文中给了您一个错误,而是程序实际运行的结果,或者
i
超出了p
的范围,或者j
超出了p[i]
的范围。你知道吗您可以从运行时错误中分离出语法错误(当Python运行时加载并试图解析您的程序时会触发语法错误),但是没有中间步骤。这在哲学上与编译程序不同,因为在运行时,程序的一个位可以改变变量的值(从而改变类型)。你知道吗
要解决您当前的问题,请打印
i
和j
,以及p
,这样您就可以缩小问题发生的范围。你知道吗如果您这样做,您将看到对
move
的调用正在返回[]
,并且它被分配回p
。所以下次运行range
循环时,sense
被p = []
调用,任何索引访问都会抛出一个越界错误。你知道吗要解决这个问题,请查看程序的逻辑并确定为什么
sense
返回[]
,以及为什么函数试图用无效索引索引p
。你知道吗第一次通过你的
for i in range(len(measurements)):
p是一个5x4列表,sense()
的返回是一个分配给p
的5x4列表。p
然后分配给move(p,[0,0])
的输出,因为move()
中的两个条件都是falsemove()
返回一个空列表。第二次得到的异常恰好位于sense()
的else:
分支。你知道吗相关问题 更多 >
编程相关推荐