0

概要: 私は 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

インデックスが範囲外の場合。

コンパイラがこのエラーをスローするのはなぜですか?

4

3 に答える 3

1

for i in range(len(measurements)):あなたのpを初めて通過するときは 5x4 リストであり、 の戻り値はsense()に割り当てられた 5x4 リストpです。p次に is の出力に割り当てます。move(p,[0,0])両方の条件move()が falseでmove()あるため、空のリストが返されます。2回目は、たまたまのelse:ブランチにある例外を受け取りますsense()

于 2013-09-07T16:29:08.430 に答える
1

あなたは「コンパイラ」に言及し続けます。Python にはコンパイラがありません。これはインタープリター言語です。つまり、プログラムのテキストを見つけたときに直接実行します。(テキストのコンパイル済みバージョンである を使用した中間ステップがありpycますが、実際には関係ありません)。

コンパイル済み言語に慣れている場合、これは混乱を招く可能性があります。問題は、コンパイラが静的コンテキストでエラーを出すことではなく、プログラムが実際に実行iされ、 の境界外にあるpか、またはの境界j外にある結果ですp[i]

シンタックス エラー (Python ランタイムがプログラムを読み込んで解析しようとしたときにトリガーされる) をランタイム エラーから分離することはできますが、途中のステップはありません。これは、コンパイルされたプログラムとは哲学的に異なります。実行時に、プログラムの一部が変数の値 (したがって型) を変更できるからです。

現在の問題を解決するには、 と を印刷してください。またi、問題が発生している場所を絞り込むことができます。jp

これを行うと、 への呼び出しmoveが返さ[]れ、これが に割り当てられていることがわかりますp。そのため、次にrangeループが実行され、senseが呼び出されp = []、インデックス アクセスが範囲外エラーをスローします。

これを解決するには、プログラムのロジックを調べて、senseが返さ[]れる理由と、関数がp無効なインデックスを使用してインデックスを作成しようとする理由を判断します。

于 2013-09-07T15:59:08.417 に答える