another questionに触発されましたが、このシミュレーションを実装するために画像処理技術を使用しましたが、具体的には、morphological dilationを使用して癌細胞を広げることができます。
中心が固定され、そして他の
1
は、他の8つの残りの位置のいずれかにランダムに配置されている
1 0 0
0 1 0
0 0 0
:
アイデアは、のように見える構造要素を用いて各ピクセルを拡張することです。これは、その方向にピクセルを効果的に拡張する。
拡張の方法は、1つのピクセルセットだけの空白イメージを作成し、単純なOR操作を使用してすべての結果を累積することです。
私たちは、すべてのピクセルを考慮する必要はなく、癌細胞のクラスターによって形成される現在のブロックの周囲にあるものだけを考慮する必要がありません。内側のピクセルはすでにガン細胞に囲まれており、拡張されても効果はありません。
さらに高速化するため、1回の呼び出しで同じ方向に拡張されるように選択されたすべてのピクセルに対して拡張を実行します。したがって、すべての反復において、最大で8回の拡張操作を実行します。
これによりコードが比較的高速になりました(私は1000x1000グリッドまでテストしました)。また、すべての反復で同じタイミングを維持します(グリッドがいっぱいになるにつれて減速しません)。ここで
は私の実装です:
%# initial grid
img = false(500,500);
%# pick 10 random cells, and set them as cancerous
img(randi(numel(img),[10 1])) = true;
%# show initial image
hImg = imshow(img, 'Border','tight', 'InitialMag',100);
%# build all possible structing elements
%# each one dilates in one of the 8 possible directions
SE = repmat([0 0 0; 0 1 0; 0 0 0],[1 1 8]);
SE([1:4 6:9] + 9*(0:7)) = 1;
%# run simulation until all cells have cancer
BW = false(size(img));
while ~all(img(:)) && ishandle(hImg)
%# find pixels on the perimeter of all "blocks"
on = find(bwperim(img,8));
%# percentage chance of division
on = on(rand(size(on)) > 0.5); %# 50% probability of cell division
if isempty(on), continue; end
%# decide on a direction for each pixel
d = randi(size(SE,3),[numel(on) 1]);
%# group pixels according to direction chosen
dd = accumarray(d, on, [8 1], @(x){x});
%# dilate each group of pixels in the chosen directions
%# to speed up, we perform one dilation for all pixels with same direction
for i=1:8
%# start with an image with only those pixels set
BW(:) = false;
BW(dd{i}) = true;
%# dilate in the specified direction
BW = imdilate(BW, SE(:,:,i));
%# add results to final image
img = img | BW;
end
%# show new image
set(hImg, 'CData',img)
drawnow
end
私も10個のランダムな初期癌細胞(警告と500×500のグリッド上のシミュレーション、アニメーションの作成:.GIF画像をサイズは約1MBです、そうかもしれません)すでにブロブ分裂の中心に3×3とする細胞である癌ブロブを持っている場合は、ルール(または何のルールがあるとは何か
)の接続に応じて、ロードに時間がかかります娘細胞を置くために? –
ループの代わりに再帰的な解決に役立つ問題のように思えます。 – slayton
@HighPerformanceMarkあなたの質問は元の質問で答えられます:_ "...もしそうでなければ、その場所に既にあるセルは突き当てられ、最後のセルが空のスペースを見つけてプロセスが停止するまで続きます。 –