2016-09-05 7 views
-2

午後。コンウェイのライフゲーム、要素ごとの乗算および条件のキャンセル

私はMatlabの "Conway's Game of Life"シミュレーションに取り組んでいます。私がMatlabの世界で最高の人間ではないので、私は多くの研究を行い、この問題を攻撃するためにさまざまな手法でできるほど多くを読んでいます。

ライフゲームは4つの条件があります。

If a live cell has fewer than 2 live neighbors, cell dies. 
If the cell has two OR three neighbors, it lives. 
If a live cell has more than three neighbors, it dies as well. 
If a dead cell has exactly three neighbors, it is reborn. 

私の主な焦点は、私は、各セルがあることを知っているコンウェイグリッドの内側の「ガッツ」のために働くのコードの一部の並べ替えを取得することでした8つの隣人があり、私たちはあまりにも多くの問題なしにそれらの隣人のそれぞれを見ることができます。いくつかの試行錯誤

(およびためのif/then総なっていた)、これは、私はいくつかの条件を解決するために経由仕事しようとしたコードだった「ライフゲームを:」

Conway Code

「プロットパッチ」は、私たちの教授がコンウェイシミュレーションを「演奏する」ために私たちに呼び出さなければならない関数です。それは必要ないように私はここには含めません。また、エッジ/コーナー条件に関する "for"ループのコメントされた要素のいくつかを無視してください...私はConwayグリッドの「勇気」に問題があることを発見してから、まだその点に着目していません。私はこのコードを何度も走ったし、それが適切に動作しているように見えたのを見て喜んでいたき

私の問題:私は、X世代のためにそれを実行したときには、ある、私のプロットパッチはからの変化を示すました世代ごとに、そして「隣人の数」の数が正しいことが明らかになった。 しかし、私の行列をもっと見ていると、私は行列Aの新しい反復で気づいていました。 A(r,c)=A(r,c).*(nsum==2)+(nsum==3)の場合、nsumの行列行に2つの隣接行列と3の両方があるときはいつでも、 `2近傍行列はキャンセルされた条件になることがあります。私は以下のいくつかの例を挙げます。

これは、必要なところで動作します。両方nsum = 2とnsum = 3が残っていることに注意してください両方生きるかつて私は、私は2つの以上のリンクを投稿することができないことを通知してきた

Where Code Works

「A」マトリックスに再適用するので、私それはいつ奇妙になるのかを説明しています。私のセルの隣人がこのように見える 'nsum'から行列の行があるとします:[2 2 2]nsum行列がA行列に再乗算されると、その隣接行列の1つを除くすべてが突然キャンセルされ、新しいA行が[0 0 1]になります。あるいは、別のケースでは、私は[2 1 2]の細胞配列を持っていましたが、新しいAマトリックスに入れると[0 0 0]になりました。私は新しい行列がnsum==2 OR nsum==3の両方を見ているように条件を変更するなど|として演算子を使用「OR」しようとしましたが、それは私のnsum大きな混乱を作成し

を試してみました何

行列は最終的にゼロのグリッドになりました。私は&を使用しようとしなくなりました。&が、nsum==2nsum==3の両方の状態を見ているように見えましたが、それは正しいとは思われません。

私の質問 どこが間違っていましたか? 行列がelem-by-elemにA行列を掛けたときに、nsum==2nsum==3の両方が表示されることがあります。どのような論理的なステップが私はここで行方不明ですか?

ご指摘いただければ幸いです。

ありがとうございます。

答えて

0

最初にようこそ。

ランダムに選択するセルを選択すると、randpermを使用できます。

合計の計算にはconv2を使用できます。

(3 * 3近傍の中央セルを除く)ここ

が可能な実装です:

grid_size = 5; 
generations = 10; 
init_living_frac = 0.5; 
A = zeros(grid_size); %create a grid all of cells dead 
A(randperm((grid_size^2), floor(init_living_frac*(grid_size^2))))=1; % set randomly fraction of living cells to 1 

ker = [1 1 1;1 0 1;1 1 1]; %neighbour size is a 3 * 3 window, the center cell is excepted from sum 
for i = 1: generations 
    nsum = conv2(A, ker,'same');% compute sum 
    idx0 = A==0; 
    A(A == 1 & (nsum < 2 | nsum > 3)) = 0; %condition 1 & 3 
    A(idx0 & nsum == 3) = 1; % condition 4 
end 
関連する問題