複雑系/人工知能ゲーム


PC/Linux(Red Hat系)/Programming/雑多メモ

複雑系に興味を持った

最近、遅れ馳せながら『複雑系』というものに興味を持ち始めています。
細かくは、『複雑系』、『複雑適応系』などと分かれるようですが、私は素人なので漠然と『複雑系』として思い付いたことを書いて、実験していきたいと思います。
分子、細胞、生命体、社会、経済などはすべて『複雑系』システムであるといわれています。
これは、いったいどういうことか、私なりに以下にまとめます。


カオス創発実験-森林火災シミュレーション

局所ルールと相互作用の創発実験として、有名な森林火災のシミュレーションを書いてみました。
ルールは、以下の通りです。

以下のリンクに実験javaアプレットがありますのでどのような現象が起こるか確認してください。
森林火災シミュレーション

あまりにも遅いので、シングル版を作りました。

森林火災シミュレーション2

単純な局所ルールと相互作用によりカオス的な複雑な現象が創発するのが確認できたでしょうか?
また、木の生成確率により、ランダム(カオス的)な現象(確率0.05)、収束する現象(確率1, 0.013)が確認できたでしょうか?
また、確率0.013の時は、クリックを何回かすることにより、偶発的にカオス的な現象に移行することが確認できたでしょうか?
残念ながら、第1回で書いたようなカオスの縁と呼ばれるような現象がどのあたりの確率で出てくるのか、またどのように見えるのか、私にはわかりませんでした。

非常に汚いですが、ソースを載せます。 森林火災シミュレーションsource


複雑適応系に興味を持った

『複雑系』と『複雑適応系』とは明確に分かれる分野だということが、ようやく理解できてきた今日このごろです。
以下に私の理解を書きます。

個人的には、最近になって『複雑系』全般への興味から『複雑適応系』への興味に移行しつつあります。
大きな理由としては、『複雑系』より『複雑適応系』のほうが個人としての成果物(例えば『人工知能』を用いたゲームなど)が挙げやすいというところです。
やはり『マンデルブロー集合』の描画より『人工知能オセロ』のほうが趣味でやっていく分には面白そうだというところでしょうか。
その他の興味として『エージェント・シミュレーション』(Boid, SimCityなど)がありますが、これがどちらのカテゴリに属するかは、いまだ不明です。

さて、『複雑適応系』に話しを絞って考えた場合、系の特徴としてどのようなものを備えてなければならないでしょうか。

現在研究されているいろいろな『複雑適応系』によりそのアルゴリズムは異なりますが、『解の探索』、『汎化』、『適応度学習』といったことが行われていると考えられます。
この他にもいろいろな系(クラシファイア・システム、強化学習システムなど)がありますが、『人間の脳』には、まだ遠いようです。

複雑適応系に興味を持った2

前回では、代表的な『複雑適応系』のアルゴリズムとして遺伝的アルゴリズムとニューラル・ネットワークを挙げましたが、最近『強化学習』という本を購入したので、そちらの紹介もしようと思います。


強化学習/ニューラルネットワークを利用したゲーム制作: ハムレット

理論ばかり読んでいてもつまらないので、実際ゲームを作ってみようと思います。
今回作成するのは『ハムレット』というゲームです(この名前は、ツクダオリジナルの登録商標のようなので、他では『立体4目並べ』、『Win4』などと呼ばれています)
このゲームの選定理由は、『3目並べ』よりゲームに幅があり、『オセロ(これも登録商標。。。Reversi)』よりゲームに幅がないというだけの理由です。
まずは、強化学習を利用するということで、強化学習の基本原理から。

次回は、それぞれのクラスの設計に移る予定です。


強化学習/ニューラルネットワークを利用したゲーム制作: ハムレット2

今回は、前回出てきたクラスを肉付けしていきます。
設計の方針として、以下のことを考慮するようにします。

また、クラスの命名規則は、以下のようにしています。 それでは、それぞれのクラスのインタフェースを考えていきましょう。 次回は、強化学習の肝であるValueFunction(価値関数)に関してです。

強化学習/ニューラルネットワークを利用したゲーム制作: ハムレット3

今回は、ValueFunctionに関してです。
まずは、強化学習におけるValueFunctionの流れを見てみます。

IfAgent

Case: 後攻の場合
(最初の状態)
       [ ][ ][ ][ ][ ][ ][ ]
       [ ][ ][ ][ ][ ][ ][ ]
       [ ][ ][ ][ ][ ][ ][ ]
       [ ][ ][ ][ ][ ][ ][ ]
       [ ][ ][ ][ ][ ][ ][ ]
       [ ][ ][ ][ ][ ][ ][ ]
       
                 |
                 |
              相手の手
                 |
                 +-----------------------+-----------------------+--------------------
(自分の手の選択) |                       |                       |
       [ ][ ][ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ] 
       [ ][ ][ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ] 
       [ ][ ][ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ] 
       [ ][ ][ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ] ......
       [ ][ ][ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ] 
       [2][ ][ ][1][ ][ ][ ]   [ ][2][ ][1][ ][ ][ ]   [ ][ ][2][1][ ][ ][ ] 
                               | (選択された手)
                                         |
                                      相手の手
                                         | 
                                         |
                                         | 
                 +-----------------------+-----------------------+--------------------
(自分の手の選択) |                       |                       |
       [ ][ ][ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ] 
       [ ][ ][ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ] 
       [ ][ ][ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ] 
       [ ][ ][ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ] ......
       [ ][ ][ ][1][ ][ ][ ]   [ ][2][ ][1][ ][ ][ ]   [ ][ ][ ][ ][ ][ ][ ] 
       [2][2][ ][1][ ][ ][ ]   [ ][2][ ][1][ ][ ][ ]   [ ][2][2][1][ ][ ][ ] 
                                                       | (選択された手)
                                                                 |
                                                              相手の手
                                                                 |
                                                                 :


上記図において、ValueFunctionは、2つの働きをしています。

なお、この方式は、TD(0)と呼ばれるもので、これ以外にも"Action(行動)とState(状態)の組"で学習するものや
"価値を評価する関数と行動を選択する関数を別にもつもの"などがあります。
今回は、"Stateに対してあるActionを取った場合、次のStateが特定できる"ため、Stateのみの関数で実装します。(TD方式)