ラングトンのアリ

ラングトンのアリとは、以下のようなものです。

平面が格子状に構成され、各マスが白または黒で塗られる。ここで、1つのマスを「アリ」とする。アリは各ステップで上下左右のいずれかのマスに移動することができる。アリは以下の規則に従って移動する。
・黒いマスにアリがいた場合、90°右に方向転換し、そのマスの色を反転させ、1マス前進する。
・白いマスにアリがいた場合、90°左に方向転換し、そのマスの色を反転させ、1マス前進する。
この単純な規則で驚くほど複雑な動作をする。当初でたらめな動作をしているが、アリはいずれ例外なく10000歩ほどうろついた後に真っ直ぐな「道」を作る動作に入る。

ウィキペディア「ラングトンのアリ」から引用

実際に動かしてもらうと解りますが、当初でたらめな動きをしていた”アリ”が、ある時から、規則的な動きをしながら、直線をつくる動作に入るのは、とても興味深いものがあります。



ソースコードを見てもらえば分かりますが、一匹のアリを表す Ant クラスは規則をそのままコードにしただけのとても単純なものです。
このプログラムの肝の部分は、どちらかというと、複数のアリを扱えるようになってる AntWorldクラスのほうでしょう。
アリの数だけ、Threadを起動し、そのなかで、Thread間で共有しているWriteableBitmapにアリの動きを点で描いていいます。
SilverlightのWriteableBitmapの Pixels プロパティは、Color型ではなく、int 型を受け取るので、Colorを intに変換したり、起動したスレッドでは、描画が行えないために、BeginInvokeを使って、UIスレッドで描画したりしている点が、面倒な点ですが、それほど複雑なことをしているわけではないので、コードの理解にはそれほど時間はかからないと思います。

重複しているコードがあったり、WriteableBitmap とは別の map配列を用意していたりと、まだ、ブラッシュアップする余地がありますので、興味のある方は、このあたりに手を加えていただき、よりスマートなコードにしていただければと思います。

以下に、C#+Silverlightのコードを示します。

■AntWorld.cs


■MainPage.xaml.cs

  
■MainPage.xaml