忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


植物 vs 動物 かんたんシミュレーション(ロトカ=ヴォルテラ方程式の解っぽい)

植物 vs 動物

植物と動物の簡単なシミュレーションを作ってみました。
緑が植物、赤が動物です。

シミュレーション画面をクリックすると一時停止、もう一度クリックすると再開します。


植物も動物も自分から動きまわることはせず、ぶつかり合うだけですが、それで十分です。
ぶつかったとき、捕食が起きます。
動物が植物からエネルギーを吸い取るのです。
動物と動物、植物と植物では何も起きません。
なお、エネルギーが空になった個体は消滅します。
ちなみに植物は何も起きなくともエネルギーを得ることができます。

さて、このシミュレーションを動かすと、動物と植物の数が増減を繰り返します。
これはロトカ=ヴォルテラの方程式の解にそっくりですね。
つまり、
植物が増えると、動物が増え、
動物が増えると、植物が減り、
植物が減ると動物が減り
動物が減ると植物が増える
をくりかえすのです。

パラメーターには次のようなものがあります:
  • Reproduction Cost : 繁殖すると失われるエネルギー(ただしそのあとさらにエネルギーの半分が子に奪われる)
  • Reproduction Threashold : 繁殖するのに必要なエネルギー。これだけエネルギーを持っていないと繁殖しない。別に繁殖するとこれが失われるわけではない。というのがReproduction Costとのちがい。
  • Plant Energy Supply : 植物に1フレーム間に与えられるエネルギー。
  • Animal Energy Consumption : 動物が1フレーム間に失うエネルギー。
  • Animal Energy Drain : 動物が植物と接触したときに吸い取るエネルギー。

おまけ
プロジェクトファイルです。

















拍手[0回]

PR

Silverlightでニューラルネットワーク(バックプロパゲーション)

今回はニューラルネットワークです。
バックプロパゲーションという、「ある出力を出すように学習する」ネットワークです。
ここではXORを学習させることにします。

XOR

0 0 -> 0
0 1 -> 1
1 0 -> 1
1 1 -> 0


なぜXORなのか?

もともとこれは普通のシンプルなニューラルネットワークである2層の単純パーセプトロンで、XORを学習できないことから考えだされました。
単純なXORさえできないからニューラルネットワークはもうダメだ!ということが昔言われていたのです。
これを言ったのはミンスキーという人で、このおかげで研究が下火になったといいます。
しかし、3層のバックプロパゲーションで、今までうまく出来なかったXOR計算ができるようになった!
そこでバックプロパゲーションの例題としてXORを学習することが多いのです。

かつてニューラルネットワーク研究を復活させたバックプロパゲーション。
それをSilverlightで再現してみました。



左は入力、右の数字は出力です。
はじめのうちは出力の数字は適当です。
しかし右の学習ボタンを押すと、次第に出力値が補正されていき、最後にはほとんどXORのようになります。
学習が終わるとストップします。

ただ、最初の結合の重み(ランダムに割り当てられる)によっては、上手く学習が進まないこともあります。
その時はリセットボタンを押して結合荷重をリセットしてください。


おまけ

プロジェクトファイルです。

拍手[0回]


Silverlightで遺伝的アルゴリズム

Silverlightで仮想のロボットを、光を追いかけるように進化させました。



赤い丸が光で、黒い丸(に矢印がついたもの)がロボットです。
光はマウスポインタで操作することができます。

ロボットははじめのうちは光を追いかけようとはしません。
しかし世代を経るにつれてだんだんと光を追いかけるようになっていきます(数分くらいかかります)。
右上のグラフはそのスコア(を上下に反転したもの)です。

時間が経つに連れてスコアが良くなっていくのがわかると思います。
また、ロボットがより効率良くマウスポインタを追いかけるようになるのもわかると思います。

ロボットの仕組みはこうなっています。
ロボットには8つの光センサーと2つのタイヤがついています。
8つのセンサーからの出力は重み付けられた和となってタイヤに与えられます。
シンプルな構成です。

この重みをこのSilverlightでは変化させていくのです。
結果ロボットは光を追いかけるようになっていきます。

おまけ

プロジェクトファイルです。

拍手[0回]


Silverlightで『模型は心を持ちうるか』ver2

模型は心を持ちうるか』という人工知能の本があります。
私はまだろくに読んでないのですが、一部だけ見た感じだと、こんな感じのようです:

こんなロボットがあったとします。
(リンク先から引用)

Vehicle2.JPG



このロボットは本体+2つのセンサーと2つの車輪からなっています。
上にある手のように見えるものは実は手ではなく光センサーです。
そこから信号を伝える電線が下の車輪に伸びています。

このとき、電線のつなぎ方は2通りあります。
平行に繋ぐ方法とクロスさせる方法。
aとbはその2通りのつなぎ方を表しています。

実は、このつなぎ方によって振る舞いに大きな違いが生まれるのです。
というか、単にセンサーと車輪をつなぐだけでも、面白い振る舞いが生まれます。

Vehicle2Behavior.JPG

このとおり、aのようなつなぎ方をすると光を恐れるようになり、bのようなつなぎ方をすると光を追いかけるようになります。
単純な仕掛けから高等に見えるふるまいが出てくる。
人工知能のエッセンスですね。

さてこれをSilverlightで再現してみました。



このSilverlightでは光ではなくマウスポインタを追いかけます。
チェックボックスにチェックを入れると内部の配線が切り替わり、今度は逆に光から逃げるようになります。


おまけ

プロジェクトファイルです。
このようなケースでMVVMを使うのは難しいですね。











拍手[1回]


Silverlightで細胞の分化をシミュレート(ブーリアンネットワーク)

細胞の状態のシミュレーター

Silverlightで ブーリアンネットワークというもののシミュレーターを作ってみました。
これは細胞の状態の単純化されたシミュレーションです。



このページを開くとすると模様が現れます。
(現れない場合は[新規作成]を押してください。最初の状態はランダムに決まるので、模様が生まれない場合があるのです)

その模様が一種類の細胞に相当します。
ある模様は皮膚の細胞かもしれませんし、別の模様は神経の細胞かもしれません。

模様は周期的です。
短い目で見ればある細胞の内部状態は変動しています。
しかし長い目で見れば変わりません。
たとえば皮膚を作る細胞がいきなり神経細胞に変わったりはしないのです。

青で縁どられている四角形をクリックしてみてください(一番上です)。
するとその場所の黒と白が反転します。
結果、次の2つのうちどちらかが起こります。

1.模様が一時的にかき乱されるが、次第に元の模様に戻っていく。
2.模様がかき乱され、以後全く別の模様になる。

1が何を意味しているかというと、細胞の自己復元機能のようなものです。
2は、細胞の分化(ES細胞が皮膚や神経の細胞に変わるようなこと)を意味しています。

場合によっては2は起こりにくいかもしれません。
その時は[新規作成]で別のネットワークにするか、複数の四角形を同時にクリックしてみてください(ポーズボタンは右下です)

ブーリアンネットワークとは

人間の細胞にはいろいろな種類があります。
皮膚の細胞、内臓の細胞、骨の細胞、さまざまです。
それらは内部の状態が違っています。

内部の状態が違うのは違うタンパク質が作られているから。
そしてタンパク質を作り出すのは遺伝子です。
遺伝子が、細胞をいろいろな種類にわけているのです。

普通私たちプログラマは状態の遷移をStateパターンなんかを使って実装しますが、細胞は違います。
無数の遺伝子がお互いをスイッチONしたりスイッチOFFしたりして状態が決まります。

遺伝子はタンパク質を作り出すだけが能ではありません。
他の遺伝子が「オン」になるかどうかを調節したりもするのです。
オンになった遺伝子は効力を発揮し、タンパク質を作ったり、あるいは別の遺伝子のオンオフを替えたりします。
遺伝子の集まり=ゲノムは状態を制御するネットワークなのです。

複雑系の研究者スチュアート・カウフマンがその著書の中で次のようにモデル化したのを紹介しています:
(彼の言ったままではありませんがだいたいそういうことです)

「ひとつの遺伝子をboolとする。そしてその状態は、以前の自分や他の遺伝子の状態によって決まる」

遺伝子の調節ネットワークを、相互作用するboolのネットワークとしてみたのです。
具体的には遺伝子a、遺伝子b, 遺伝子cがあったとすると:

a = and(b, c)
b = xor(c, a)
c = or(a, b)

というような具合です。(右辺は直前の状態)
ここではandやxorやorなどと言っていますが、実際には16種類のブール関数何でもかまいません。
2つのboolから一つのboolを導き出すやり方は全部で16種類ありますからね。

(厳密には16である必要すらありません。
2つより多い数の遺伝子の情報をとって次の状態を計算してはなぜいけないのでしょうか?
残念ながら、3つ以上の遺伝子の情報を取るとまずいことになる理由があります。
どうも数を増やすと振る舞いがカオスになりやすいのです。
秩序がなくなってしまうのです。
(逆に数を2より減らすと動きが凍り付いてしまいます。おもしろくありません)
そういうわけで、2つの遺伝子にのみ依存するようにここではプログラムしました)

遺伝子一つ一つをboolに見立て、次々と状態をアップデートしていくのがブーリアンネットワークです。
これは上で述べたように、細胞の恒常性(ちょっとばかり状態が変わっても、元の状態に戻ろうとする力)、分化(細胞が別のタイプに変わること)のような現象が現れます。

なお、このネットワークは幾つかの安定した状態を取りますが、それはだいたい√遺伝子数 です。
このシミュレーターでは最初10個の遺伝子ですが、つまり大体3つの状態を取るはずだ、ということです。

ちなみに人間の遺伝子の数は約2万2000個。
平方根をとると148です。
実際の人間の細胞の種類はたしか2百数十種類です。
完全に一致とは言えませんが、オーダーはだいたい合っているようですね。
ちょっと多めになっているのは自然淘汰の力でしょう。
本来作れる状態よりちょっと多めに状態を作り出せるよう、遺伝子が調節されているものと思われます。
たとえば動物なんかだとひとつの遺伝子が複数の形態を取ることがあるようです。


おまけ

プロジェクトファイルです。

























































拍手[0回]