0

コードは、ローカリゼーション アルゴリズムの実装です。

colors = [['red', 'green', 'green', 'red' , 'red'],
          ['red', 'red', 'green', 'red', 'red'],
          ['red', 'red', 'green', 'green', 'red'],
          ['red', 'red', 'red', 'red', 'red']]


motions = [[0,0],[0,1],[1,0],[1,0],[0,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 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][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]*p_move
                new.append(val)
            q.append(new)

    return q

a=[[0 for i in range(len(colors[j]))] for j in range(len(colors))]

for i in range(len(motions)):
    a=move(p,motions[i])   


show(p)

上記のコードはTypeError、次のステートメントの質問で指定されたをスローします。

val=lst[i][j-u]*p_move

なぜこれが起こっているのか教えてください。私は Python の初心者であり、コンパイラがこのエラーをスローする理由がわかりません。また、リストにあるリストの値に従って、列と行の値を変更しようとしていますmotions。これを達成しようとしている方法は正しいですか?

編集

多くの人がこのコードの目的を尋ねてきました。質問のコメント セクションで述べたことを繰り返します。これは、ローカリゼーション アルゴリズムを実装するためのコードの一部です。コードのこの部分は、移動の確率を計算するために使用されます。目的のセルへの移動が成功する確率は、p_move = 0.8 です。デバイスがそのセルに移動するように命令された場合、特定のセルの以前の確率にこの値が乗算されます。

ただし、コメンテーターの 1 人によって要求されたサンプル出力には、コードの他の部分を含める必要があり、これにはさらに説明が必要であり、目的がさらに混乱します。

4

2 に答える 2

0

あなたがやろうとしていることを完全に理解しているかどうかはわかりません。@hughdbrown はコードをそのまま使用して多くの改善を提供しましたが、コードで何を達成しようとしているのかわかりません。モーション リストの動きに基づいて特定の値を変更する場合は、次のように簡単に変更できます。

a = [[0]*len(c) for c in colors]
index = [sum(x) for x in zip(*motions)]
a[index[0]][index[1]] = p[index[0]][index[1]] * p_move

または、動きに沿ってすべての値を変更しようとしている場合は、ジェネレーター関数が機能します。

def move(motions):
    index0, index1 = 0, 0
    for m in motions:
        index0 += m[0]
        index1 += m[1]
        yield (index0,index1)

motions = [[0,0],[0,1],[1,0],[1,0],[0,1]]
a = [[0]*len(c) for c in colors]

for row,col in move(motions):
    a[row][col] = p[row][col]*p_move

show(motions)
show(p)
show(a)

出力:

[0, 0]
[0, 1]
[1, 0]
[1, 0]
[0, 1]

[0.05, 0.05, 0.05, 0.05, 0.05]
[0.05, 0.05, 0.05, 0.05, 0.05]
[0.05, 0.05, 0.05, 0.05, 0.05]
[0.05, 0.05, 0.05, 0.05, 0.05]

[0.04, 0.04, 0, 0, 0]
[0, 0.04, 0, 0, 0]
[0, 0.04, 0.04, 0, 0]
[0, 0, 0, 0, 0]
于 2013-09-07T13:53:43.663 に答える
0

これは、コードの投機的な改善です。他の多くの人と同じように、あなたが何をしようとしているのかわかりません。また、内部のインデックスの設定にもmove工夫が必要です。おそらくそれは からの値ですu

from pprint import pprint

colors = [
    ['red', 'green', 'green', 'red' , 'red'],
    ['red', 'red', 'green', 'red', 'red'],
    ['red', 'red', 'green', 'green', 'red'],
    ['red', 'red', 'red', 'red', 'red']
]

motions = [[0,0],[0,1],[1,0],[1,0],[0,1]]

p_move = 0.8

def move(lst, u):
    q = []
    if u[0] != 0:
        index = u[0]
        for i, elem in enumerate(lst):
            q.append([lst[j-index][i] * p_move] for j in range(len(elem)))
    elif u[1] != 0:
        index = u[1]
        for i, elem in enumerate(lst):
            q.append([lst[i][j-index] * p_move] for j in range(len(elem)))
    return q

def main():
    total = sum(len(c) for c in colors)
    p = [[1.0 / total] * len(c) for c in colors]
    a = [[0] * len(c) for c in colors]
    for m in motions:
        a = move(p, m)
    pprint(p)

main()
于 2013-09-07T12:21:15.657 に答える