3

Pythonで行うことにしたプロジェクトがあります。簡単に言うと、リストのリストがあります。それらのそれぞれにもリストがあり、要素が 1 つだけの場合もあれば、それ以上の場合もあります。次のようになります。

rules=[
[[1],[2],[3,4,5],[4],[5],[7]]
[[1],[8],[3,7,8],[3],[45],[12]]
[[31],[12],[43,24,57],[47],[2],[43]]
]

ポイントは、numpy 配列の値をこのルール (ルール テーブルの要素) の値と比較することです。一部の [x][y] ポイントを最初の要素 (たとえば、最初の要素の 1) と比較し、それが真の場合は、配列の値 [x-1][j] をリストの 2 番目と比較します。[x][y] ポイントの値を変更するには、最初の 5 つの比較が真でなければなりません。私はこのようにsthを書きました(メイン関数はSimulateLoopです。simulate2関数は2番目の関数の後に書かれたため、順序が入れ替わっています):

def simulate2(self, i, j, w, rule):
        data = Data(rule)
        if w.world[i][j] in data.c:
            if w.world[i-1][j] in data.n:
                if w.world[i][j+1] in data.e:
                    if w.world[i+1][j] in data.s:
                        if w.world[i][j-1] in data.w:
                            w.world[i][j] = data.cc[0]
                        else: return
                    else: return
                else: return
            else: return
        else: return




def SimulateLoop(self,w):
    for z in range(w.steps):
            for i in range(2,w.x-1):
                for j in range(2,w.y-1):
                    for rule in w.rules:
                        self.simulate2(i,j,w,rule)

データクラス:

class Data:
    def __init__(self, rule):
        self.c = rule[0]
        self.n = rule[1]
        self.e = rule[2]
        self.s = rule[3]
        self.w = rule[4]
        self.cc = rule[5]

NumPy 配列は World クラスのオブジェクトです。ルールは上記のリストであり、別のプログラム (GPL ライセンス) から取得した関数によって解析されます。

正直なところ、うまく機能しているように見えますが、そうではありません。私は他の可能性を試していましたが、運が悪かったのです。動作しています。インタプリタはエラーを返しませんが、何らかの形で配列の値が間違って変化しています。パーサーを取得したプログラム (GPL ライセンス) によって提供されたので、ルールは適切です。

多分それは役に立つでしょう - それはペリエのループ、修正されたラングトンのループ (人工生命) です。

どんな助けにも非常に感謝します!)

4

1 に答える 1

0

私はペリエのループに詳しくありませんが、有名な「ゲーム ライフ」のようなものをコーディングすると、単純な間違いを犯したことになります。つまり、次の世代を同じ配列に格納して、それを破壊します。

通常、このスケッチのように、次の世代を一時配列に保存し、スイープ後にコピー/スワップを行います。

def do_step_in_game_life(world):
    next_gen = zeros(world.shape)    # <<< Tmp array here
    Nx, Ny = world.shape
    for i in range(1, Nx-1):
        for j in range(1, Ny-1):
            neighbours = sum(world[i-1:i+2, j-1:j+2]) - world[i,j]
            if neighbours < 3:
                next_gen[i,j] = 0
            elif ...
    world[:,:] = next_gen[:,:]       # <<< Saving computed next generation
于 2011-08-18T02:40:15.680 に答える