Chapter Seventy four

第74話


しばらく時間が開いていたが、圧縮伸長の問題は飽きてしまったので止めにしようと、面白そうな話題を探していた。

難解ながら引き込まれるように読んでしまった本は「自己組織化と進化の論理」で、複雑系科学の代表的な研究者が書いたものだ。生命の起源を捉えようとする試みについて書かれたもので、もちろん細部までは理解できないのだが、複雑系科学の目指しているものが良く伝わってきた。これにつられて、サンタフェ研究所の創設期のドキュメンタリー「複雑系」や、日本の研究者が物語調に解説した「複雑系は、いつも複雑」などを読んでみた。

----------------------

自己組織化と進化の論理―宇宙を貫く複雑系の法測  ISBN:4532147697 日本経済新聞社 (1999-09-13出版)
カウフマン,スチュアート(著)、米沢 富美子(監訳)

複雑系 ISBN:4-10-217721-3 新潮文庫
ワールドロップ,ミッチェル(著)、田中三彦+遠山峻征(訳)

複雑系は、いつも複雑 ISBN:4-7684-6723-7 現代書館
逢沢 明(著)

----------------------

複雑系科学は21世紀の新しい学問と期待する人たちがいる。従来までの科学は要素を理解すればその要素で構成される事象を理解することができるというスタンスで進んできた。実際には物事はそんなに単純ではないので、要素が入りくんで相互作用が大きい事象は工学に代表される実学の持ち分として、実用性の観点で使いこなすための対処方法が研究開発されてきた。実学では要素間の相互作用や非線形の現象はそれ自体に有用性が無ければ極力排除し、物事をシンプルに考えられるように努めてきた。複雑系科学では入り組んだ相互作用について検討を行いシステムそのものを理解しようとする科学のようだ。経済システムや生体システムなど対象が広範囲であることも従来の科学とは大きく異なっている。

ところで、「系」という語は身近なだけに要注意で、念のために広辞苑で調べてみた。「系」は五つの意味が与えられていて、「1)つながること。ちすじ。血統。系統。系譜。2)系統だった分類。また、その部門。3)、4)はスキップして、5)[理・化](system)一定の相互作用または相互連関を持つ物体の集合体」。複雑系の系は5番目の意味合いなのだ。

複雑系はコンピュータシミュレーションが大きな推進力になっている分野なので、プログラムの作成やプログラムの意味合いなどが分かりやすく書かれた教科書があれば楽しみが増すのだが、多くの本が書かれているわりに専門書と啓蒙書の間を埋めるものがみあたらない。複雑系の研究自体が生まれたてでまだ評価が定まっていないためなのかもしれない。このため、今のところ資料から推測しながらプログラムを作り、動作を考えてみたいと思う。本を読んでいるだけよりは理解を深められるだろう。作るプログラムも実用的な意味合いは無いのだが、まあ、過程をできるかぎり楽しんでみよう。

毎回言い訳している事なのだが、特に今回は適切な教科書が手に入らないので内容に関しては正しいという保証はなにもないことを承知しておいて欲しい。

900個のランダムネットワークの動作例

初期変動を除いた200回の平均値のグラフで、赤(0.5)は毎回反転していることを示す。青い部分はTrueあるいはFalseのまま変化がないことを示す。

得意の閑話休題も含めて、どんな展開になっていくのか全く見通しが無いが、カウフマンが夢中になったランダムネットワークについて見てみよう。

カウフマンは細胞分化の過程で働く調節遺伝子の作用に興味を覚えて考え始めたと紹介されている。ON-OFFあるいはTrue-Falseの状態しか持たないブール演算素子をランダムにつなぎあわせたネットワークをノートに書きながら考え始めたという。3入力以上の素子でネットワークを作ると乱雑な動きを示すが、2入力ではある種の秩序が見えるという。

まずは、2入力のランダムネットワークを作ってみよう。

(右のグラフはできあがりの状態だが、これがある種の秩序なのかどうかは???)

たとえば、100個の素子同士をランダムに関係付けよう。自分自身への結合を許せば、0から99までの数値から任意に選んでいけば良いのだろう。つまり、100枚のカードをランダムに並べ替える仕事と同じだ。2入力の場合はこの操作を2回行うことにする。今回はとりあえずこの関数を作ってみよう。

「任意の」とくれば、Random Number (0-1)関数を使うのはすぐに思いつくことだが、このままでは重複した数字がでてきてしまうのが思案のしどころだ。

1)重複した場合はハジいてしまうというのが安直な方法だ。

Random Numberは0から1の間の実数で数値を出してくるので、(net size)倍して小数点以下を切り捨てることによって0から(net size-1)の整数を得ている。

シフトレジスタの配列にRandom Numberから出力された数値が含まれているかSearch 1D Arrayで調べて、含まれていなければ-1が出力されるのでケース構造のTrueが実行され、配列に要素が追加される。

N=10で試してみると5個目ぐらいから重複したものが出始めるので、やはり良いプログラムとは言えないだろう。

ケース構造の中で配列の要素を徐々に増やしているのは、速度低下の元だからこのタイプで行くならもう少し改良したほうが良いだろう。

参考までに改造してみると、右のダイアグラムのようになる。配列は-1で(net size)の要素数で初期化した。Trueになった回数をカウントし、そのカウント値の要素をRandom Numberから出力された数値に入れ換えるようにする。Falseのケースは何も実行しないでスルーの状態にする。

2)実際にカードを持っているときにはカードの山からランダムに1枚抜き出していくだろう。この方法をプログラムできれば重複はなくなるので効率がよい。Random Numberは0から(残り枚数-1)の範囲で発生させて、何枚目のカードを抜くかという指示に使えばよいだろう。

カードの山に見立てた配列から実際に要素を抜いていくのが直接的だが、配列の大きさが毎回変わるのは1)で書いたように速度低下の元になるので避けたい。

そこで、カードを抜く代わりに残っていた一番上のカードに書かれている数値に書き換えてしまうことを思いついた。乱数の範囲は残り枚数にしたがって徐々に少なくなっていくから、残っていた一番上のカード自体は次回以降抜かれる可能性はない。

今回は、ここまでにしておこう。2入力のランダムネットワークはいちおうできているのだが、面白いかどうかはまだ良く分からない。

 

See you!

Nigel Yamaguchi


戻る