2013-09-07 2 views
0

개요 : 저는 파이썬에서 초보자이며 파이썬에서 현지화 알고리즘을 구현 중입니다. 이 코드를 실행하는 로봇은 먼저 셀의 색이 measurements 목록의 색과 일치하면 해당 환경을 감지하고 확률 분포에 sensor_right을 곱합니다. move 함수 성공적인 운동 0.8 확률 원하는 위치로 로봇을 이동 :이 python 코드 스 니펫의 문제점은 무엇입니까?

번호 :

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) 

문제점 :

: 컴파일러는 다음 OUPUT 반환 in sense new.append(p[i][j]*(1-sensor_right)) IndexError: list index out of range

내가 전화를했을 때 motions 메서드에서 컴파일러가 오류를 throw하지 않고 올바른 출력을 보여줍니다. 이상하게도, 내가 motions 메소드의 출력을 검사했을 때, 루프에 호출 될 때 sense 메소드로 전달 된 2-d리스트와 동일한 치수를 갖는 2d리스트가 리턴되었습니다. 또한 왜 컴파일러가

new.append(p[i][j]*sensor_right) 
sum+=p[i][j]*sensor_right 

에 오류가 발생하면 색인이 범위를 벗어났습니다.

왜 컴파일러에서이 오류가 발생합니까?

답변

1

처음으로 for i in range(len(measurements)): p가 5x4 목록 인 경우 sense()의 결과는 p에 할당 된 5x4 목록입니다. 의 두 조건이 모두 거짓 일 때 pmove(p,[0,0])의 출력에 할당됩니다. move()은 빈 목록을 반환합니다. 두 번째 번에 sense()else: 지점에 예외가 발생합니다.

+0

감사합니다. Btw 크기는 5x4입니다. –

1

'컴파일러'를 계속 언급합니다. 파이썬에는 컴파일러가 없습니다. 이것은 해석 된 언어입니다. 즉, 프로그램 텍스트를 발견하면 직접 실행합니다. (pyc과 중간 단계가 있습니다.이 단계는 텍스트의 컴파일 된 버전이지만 실제로는 관련이 없습니다.)

언어를 컴파일하는 데 익숙하다면 혼동을 줄 수 있습니다. 문제는 컴파일러가 정적 컨텍스트에서 오류를 발생시키는 것이 아니라 실제로 실행중인 프로그램의 결과이고 ip의 범위를 벗어 났거나 이 범위를 벗어난 것이 p[i]입니다.

런타임 오류에서 파이썬 런타임이로드되어 실행될 때 트리거되고 프로그램을 구문 분석하려고하는 구문 오류를 구분할 수 있지만 중간 단계는 없습니다. 런타임시 프로그램의 한 비트가 변수의 값 (따라서 유형)을 변경할 수 있기 때문에 이것은 컴파일 된 프로그램과 철학적으로 다릅니다.

현재 문제를 해결하려면 ijp을 인쇄하면 문제가 발생한 위치를 좁힐 수 있습니다.

이렇게하면 move에 대한 호출이 []을 반환하며이 번호가 p으로 다시 할당됨을 알 수 있습니다. 따라서 다음 번에 range 루프가 실행될 때 이 호출되고 p = []과 함께 인덱스 액세스가 초과되면 오류가 발생합니다.

문제를 해결하려면 sense[]을 반환하는 이유와 잘못된 인덱스를 사용하여 p을 인덱싱하려고하는 이유를 결정하십시오.

0

이 종류의 행렬 조작을 사용하려면 numpy을 살펴 보시기 바랍니다. 나는 당신이 비교할 수 있고 그것이가는 방법에 대한 느낌을 얻을 수 있도록 코드의 일부를 다시 작성했습니다 :

import numpy as np 

colors = np.array([['red', 'green', 'green', 'red' , 'red'], 
        ['red', 'red', 'green', 'red', 'red'], 
        ['red', 'red', 'green', 'green', 'red'], 
        ['red', 'red', 'red', 'red', 'red']]) 

sensor_right = 1 
p = np.ones_like(colors, dtype=np.float)/colors.size 

def sense(p, z): 
    condition = colors == z 
    p[condition] *= sensor_right 
    p[~condition] *= 1 - sensor_right 
    return p/p.sum() 
관련 문제