第1回 周辺知識 [#u60f20f8]
最初の講習は「お話」です。IBMとそれに必要なプログラミングに馴染みのない方向けに、これらについての周辺知識をまとめました。今後の講習会の内容、IBMやプログラミングについてイメージをつかむことが出来れば幸いです。
個体ベースモデルとは [#y68ae317]
数理生態学初心者の私たちが(一応知識だけですが)知っているモデルの多く、指数成長モデルとかロトカボルテラモデルなどは、個体群のふるまいを記述するモデルです。~
~
一方で、ここで紹介する個体ベースモデル(Individual Based Model:IBM)は文字通り個体をベースに考えたモデルです。個体をベースに、と言ってもわかりにくいかもしれませんが、要するにコンピュータのメモリの中に仮想的な生物個体を作り上げてしまうモデル化の手法です。モデルにもよりますが、各個体がさまざまな形質の表現形だけではなく、それとは別に遺伝形も持っていたり、特有の繁殖戦略や移動様式を持っていたりします。そして、メモリの中でそれらが生まれ、仮想個体同士、あるいは無生物的な環境と相互作用し、繁殖したり、移動したり、そして死んだりを繰り返していく過程を観察しようというのが IBMによる解析です。~
~
一方で、ここで紹介する個体ベースモデル(Individual Based Model:IBM)は文字通り個体をベースに考えたモデルです。個体をベースに、と言ってもわかりにくいかもしれませんが、要するにコンピュータのメモリの中に仮想的な生物個体を作り上げてしまうモデル化の手法です。モデルにもよりますが、各個体がさまざまな形質の表現形だけではなく、それとは別に遺伝形も持っていたり、特有の繁殖戦略や移動様式を持っていたりします。そして、メモリの中でそれらが生まれ、仮想個体同士、あるいは無生物的な環境と相互作用し、繁殖したり、移動したり、そして死んだりを繰り返していく過程を観察しようというのが IBMによる解析です。~
IBMが得意なこと [#zec9f4e3]
- 何でもモデル化
- 普段使っている言葉で書くようにモデル化
- 空間的な動態をモデル化
- 確率的、ゲーム的な現象もモデル化
IBMではメモリ上に仮想的な生物個体を作り出すので、その個体には何だってやらせることが出来ます。個体の振る舞いについて言葉で説明できることは何でもモデル化できると言ってもいいです。また、その説明のまま言葉を書くようにモデルを構築できます(*1)。そのために微分方程式を書いたり解いたりする必要はありませんし、数学的な素養はほとんど必要有りません。これらの性質によってIBMは素人がモデルを作ることを可能にしました。これはIBMの、語られることの少ない、しかし極めて大きな利点の一つだと思います。~
また、IBMで記述すれば空間的な動態も拡散方程式などを使うことなく簡単にモデル化できます。また、確率的でランダムな効果の影響を見ることも得意です(ただ、力任せにたくさん計算してしまうだけですが)。生物界の現象の中には、配偶や捕食回避など相手の出方によってこちらの利益が変わってくるゲーム的な要素を持ったものがありますが、自分も相手も初めから個体として扱っているのでそういうゲームの扱いも得意です。
IBMが苦手なこと [#m05c0e4d]
- 結果や性質をすっきり(解析的に)予想する
- モデルそのものを1~数行で記述する
- 個体群レベルでの動態を直接的・トップダウン的に扱うこと
IBMにも苦手なことがあります。数式で記述しないことは利点でもありますが、そのため「解く」という解法は不可能なのが普通です。また、同様にモデルそのものも言葉で丁寧に説明する必要があります。式を出してその説明をして終わり、というわけにはいきません。(*2)~
個体群動態モデルは個体群を直接扱扱うので、「個体群の成長曲線はこんな関数で記述しよう」というような(個体から見て)トップダウン的なやり方が通用します。一方で、IBMではもっぱら個体の振る舞いだけを扱うので、個体群全体の振る舞いをあらかじめ予測してモデル化するのは難しいこともしばしばです。たとえば、ロジスティック式と寸分違わぬ個体群成長をIBMで記述することは困難です(ちょっとくらい違っても実用的には困らなかったりしますが)。~
IBMに必要なもの [#mecc5dec]
- IBMに適したプログラミング言語とそれを使う技術
- 速いパソコンとそれなりの根気
- 結果をわかりやすく示すためのセンス
解析的なモデルであれば紙と鉛筆で解くことも可能かもしれませんが、IBMはコンピュータがないと絶対に無理です。また、自分が解析したいモデルをコンピュータプログラムとしてコンピュータで実行可能な形に作り上げなければいけません。そのために必要なものがプログラミング言語です。プログラマー(僕やあなたのことです)はこの言語を使い、生物学的な論理をコンピュータに分かるように翻訳していきます。CとかBASICとかプログラミング言語を数え上げたらきりがありませんが、IBMに適した言語というのが実はあります。これについては後述します。(これを書いている時点では、まだどの言語を使うか悩んでいます。これついてはlanguagesに書いていますので、興味のある方はどうぞ。)~
また、既に書きましたがIBMは力任せのモデルです。ひたすら計算を繰り返し、一連のパラメータについての計算が終わるまでに数日かかるなんてことはザラです。なので、パソコンは速ければ速いほどありがたいです。ただし、そこそこ速いパソコンを複数台用意する方が総合的なパフォーマンスは向上したりします(僕はそうしてます。部屋にはモデル解析専用のPCがほとんど常時稼働しています。)。また、前回の計算が終わったら次の計算を始め…とコツコツ作業を進める根気もあると効率的です(が、僕は持ち合わせていません)。このあたりの計算のスタイルは必要な計算量や自分の性格などと相談しながら決めて下さい。~
僕がモデルを始めるようになって、モデル屋さんの仕事のスタイルに興味を持ち、何人かのモデル屋さんに「仕事には何が大事ですか?」と質問しました。今までのところ全員が同様に「速いパソコンより、プレゼンのセンス」と答えました。その中にIBMをやっている方はいなかったせいかもしれませんが、確かに結果を示すためのセンスは要求されます。実際の生物と異なり、モデルでは全てのパラメータを自在にいじることが出来ます。その分、複数のパラメータが同時に変化する場合の挙動など、普通は分かりそうにないことを分かりやすく示すことが必要です。さらに、「モデルなんて好き勝手に作れるんだし、所詮パソコン遊び」と見られないためには、説得力のある理屈の説明方法や結果の提示方法が極めて重要かもしれません。実際に自分のモデルを作るまえから、他のモデル研究のプレゼン方法を研究しておくのはかなり有用だと思います(*3)。~
どの言語を使うか? [#lb421549]
前節で「IBMに適したプログラミング言語が存在する」と書きました。結論から言ってしまうと、それがオブジェクト指向プログラミング(ObjectOrientedPrograming:OOP)が可能な言語です。オブジェクト指向と書いてもよく分からないと思います。これについてはたくさんの本が出版されていますし、web上にも様々な説明が氾濫していますので、参考にしてください。ただし、賭けてもいいですが、それらの説明を読んでもよく分からないと思います。それだけ概念的です。使っているうちに分かってきますので、今はそれらの説明を読むだけ読んでおきましょう。例えばhttp://www.google.com/search?hl=ja&lr=lang_ja&q=OOPとか~
OOP言語にはいくつもの種類があります。例えば、Microsoftが開発しているC#やOS Xで採用されているObjective-Cなどがあります。また、日本発のOOP言語Rubyも最近では利用者が増えています。僕がメインに使っているObjectPascal(=Delphi/Kylix)もOOP言語の一つです。何を使ってもいいのですが、これから新たに習得しようとする場合は理解のしやすさに加えて、
- フリーであること(いつまでもあると思うな、親と金)
- 複数のOSで利用できること(いつまでもあると思うな、そのOS)
- 実行速度がそこそこ速いこと(いつまでもあると思うな、今のヒマ)
などを目安に選ぶといいのではないかと思います。今回の講習ではこれらのほぼ満たしていると思われるObjectPascalかJavaを使ってみようと思います。どちらも開発環境はフリーですし、Windows, Linux(JavaではMac OSXも)の環境で使え、速度面で定評のあるC++に比べてもそれほど遅くないようです。また、C系列の言語に比較して習得が楽だといわれています。~
~どちらの言語がいいか特に希望があるでしょうか?なければObjectPascalを使おうと思います。
プログラミングの流れ [#kfb15e93]
これまでにプログラミングを経験したことがないという方はプログラムを書くということについて全くイメージがわかないと思います。やっていればそのうち身に付くものですが、簡単に紹介すると
- プログラマがソースコード(あるいは単に「ソース」)を書きます。=コーディング
- ソースをコンピュータで実行可能なプログラムファイルに作り替えます。=コンパイル
- 見つかった不具合を修正します。=デバッグ
プログラマの仕事は主に1.です(*4)。どのような言語でもソースは大概テキストファイルで書かれますので、メモ帳やSimpleText、あるいは血迷ってWordなどでソースを書くことも不可能ではありません。しかし、ソースコードの入力を支援してくれたり、2.や3.の作業への移行も簡単な統合開発環境(IntegratedDevelopmentEnvironment:IDE)内でコーディングすることが多いです。~
2.の作業に使うソフトはコンパイラと呼びます。JavaだとかC++だとかという言語の種類は、このコンパイラとコンパイラが理解できる言語の仕様などひっくるめたものだと考えてください。~
3.の作業はやっかいです。下手をするとプログラミングの時間のほとんどはこれかもしれません。出来るだけそうならないように努力したいものです。~
~
研究者にとってのプログラミング学習については国環研の竹中さんのHP内「自分の研究に使うプログラムを自分で書こう」が大変参考になります。プログラミングを研究に役立てたい、そのためにプログラミングを学びたいという人にとっては必見とも言えるページだと思います。~
http://takenaka-akio.cool.ne.jp/doc/piy/index.html
2.の作業に使うソフトはコンパイラと呼びます。JavaだとかC++だとかという言語の種類は、このコンパイラとコンパイラが理解できる言語の仕様などひっくるめたものだと考えてください。~
3.の作業はやっかいです。下手をするとプログラミングの時間のほとんどはこれかもしれません。出来るだけそうならないように努力したいものです。~
~
研究者にとってのプログラミング学習については国環研の竹中さんのHP内「自分の研究に使うプログラムを自分で書こう」が大変参考になります。プログラミングを研究に役立てたい、そのためにプログラミングを学びたいという人にとっては必見とも言えるページだと思います。~
http://takenaka-akio.cool.ne.jp/doc/piy/index.html
質問やご意見はこちらにどうぞ。