2013年7月3日水曜日

To Implement 1D Cellular Automaton in Pure Data.


wikipedia の説明によりますと "最も単純だが自明ではないCAは、1次元で各セルは2つの状態をとることができ、近傍は両側に接している隣のセルという場合である。" そうです。 "自明ではない" としているところから、最も条件の少ない CA として証明はされていないのだろうと推測します。

さてさて、この場合、注目する中央1つのセルとその近傍の2つのセルのとれる状態は全部で 23= 8 通り。2つの状態をそれぞれ◆と◇で表現すると以下のよう。

◆◆◆◆◆◇◆◇◆◆◇◇◇◆◆◇◆◇◇◇◆◇◇◇

そして注目する中央のセルが近傍のセルの状態でどのように次の状態に移行するか、という規則を定めます。

◆◆◆◆◆◇◆◇◆◆◇◇◇◆◆◇◆◇◇◇◆◇◇◇

上の例では並びが◆◇◇, ◇◆◆, ◇◆◇, ◇◇◆のとき注目する中央のセルが◆にそれ以外は◇になります。とれる状態が2つであることから、これらを◆=1、◇=0 としてビットの並びに置き換えますと、

  111    110    101    100    011    010    001    000  
00011110

となり、規則が8ビット(0 から 255)で参照できるようになります。この例では 00011110 なので、十進で 30 と表現できます。規則の総数は 28 = 256 通りになります。


Pure Data での実装
 32 個のセルを用意し現在の状態(0 or 1)を Array に保存しています。セルの両端はつながっているもの(..., 31, 0, 1, 2, 3, ..., 29, 30, 31, 0, ...)としています。[for++] を使い、中央の注目するセルを Array から順番に呼び出しています。そして、まず注目する中央と近傍のセルの状態をビットの並びに変換するのに [expr] を使って計算します。

expr ($s2[($f1+31) % 32] << 2) + ($s2[$f1] << 1) + ($s2[$f1 + 1] % 32)

$s2は起動時に現在の状態を保存してある Array の名前がセットされます。そこから [for++] で 0 から 31 が順番に読み出されるのですが、近傍の表現に注意します。注目する中央のセルが 0 番目のとき 31 を返すように、余りを使っています。31 番目のときも同様です。読み出された値は並それぞれ、シフトします。これで 111 から 000(0 から 7)のどれかになります。そして、この数値をシフトしてやれば規則の想定するビットの並びのどれかになりますので、そのまま AND で演算してやると、合致しているならば 0 以上になります。これより下の処理の流れは [tabwrite] に書き込むための処理です。[expr] のみで書くなら、

expr if ((1 << ($s3[($f1+31) % 32] << 2) + ($s3[$f1] << 1) + ($s3[$f1 + 1] % 32) & $f2) > 0, 1, 0 );
$f1


として 2nd アウトレットをそのまま [tabwrite] の 2nd インレット、同様に 1st どうしをつなげてやります。


CA32.pd
#N canvas 602 53 756 546 10;
#X obj 102 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1;
#X obj 119 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 136 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 153 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1;
#X obj 170 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 187 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 204 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1;
#X obj 221 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 238 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1;
#X obj 255 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 272 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 289 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 306 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 323 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1;
#X obj 340 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1;
#X obj 357 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 374 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 391 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 408 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 425 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1;
#X obj 442 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 459 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 476 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 493 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1;
#X obj 510 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1;
#X obj 527 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 544 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 561 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 578 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 595 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 612 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 629 161 tgl 16 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1;
#X obj 190 102 bng 15 250 50 0 empty empty RANDOM 17 7 0 10 -262144 -1 -1;
#X obj 309 102 bng 15 250 50 0 empty empty CLEAR 17 7 0 10 -262144 -1 -1;
#X floatatom 547 101 5 1 255 1 Rule(1-255) - -;
#N canvas 373 312 450 278 (subpatch) 0;
#X array \$0-CURRENT_GENERATION 32 float 2;
#X coords 0 278 1 277 330 70 0;
#X restore 101 378 graph;
#N canvas 0 22 450 278 (subpatch) 0;
#X array \$0-NEXT_GENERATION 32 float 2;
#X coords 0 278 1 277 330 70 0;
#X restore 101 403 graph;
#X obj 547 62 loadbang;
#X msg 547 81 30;
#X obj 428 31 inlet;
#X text 467 30 << Bang next phase;
#X obj 498 498 outlet;
#N canvas 122 43 1313 594 ______________SET_CURRENT_GENERATION_TABLE_______________ 0;
#X obj 16 12 inlet;
#X obj 56 12 inlet;
#X obj 96 12 inlet;
#X obj 136 12 inlet;
#X obj 176 12 inlet;
#X obj 216 12 inlet;
#X obj 256 12 inlet;
#X obj 296 12 inlet;
#X obj 336 12 inlet;
#X obj 376 12 inlet;
#X obj 416 12 inlet;
#X obj 456 12 inlet;
#X obj 496 12 inlet;
#X obj 536 12 inlet;
#X obj 576 12 inlet;
#X obj 616 12 inlet;
#X obj 656 12 inlet;
#X obj 696 12 inlet;
#X obj 736 12 inlet;
#X obj 776 12 inlet;
#X obj 816 12 inlet;
#X obj 856 12 inlet;
#X obj 896 12 inlet;
#X obj 936 12 inlet;
#X obj 976 12 inlet;
#X obj 1016 12 inlet;
#X obj 1056 12 inlet;
#X obj 1096 12 inlet;
#X obj 1136 12 inlet;
#X obj 1176 12 inlet;
#X obj 1216 12 inlet;
#X obj 1256 12 inlet;
#X msg 16 31 \$1 0;
#X msg 56 31 \$1 1;
#X msg 96 31 \$1 2;
#X msg 136 31 \$1 3;
#X msg 176 31 \$1 4;
#X msg 216 31 \$1 5;
#X msg 256 31 \$1 6;
#X msg 296 31 \$1 7;
#X msg 336 31 \$1 8;
#X msg 376 31 \$1 9;
#X msg 416 31 \$1 10;
#X msg 456 31 \$1 11;
#X msg 496 31 \$1 12;
#X msg 536 31 \$1 13;
#X msg 576 31 \$1 14;
#X msg 616 31 \$1 15;
#X msg 656 31 \$1 16;
#X msg 696 31 \$1 17;
#X msg 736 31 \$1 18;
#X msg 776 31 \$1 19;
#X msg 816 31 \$1 20;
#X msg 856 31 \$1 21;
#X msg 896 31 \$1 22;
#X msg 936 31 \$1 23;
#X msg 976 31 \$1 24;
#X msg 1016 31 \$1 25;
#X msg 1056 31 \$1 26;
#X msg 1096 31 \$1 27;
#X msg 1136 31 \$1 28;
#X msg 1176 31 \$1 29;
#X msg 1216 31 \$1 30;
#X msg 1256 31 \$1 31;
#X obj 16 509 tabwrite \$0-CURRENT_GENERATION;
#X connect 0 0 32 0;
#X connect 1 0 33 0;
#X connect 2 0 34 0;
#X connect 3 0 35 0;
#X connect 4 0 36 0;
#X connect 5 0 37 0;
#X connect 6 0 38 0;
#X connect 7 0 39 0;
#X connect 8 0 40 0;
#X connect 9 0 41 0;
#X connect 10 0 42 0;
#X connect 11 0 43 0;
#X connect 12 0 44 0;
#X connect 13 0 45 0;
#X connect 14 0 46 0;
#X connect 15 0 47 0;
#X connect 16 0 48 0;
#X connect 17 0 49 0;
#X connect 18 0 50 0;
#X connect 19 0 51 0;
#X connect 20 0 52 0;
#X connect 21 0 53 0;
#X connect 22 0 54 0;
#X connect 23 0 55 0;
#X connect 24 0 56 0;
#X connect 25 0 57 0;
#X connect 26 0 58 0;
#X connect 27 0 59 0;
#X connect 28 0 60 0;
#X connect 29 0 61 0;
#X connect 30 0 62 0;
#X connect 31 0 63 0;
#X connect 32 0 64 0;
#X connect 33 0 64 0;
#X connect 34 0 64 0;
#X connect 35 0 64 0;
#X connect 36 0 64 0;
#X connect 37 0 64 0;
#X connect 38 0 64 0;
#X connect 39 0 64 0;
#X connect 40 0 64 0;
#X connect 41 0 64 0;
#X connect 42 0 64 0;
#X connect 43 0 64 0;
#X connect 44 0 64 0;
#X connect 45 0 64 0;
#X connect 46 0 64 0;
#X connect 47 0 64 0;
#X connect 48 0 64 0;
#X connect 49 0 64 0;
#X connect 50 0 64 0;
#X connect 51 0 64 0;
#X connect 52 0 64 0;
#X connect 53 0 64 0;
#X connect 54 0 64 0;
#X connect 55 0 64 0;
#X connect 56 0 64 0;
#X connect 57 0 64 0;
#X connect 58 0 64 0;
#X connect 59 0 64 0;
#X connect 60 0 64 0;
#X connect 61 0 64 0;
#X connect 62 0 64 0;
#X connect 63 0 64 0;
#X restore 189 335 pd ______________SET_CURRENT_GENERATION_TABLE_______________ ;
#N canvas 120 339 1600 446 _____________CURRENT_GENERATION_CONTROLLER_______________ 0;
#X obj 16 374 outlet;
#X obj 58 374 outlet;
#X obj 100 374 outlet;
#X obj 142 374 outlet;
#X obj 184 374 outlet;
#X obj 226 374 outlet;
#X obj 268 374 outlet;
#X obj 310 374 outlet;
#X obj 352 374 outlet;
#X obj 394 374 outlet;
#X obj 436 374 outlet;
#X obj 478 374 outlet;
#X obj 520 374 outlet;
#X obj 562 374 outlet;
#X obj 604 374 outlet;
#X obj 646 374 outlet;
#X obj 688 374 outlet;
#X obj 730 374 outlet;
#X obj 772 374 outlet;
#X obj 814 374 outlet;
#X obj 856 374 outlet;
#X obj 898 374 outlet;
#X obj 940 374 outlet;
#X obj 982 374 outlet;
#X obj 1024 374 outlet;
#X obj 1066 374 outlet;
#X obj 1108 374 outlet;
#X obj 1150 374 outlet;
#X obj 1192 374 outlet;
#X obj 1234 374 outlet;
#X obj 1276 374 outlet;
#X obj 1318 374 outlet;
#X obj 344 40 loadbang;
#X obj 544 16 inlet;
#X text 583 14 <- Clear Bang;
#X text 400 39 <- Initializer;
#X msg 544 112 \$1 0;
#X obj 333 20 inlet;
#X text 372 18 <- Random Bang;
#X obj 333 100 until;
#X msg 333 81 32;
#X obj 333 119 random 2;
#X obj 358 157 random 32;
#X obj 333 138 route 0 1;
#X obj 333 195 random 32;
#X msg 333 214 \$1 0;
#X msg 358 176 \$1 1;
#X obj 544 93 for++ 0 31;
#X obj 544 265 route 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31;
#X obj 694 16 inlet;
#X text 733 14 << Bang Next Phase;
#X obj 694 93 for++ 0 31;
#X obj 694 112 tabread \$0-NEXT_GENERATION;
#X obj 694 150 f 0;
#X obj 718 150 + 1;
#X obj 769 169 route 31;
#X msg 769 188 0;
#X obj 694 169 pack;
#X obj 694 131 t b f;
#X obj 344 59 del 8;
#N canvas 1241 43 605 584 NEXT_GENERATION_GENERATOR 0;
#X obj 59 247 inlet;
#X text 97 245 <- Rule (float);
#X obj 44 285 > 0;
#X obj 44 37 inlet;
#X text 82 35 << Start Bang;
#X obj 395 56 float \$0;
#X obj 395 37 loadbang;
#X obj 44 56 for++ 0 31;
#X obj 90 390 + 1;
#X obj 65 390 f 0;
#X obj 198 385 route 31;
#X msg 198 404 0;
#X obj 44 334 t f b;
#X obj 44 467 pack;
#X obj 44 533 tabwrite \$0-NEXT_GENERATION;
#X msg 395 75 symbol \$1-CURRENT_GENERATION;
#X obj 44 266 &;
#X obj 101 75 outlet;
#X text 145 74 << End bang;
#X text 223 531 << Next Generation state;
#X obj 44 209 <<;
#X obj 44 171 t b f;
#X obj 44 190 float 1;
#X text 72 208 << Current Generation state 1 \, 2 \, 4 \, 8 \, 16 \, 32 \, 64 or 128;
#X obj 44 94 expr ($s2[($f1+31) % 32] << 2) + ($s2[$f1] << 1) + ($s2[$f1 + 1] % 32);
#X connect 0 0 16 1;
#X connect 2 0 12 0;
#X connect 3 0 7 0;
#X connect 5 0 15 0;
#X connect 6 0 5 0;
#X connect 7 0 24 0;
#X connect 7 1 17 0;
#X connect 8 0 9 1;
#X connect 9 0 8 0;
#X connect 9 0 10 0;
#X connect 9 0 13 1;
#X connect 10 0 11 0;
#X connect 11 0 9 1;
#X connect 12 0 13 0;
#X connect 12 1 9 0;
#X connect 13 0 14 0;
#X connect 15 0 24 1;
#X connect 16 0 2 0;
#X connect 20 0 16 0;
#X connect 21 0 22 0;
#X connect 21 1 20 1;
#X connect 22 0 20 0;
#X connect 24 0 21 0;
#X restore 694 74 pd NEXT_GENERATION_GENERATOR;
#X obj 859 16 inlet;
#X text 898 14 << Rule (float);
#X obj 1382 374 outlet;
#X text 1284 399 32nd Cell >>;
#X text 17 399 << 1st Cell;
#N canvas 755 322 709 481 __________PUSH_CURRENT_GENERATION__________ 0;
#X obj 14 8 inlet;
#X obj 13 438 outlet;
#X obj 13 419 bang;
#X obj 297 438 outlet;
#X obj 14 28 for++ 0 31;
#X obj 14 48 tabread \$0-CURRENT_GENERATION;
#X obj 14 96 f 0;
#X obj 38 96 + 1;
#X obj 13 334 pack f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f;
#X obj 14 160 pack;
#X obj 14 67 t b f;
#X obj 14 200 route 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31;
#X obj -13 303 float;
#X msg 387 321 0;
#X obj 348 232 t b f b;
#X text 52 7 << Start Bang;
#X text 59 437 << Bang;
#X text 343 436 << Current Generation List;
#X connect 0 0 4 0;
#X connect 2 0 1 0;
#X connect 4 0 5 0;
#X connect 5 0 10 0;
#X connect 6 0 7 0;
#X connect 6 0 9 0;
#X connect 7 0 6 1;
#X connect 8 0 2 0;
#X connect 8 0 3 0;
#X connect 9 0 11 0;
#X connect 10 0 6 0;
#X connect 10 1 9 1;
#X connect 11 0 12 1;
#X connect 11 1 8 1;
#X connect 11 2 8 2;
#X connect 11 3 8 3;
#X connect 11 4 8 4;
#X connect 11 5 8 5;
#X connect 11 6 8 6;
#X connect 11 7 8 7;
#X connect 11 8 8 8;
#X connect 11 9 8 9;
#X connect 11 10 8 10;
#X connect 11 11 8 11;
#X connect 11 12 8 12;
#X connect 11 13 8 13;
#X connect 11 14 8 14;
#X connect 11 15 8 15;
#X connect 11 16 8 16;
#X connect 11 17 8 17;
#X connect 11 18 8 18;
#X connect 11 19 8 19;
#X connect 11 20 8 20;
#X connect 11 21 8 21;
#X connect 11 22 8 22;
#X connect 11 23 8 23;
#X connect 11 24 8 24;
#X connect 11 25 8 25;
#X connect 11 26 8 26;
#X connect 11 27 8 27;
#X connect 11 28 8 28;
#X connect 11 29 8 29;
#X connect 11 30 8 30;
#X connect 11 31 14 0;
#X connect 12 0 8 0;
#X connect 13 0 6 1;
#X connect 14 0 12 0;
#X connect 14 1 8 31;
#X connect 14 2 13 0;
#X restore 694 55 pd __________PUSH_CURRENT_GENERATION__________;
#X text 1426 373 << Current Generation List;
#X connect 32 0 59 0;
#X connect 33 0 47 0;
#X connect 36 0 48 0;
#X connect 37 0 40 0;
#X connect 39 0 41 0;
#X connect 40 0 39 0;
#X connect 41 0 43 0;
#X connect 42 0 46 0;
#X connect 43 0 44 0;
#X connect 43 1 42 0;
#X connect 44 0 45 0;
#X connect 45 0 48 0;
#X connect 46 0 48 0;
#X connect 47 0 36 0;
#X connect 48 0 0 0;
#X connect 48 1 1 0;
#X connect 48 2 2 0;
#X connect 48 3 3 0;
#X connect 48 4 4 0;
#X connect 48 5 5 0;
#X connect 48 6 6 0;
#X connect 48 7 7 0;
#X connect 48 8 8 0;
#X connect 48 9 9 0;
#X connect 48 10 10 0;
#X connect 48 11 11 0;
#X connect 48 12 12 0;
#X connect 48 13 13 0;
#X connect 48 14 14 0;
#X connect 48 15 15 0;
#X connect 48 16 16 0;
#X connect 48 17 17 0;
#X connect 48 18 18 0;
#X connect 48 19 19 0;
#X connect 48 20 20 0;
#X connect 48 21 21 0;
#X connect 48 22 22 0;
#X connect 48 23 23 0;
#X connect 48 24 24 0;
#X connect 48 25 25 0;
#X connect 48 26 26 0;
#X connect 48 27 27 0;
#X connect 48 28 28 0;
#X connect 48 29 29 0;
#X connect 48 30 30 0;
#X connect 48 31 31 0;
#X connect 49 0 66 0;
#X connect 51 0 52 0;
#X connect 52 0 58 0;
#X connect 53 0 54 0;
#X connect 53 0 55 0;
#X connect 53 0 57 0;
#X connect 54 0 53 1;
#X connect 55 0 56 0;
#X connect 56 0 53 1;
#X connect 57 0 48 0;
#X connect 58 0 53 0;
#X connect 58 1 57 1;
#X connect 59 0 40 0;
#X connect 60 0 51 0;
#X connect 61 0 60 1;
#X connect 66 0 60 0;
#X connect 66 1 63 0;
#X restore 190 119 pd _____________CURRENT_GENERATION_CONTROLLER_______________ ;
#X obj 402 73 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1;
#X text 543 498 << Current Generation List;
#X text 142 377 << Current Generation;
#X text 141 402 << Next Generation;
#X obj 609 338 print -Rule_30;
#X connect 0 0 42 0;
#X connect 1 0 42 1;
#X connect 2 0 42 2;
#X connect 3 0 42 3;
#X connect 4 0 42 4;
#X connect 5 0 42 5;
#X connect 6 0 42 6;
#X connect 7 0 42 7;
#X connect 8 0 42 8;
#X connect 9 0 42 9;
#X connect 10 0 42 10;
#X connect 11 0 42 11;
#X connect 12 0 42 12;
#X connect 13 0 42 13;
#X connect 14 0 42 14;
#X connect 15 0 42 15;
#X connect 16 0 42 16;
#X connect 17 0 42 17;
#X connect 18 0 42 18;
#X connect 19 0 42 19;
#X connect 20 0 42 20;
#X connect 21 0 42 21;
#X connect 22 0 42 22;
#X connect 23 0 42 23;
#X connect 24 0 42 24;
#X connect 25 0 42 25;
#X connect 26 0 42 26;
#X connect 27 0 42 27;
#X connect 28 0 42 28;
#X connect 29 0 42 29;
#X connect 30 0 42 30;
#X connect 31 0 42 31;
#X connect 32 0 43 0;
#X connect 33 0 43 1;
#X connect 34 0 43 3;
#X connect 37 0 38 0;
#X connect 38 0 34 0;
#X connect 39 0 43 2;
#X connect 43 0 0 0;
#X connect 43 1 1 0;
#X connect 43 2 2 0;
#X connect 43 3 3 0;
#X connect 43 4 4 0;
#X connect 43 5 5 0;
#X connect 43 6 6 0;
#X connect 43 7 7 0;
#X connect 43 8 8 0;
#X connect 43 9 9 0;
#X connect 43 10 10 0;
#X connect 43 11 11 0;
#X connect 43 12 12 0;
#X connect 43 13 13 0;
#X connect 43 14 14 0;
#X connect 43 15 15 0;
#X connect 43 16 16 0;
#X connect 43 17 17 0;
#X connect 43 18 18 0;
#X connect 43 19 19 0;
#X connect 43 20 20 0;
#X connect 43 21 21 0;
#X connect 43 22 22 0;
#X connect 43 23 23 0;
#X connect 43 24 24 0;
#X connect 43 25 25 0;
#X connect 43 26 26 0;
#X connect 43 27 27 0;
#X connect 43 28 28 0;
#X connect 43 29 29 0;
#X connect 43 30 30 0;
#X connect 43 31 31 0;
#X connect 43 32 41 0;
#X connect 43 32 48 0;
#X connect 44 0 43 2;
#X coords 0 -1 1 1 547 80 2 100 100;

0 件のコメント:

コメントを投稿