Comments
Description
Transcript
社会シミュレーション
ISSN 1343-3997 No.11-02 Excel による社会シミュレーションⅠ ─セル・オートマトン─ 和歌山大学経済学部 牧野真也 2011 年 6 月 30 日 2012 年 4 月 7 日,2013 年 5 月 21 日修正 目 次 1. はじめに 2. 1次元セル・オートマトン 3. 2次元セル・オートマトン 4. おわりに 参考文献 練習問題 Faculty of Economics, Wakayama University (表紙裏) 1 Excel による社会シミュレーションⅠ セル・オートマトン 2010 年 6 月 30 日 牧野真也 2012 年 4 月 7 日 修正 2013 年 5 月 21 日 修正 1. はじめに (1) シミュレーションとは この稿では,社会シミュレーションについてその一端をみていきます。シミ ュレーションとは,複雑な現実の一部(ある側面)を何らかの形式で表わして (モデル化して)それを操作することによって,その振る舞いや働きをみるこ とです。私たちはシミュレーションによって現実をより深く理解したり,実際 の操作を間違いなく行なったりすることを目指します。社会シミュレーション とは,社会現象を対象にしたシミュレーションのことです。 こうしたシミュレーションにはさまざまなバリエーションがありますが,お おざっぱに言って(やや私見ながら),以下の2つのタイプがあるといえるでし ょう。 1つは,シミュレーションの対象となっているシステム1(対象システム)の 全体の構造がわかっているときにその振る舞いを予測するものです。経済予測 や環境汚染など多くのシミュレーションはこのタイプに属します。 そこでは,たとえば消費や投資などの経済変数間の関係が数式で示されてい たり,汚染物質の量・濃度や排出時の気象条件(風速・風向)などの変数間の 関係がすでに与えられていたりします。つまり,問題となっている対象システ ムの構造(変数間の関係)が予めわかっていて,その構造にしたがってシステ ムがどのように振る舞うかを計算し予測します。このタイプのシミュレーショ ンは古くから行なわれてきたものであり,Excel でも比較的容易に行なえる場合 が多いでしょう。 もう1つのタイプは,システム全体の構造がよくわかっていないときに,シ ステムの構造(この場合全てがわかることはないので部分的な構造)を仮定し た上でシミュレーションし,そのシステムの振る舞いを見たり,その仮定の妥 当性などを検証したりするものです。 これは,最近注目されている「複雑系」などでよく見られます。たとえば, 1 システムとは多種多様な要素が関係し合って何らかの全体をつくり出しているものです。 どのような事物・事項でも必ずこのような特徴を持っているといえるので,あらゆる対象 はシステムとみなすことができます。 2 和歌山大学経済学部,Working Paper Series,No.11-2(2011 年 6 月) 人工市場のシミュレーションは,売り手や買い手に関する部分的な(個別の) 相互作用を仮定してシミュレーションします。そしてその集積としての市場全 体の振る舞いが検討されます。今日では多くの分野でこのタイプのシミュレー ションの重要性が高まりつつあると考えられます。たとえば,ゲーム理論によ るシミュレーションなどもこのタイプに含めてもいいかもしれません。 この稿ではセル・オートマトンと呼ばれているモデルを扱います。セル・オ ートマトンは,ここでいう後者のタイプのシミュレーションの1つといえるで しょう。 (2) セル・オートマトンとは セル・オートマトン(cellular automaton)とは,規則的に並んだ多数のセル の集合であり,それぞれのセル同士が部分的に相互に影響し合う(相互作用す る)モデルです。シミュレーションの結果,全体に示される何らかのパターン や傾向が検討されます。社会シミュレーションに用いられる場合は,それぞれ のセルが個人や集団・企業などの社会的主体を表わします。たとえば,人々が ほぼ均一に存在していて影響を及ぼしあっているような状況は,セル・オート マトンでモデル化できるでしょう。セル・オートマトンよって,うわさの伝搬 や流行の広がりなどさまざまな現象をモデル化できます。 セル・オートマトンは以下のような特徴をもっています2。 (a) すでに述べましたが,多数のセルが規則的に並んだものです。それぞれ のセルは通常同じもの(同質)と考えます。各セルは 1 列に並んでいても, 平面上に並んでいても,空間に立体的に並んでいてもかまいません。それら はそれぞれ,1 次元,2 次元,3 次元セル・オートマトンなどと呼ばれます。 (b) それぞれのセルはいくつかの内部状態をもつことができ,必ずそのうち の 1 つを示します。たとえば,「生きている」か「死んでいる」かのいずれ か状態をとるといったようにです。 (c) 時間の概念が導入されていて,時間の経過に伴ってセル・オートマトン は変化していきます。時間は,ある時刻から次の時刻へと,すべてのセルが 同期して(一斉に)状態を変化させていきます。それぞれの時刻におけるセ ル・オートマトンはしばしば世代(generation)と呼ばれます。 (d) 次の世代のセルの状態は,自分自身のセルの状態と,近傍(neighborhood) と呼ばれる自分の近くにあるセルの状態によってのみ決まります。つまり, セルが変化するルールは局所的(local)に記述されます。また,ルールは基 本的に,すべてのセルに同じように(浸透的に)適用されます。 2 Gilbert et al. (1999) 邦訳第 7 章を基本的に参考にしています。 和歌山大学経済学部 牧野真也 Excel による社会シミュレーションⅠ─セル・オートマトン─ 3 図 1 に, 2 次元セル・オートマトンの例をあげます。小さな正方形のそれぞ れがセルであり,それらは黒色と白色で示される2つの状態をとっています。 セルの状態は時間の経過につれて局所的なルールに基づいて変化していきます。 図1 2次元セル・オートマトン 代表的な 2 次元セル・オートマトンに「ライフゲーム」があります(本稿で も扱います)。インターネット上にはライフゲームのシミュレータが多く公開さ れています。試してみましょう。 和歌山大学経済学部 牧野真也 4 和歌山大学経済学部,Working Paper Series,No.11-2(2011 年 6 月) 2. 1次元セル・オートマトン (1) 簡単な 1 次元セル・オートマトン まず,最も簡単なセル・オートマトンである1次元セル・オートマトンにつ いてみていきましょう。セルは一列に直線状に配置されています(図2)。 図2 1次元セル・オートマトン ここでは,セルは■と□の2つの状態をとるとし,それぞれを「生き」 「死に」 と呼ぶことにします。すでにみたように,これらのセルの状態は時間の経過と ともに変化し(世代が進行し),ある世代のセルの状態によってその次世代の状 態が決まります。あるセルの次世代の「生き死に」は,そのセル自身とのその セルの近傍の「生き死に」によって決定されます。ここでは近傍を左右両隣の 2つのセルとし,そのセル自身と近傍のセルの3つのセルで次世代の「生き死 に」が決定されることとします。そして,その世代交代は一斉に起きます。 では,現世代のセルの状態から次世代のセルの「生き死に」を決める簡単な ルールを1つ考えてみましょう。それは「あるセルの現在のセルの左右いずれ か1つのみが生きている場合のみ,そのセルは次世代に生きになる(そうでな いセルは死に)」というものです。以下に,あるセルが次の世代に生きる4つの パターンを示します。真ん中が対象となるセルです。このルールでは対象セル 自身(真ん中のセル)は次世代の「生き死に」に関係しませんが,便宜上示し ています。 a.□■■ b.■■□ c.□□■ d.■□□ なお,このセル・オートマトンの長さは有限ですから,両端の隣の存在しな いセルのことを考える必要がありますが,今のところとりあえず,存在しない セルは死んでいるものとします。 以上のルールにしたがうと,たとえば,前に示したセル(図3の 1)の場合, 次世代は以下のようになります(図3の 2)。確認してみてください。 1 2 図3 和歌山大学経済学部 牧野真也 2世代目のセル・オートマトン Excel による社会シミュレーションⅠ─セル・オートマトン─ 5 たとえば,1 の一番左のセルは,その左は存在しないので「死に」,右は「死 に」なので両方「死に」で 2 の世代では「死に」となります。2つめは,左は 「生き」右は「死に」なので「左右いずれか1つのみが生きている」ことにな り(前に示したパターンの d に該当し),次の世代は「生き」となります。 この1次元セル・オートマトンを Excel で以下のようにつくってみましょう。 セル・オートマトンのそれぞれのセルを Excel のセルで示します。セルの値 は 1 または 0 とし,1 を「生き」,0 を「死に」とします。各世代のセル・オー トマトンは Excel の1行に(横一列に)配置します。第1世代のセルの最初の 値(初期値)は適当に与えます。 次の第2世代のセル・オートマトンを1行下につくります。その際に,上記 のルールを Excel の式で記述します。このルールは基本的には1つ前の世代(1 つ上の行)を参照する IF 関数として簡単に記述できます。Excel が空セルを数 値 0 として処理すること(このことは SUM 関数などでほとんどの人が経験して いると思います)を利用して,端の隣の存在しないセルを空にしておけば,死 んでいるセルとして処理されます。 さらに,第2世代のセル・オートマトンを下方向にコピーします。式を相対 参照で記述すれば,これで世代の進行を示すことができます。つまり 10 行下方 向にコピーすれば 10 世代進みます。 以下のワークシートにおいて,A 列は世代とします。1行目(第1世代)C1, D1,E1,…には 0,1 を適当に入れるとして(乱数で入れてもかまいません),セ ル C2 にはどのような式を入れればよいか考えてみてください。 A B C D E F G H I J 0 0 0 1 1 1 0 1 1 1 2 2 =IF( 3 セル C2 に適切に式を書いて右方向へコピーすれば,同世代の各セルの状態を 表示します。さらに下方向にコピーすれば,次の世代の各セルの状態も示しま す。その結果,以下のようになることを確認してください。A 列の世代につい ては予めつくっておいても式で書いてコピーしてもどちらでもかまいません。 もちろん,つくらなくてもかまいません。 和歌山大学経済学部 牧野真也 6 和歌山大学経済学部,Working Paper Series,No.11-2(2011 年 6 月) A B C D E F G H I J 1 1 1 0 0 0 1 1 1 0 2 2 0 1 0 1 1 0 1 0 3 3 1 0 0 1 1 0 0 1 4 4 0 1 1 1 1 1 1 1 5 5 1 1 0 0 0 0 0 1 列の幅を行の高さと同じくらいにして,セル・オートマトンの部分のセルに 「条件付き書式」 (ホームタブにあります)を設定し,値が 1 の場合に黒で塗り つぶすなど何らかの強調をすると,変化がわかりやすくなります。 このルールの下で,セル・オートマトンを十分に長くとって,真ん中あたり の1つのセルのみが生きている初期値を与えると図4のような図形が出現しま す(実際にこの図は Excel で作成したものをコピーしています)。この図形は, 「シェルピンスキーのギャスケット」と呼ばれるもので,部分が全体の相似に なっているフラクタルと呼ばれる図形の1つです。Excel で十分に縮小表示する と,特に工夫しなくても数値や枠線が表示されなくなり,図4のように表示で きます。 図4 シェルピンスキーのギャスケット (2) リング状の1次元セル・オートマトン 両端の隣の存在しないセルを死んでいると見なすのではなく両端同士が隣り 合っているものと考えることもできます。図5のような,直線状のセル・オー トマトンの両端をつないでリング(輪)にしたものをイメージしてください。 和歌山大学経済学部 牧野真也 Excel による社会シミュレーションⅠ─セル・オートマトン─ 7 すなわち,左端のセルの左隣は右端のセル,右端のセルの右隣は左端のセルに なると考えます。こうすることによって端は特殊な位置ではなくなります。 このリング状のセル・オートマトンを 実現する方法には,大きく2つあると思 います。1つは両端のセルの式をもう一 方の端を参照するように変更する方法で す。もう1つは両端のセルのさらに外側 に,便宜的にもう一方の端のセルと同じ 値になるセルを加える方法です。つまり, ルールを変更するかデータを変更するか 図5 リング状のセル・オートマトン です。両方とも考えてみましょう。 (3) 1 次元セル・オートマトンの一般化 (1)では,特定のルールに基づいた1次元セル・オートマトンのプログラムを 作りました。ここでは,さまざまなルールに基づいた1次元セル・オートマト ンを作ってみましょう3。 かつて,ウルフラム(S. Wolfram)は,さまざまな1次元セル・オートマト ンのシミュレーションを行ない,それらの結果をもとに,1次元セル・オート マトンを以下の4つのクラスに分類しました。 クラス1:世代が進むにつれて全く変化しなくなる。 クラス2:世代が進むにつれて周期的な変化を繰り返すようになる。 クラス3:無秩序な変化を繰り返す。 クラス4:クラス1~3のどの状態にも該当しない複雑なパターンになる。 これらのうち,クラス4は(クラス3との区別は難しいのですが)きわめて 少ない場合に見られるものであり,生命現象など複雑な現象の原理を示してい るのではないかと考えられています。それは,しばしば「カオスの縁(the edge of chaos)」と呼ばれます4。 このような4つのクラス(類型)について確認す るために,1次元セル・オートマトンのルールを一般化していろいろ試せるよ うにしてみましょう。 まず,セルの近傍としての両隣と自分自身の3つのみを考えるとします(こ れ以外にもさらに両隣も含めて5つセルを対象とするなどいろいろ考えられて 3 以下の記述の一部は,ウィキペディア項目「セル・オートマトン」に基づいています。あ わせて読んでみましょう。 4 秩序と無秩序の間の狭い領域といったニュアンスです。 和歌山大学経済学部 牧野真也 8 和歌山大学経済学部,Working Paper Series,No.11-2(2011 年 6 月) います)。すると,あるセルとその近傍の状態は3つのセルの「生き死に」のパ ターンですから 23=8 通りの状態しかないことになります。したがって,次世 代のセルの「生き死に」のルールは,その 8 通りの状態それぞれに対応づけら れたものに一般化できます。たとえば(1)でとりあげたルールは以下の表1のよ うに示すことができます。ここでも「生き」を 1,「死に」を 0 で示すことにし ます。 表1 一次元セル・オートマトンのルール 現世代の状態 111 110 101 100 011 010 001 000 次世代の状態 0 1 0 1 1 0 1 0 この表1の「現世代の状態」では,そのセル自身と近傍の3つ(左・自身・ 右)の生き:1・死に:0 を 3 桁の 2 進数で示しています(たとえば「100」は 「左は生き・自分自身は死に・右は死に」)。そして表1では,「現世代の状態」 を 2 進数の降順(大きい順:111,110,…,000)に固定して並べ,それぞれに 対応する次世代の状態を示しています。すると次世代の状態を決めるルール(の 情報)は,それがどんなルールであっても 8 桁の 2 進数で示すことができます。 この場合は 010110102(2進数の場合添え字 2 をつけることとします)となり, 10 進数では 90 となります(確認してください)。したがって,この規則をその 10 進数表現を用いてルール 90 と呼ぶことにします(実際そう呼ばれています)。 また,ルールは 000000002~111111112 ですべてですから,10 進数でいうと 0 ~255 となり,全部で 256 通り(28 通り)あります。 このルールの情報(ルール番号)と現世代の状態から,次世代の「生き死に」 を判定する式を Excel で書くことはそんなに難しくはありません。大きく以下 の2つの方法があるでしょう。 まず,表1の現世代の状態からつくられる 3 桁の 2 進数は,ルール番号(整 数)を 2 進数と見たときの参照すべき桁数(便宜上,桁数を最小桁から 0 桁目, 1桁目,2 桁目…7 桁目とします)を表わしていますから,2 進数の k 桁目(k = 0, 1, 2, …,7)の値を調べることができれば,現世代の状態から次世代の生き死に を決定することができます。 ある整数 x を 2 進数とみたときの k 桁目の値は,Excel 風に記述すると以下の 式で示すことができます。 =TRUNC(MOD(x,2^(k+1))/2^k) 和歌山大学経済学部 牧野真也 Excel による社会シミュレーションⅠ─セル・オートマトン─ 9 式中,TRUNC(数値)は数値の整数部分を求める関数,MOD(数値,除数)は数値を 除数で除した剰余(余り)を求める関数です。ある整数 x を 2 k+1 で除した剰余 は明らかに 2 進数の下 k 桁分の整数であり,これを 2 k で除した整数部分はその 2 進数の先頭の桁の値ですから,これが整数 x の 2 進数の k 桁目であることは自 明でしょう。 あるいは,文字列を操作する関数を用いてもかまいません。ルールが 10 進数 で与えられるとすれば,それを 2 進数に変換し,現世代の左・自身・右から決 定される桁を調べれば,次世代の生き死にがわかります。 10 進数を 2 進数に変換するには関数 DEC2BIN(数値,桁数)を使います。2 進数 の特定の桁をみるには関数 MID(文字列,開始位置,文字数)を使えばよいと思い ます。文字列の開始位置から文字数分の文字列を返します。MID は文字列を対象 とした関数ですが,Excel では数値と文字列の区別は曖昧です。たとえば, =MID(DEC2BIN(90,8),7,1)は,10 進数 90 の 2 進数が 010110102 なので,開始位 置 7 から 1 文字分の文字列つまり 7 番目の数字 1 が(文字列として)返ります。 あとは,2進数の何桁目をとるか,現世代の左・自身・右から決定できればよ いこととなります。現世代の状態が 1112 すなわち(左,自身,右)=(生き, 生き,生き)の場合は一番左の桁,1102 ならその次の桁…という感じになりま すから,どの桁を参照すればよいかは容易に決定できると思います。 巻末の練習問題の問題1にしたがって,初期値を適当に与え,ルールを 10 進 数で与えると,そのルールに基づいた適当な世代までのセル・オートマトンを 表示できるワークシートをつくりましょう。そのワークシートを用いてさまざ まなルールに基づくセル・オートマトンを表示してみましょう。 (4) 創発 これらのルールのうち,たとえばルール 30 は,ルール 90 の図4と同様に真 ん中の 1 点から始めると図6のようになります(実際にやってみましょう)。ウ ィキペディア項目「セル・オートマトン」にもあるように,このパターンはイ モ貝の模様とそっくりです。「シェルピンスキーのギャスケット(図4)」や図 6のような複雑な模様がこのような単純なルールから作り出されることはある 種の驚きです。このように,思いがけない複雑なパターンが出現する現象は, しばしば創発(emergence)と呼ばれます。 和歌山大学経済学部 牧野真也 10 和歌山大学経済学部,Working Paper Series,No.11-2(2011 年 6 月) 図6 ルール 30 とイモ貝の模様 (写真出典:ウィキペディア http://ja.wikipedia.org/wiki/項目「セル・オートマトン」) 和歌山大学経済学部 牧野真也 Excel による社会シミュレーションⅠ─セル・オートマトン─ 11 3. 2次元セル・オートマトン (1) ライフゲーム 平面上に碁盤の目状に配置された2次元セル・オートマトンをつくってみま しょう。ここでは,1970 年にコンウェイ(J. H. Conway) によって考えられたライフゲームをつくっていきます。 ライフゲームにおける近傍は図7の 8 つのセルです。 この近傍はしばしばムーア近傍と呼ばれます。そして, 以下のルールによって次世代の「生き死に」が決定され 図7 ムーア近傍 ます。 1. 対象のセルが死んでいるとき,周囲に3個の生きているセルがある場合に 次世代に「生き」となり,それ以外は死んだままである。 2. 対象のセルが生きているとき,周囲に2個または3個の生きているセルが ある場合に次世代に生きつづけ,それ以外は死ぬ。 このゲームが「ライフゲーム」と名付けられた理由は,バクテリアなどの増 殖のパターンに基づいているからだといわれています5。つまり,周囲の仲間が 1 個以下の場合は孤立しているために死ぬ,4 個以上の場合は過密によって死ぬ, また,空の状態の周囲に 3 つの仲間がいる場合は誕生する,といった感じです。 また,このルールは非常に単純ですが,これによって驚くべき複雑なパター ンが出現します。このことを紹介している文献やサイトは非常に多くあります ので,それらも見てみましょう6。ここでは Excel でライフゲームをつくってみ ましょう。 2次元セル・オートマトンは図1(2 ページ)のように2次元に規則正しく配 置されたセルですから,Excel のワークシート(上の表)そのものといえます。 いろんなつくり方が考えられますが,ここでは 1 つのワークシート上の表で 1 世代を表わすことにします。1次元セル・オートマトンと同様に, 「生き」を 1, 「死に」を 0 で示すことにしましょう。 そして,次世代は,現世代と別のワークシート上につくります。そこに1次 元セル・オートマトンと同様に第1世代を参照してルールを記述しましょう。 当然ですが,Excel では別のワークシートのセルも参照できます(式を“ワーク シート名!”で修飾しますが,式入力中のマウスクリックで自動的にそうなりま 5 6 Poundstone (1985) 邦訳 15 ページ。 たとえば,Poundstone (1985) やウィキペディア項目「ライフゲーム」など。 和歌山大学経済学部 牧野真也 12 和歌山大学経済学部,Working Paper Series,No.11-2(2011 年 6 月) す)。 また,Excel の IF 関数の構文は,複雑な式を書くことには適してないので, 上記のライフゲームのルールを解釈してなるべく簡潔に記述しましょう。いろ んな記述方法が考えられますが,そのセルが死んでいる場合,そのセル自身と 近傍の 9 つの矩形の合計が 3 の場合「生き」でそれ以外は「死に」,生きている 場合,同様に矩形の合計が 3 または 4 の場合(そのセル自身が 1 になっている ので) 「生き」でそれ以外は「死に」と考えることもできるでしょう。必要なら ば,論理演算の「または」は関数 OR を,「かつ」は関数 AND を使います(もち ろんそれらを使わなくてもできます)。それを,第2世代のワークシート上で, 第 1 世代のワークシートのセルが存在する領域分コピーすれば第2世代のセ ル・オートマトンが作成されます(もちろん相対参照にする必要があります)。 なお,周囲の存在しないセルはとりあえず空セルにしておき死んでいるものと しておきましょう。 この作業を続けて,ワークシートを増やしていけば第3世代,第4世代…と 進んでいきますが,Excel は基本的に2次元の表を扱うソフトウェアであり,各 世代は別々のワークシートであり3次元的に扱うことはできません。したがっ て,このような操作を1次元セル・オートマトンの列方向へのコピーのように 簡潔に実現することはできません。そのため,何らかの工夫をする必要があり ます。その方法はいくつかあると思いますが,ここではできるかぎり簡便な方 法を考えたいと思います。 たとえば,第2世代のセル・オートマトンのデータ(値のみ)を第1世代の ワークシートにコピー&ペースト(貼り付け)して(つまり, 「形式を選択して 貼り付け」の「値」を貼り付ける)戻すという方法が考えられるでしょう。そ うすれば,第2世代のワークシートに記述したルールに基づいた計算が再び行 なわれ(Excel はデータが変わると自動的に再計算します),第2世代のワーク シートは第3世代へと進みます。これを繰り返せば,2つのワークシートの間 で世代はどんどん進んでいくことになります(図8)。 和歌山大学経済学部 牧野真也 Excel による社会シミュレーションⅠ─セル・オートマトン─ ワークシート1 ワークシート2 データ データを参照するルール 13 生成 ある世代 次の世代 値をコピー データ データを参照するルール 生成 次の世代 図8 次の次の世代 コピー&ペーストによる世代の進展 以下では,この処理を自動化してみます。Excel では,一連の決まり切った処 理を自動化するためにマクロや VBA を使います。以下,Excel VBA について簡 単にみていきます。 (2) Excel VBA 超入門 Excel VBA(Visual Basic for Applications)は Excel の処理を自動化するた めの BASIC 風のプログラミング言語です。これを使えば,Excel で実行可能な 一連の処理はどのような処理でも自動化できます。さらに Excel VBA は計算完 備な(計算機でできる手続きをすべて記述できる)プログラミング言語であり Windows のシステムコールなども使えますから,VBA を使えばパソコンででき ることはどんなことでもできます(実際,VBA によって働くウイルスがつくら れています) 。ライフゲーム程度の簡単なプログラムであれば,初歩的なプログ ラミングの知識さえあれば VBA のみで短時間でつくることができるでしょう。 しかし,ここでは,プログラミングの知識がないことを想定しているので,VBA の利用は最低限にするつもりです。 また,Excel にはマクロという利用者が行なった一連の Excel での操作を記録 し,同じ操作をいつでも実行できるようにする機能があります。そして,この マクロの実体は VBA で記述されたプログラムであり,マクロの実行はそのプロ 和歌山大学経済学部 牧野真也 14 和歌山大学経済学部,Working Paper Series,No.11-2(2011 年 6 月) グラムの実行に他なりません。以下,Excel のマクロと VBA について簡単にみ ていきましょう。 ・準備1─「開発」タブの表示 マクロの記録・操作や VBA によるプログラミングのために必要となる「開発」 タブの表示を行ないます。左上の「Office」ボタン をクリックし「Excel のオ プション」ボタンで「Excel のオプション」ダイアログボックスを表示します。 「基本設定」の「開発タブをリボンに表示する」のチェックボックスをオンに し,「OK」ボタンを押します。そうすると以下のような「開発」タブがリボン に現われます。 ・準備2─セキュリティの設定 Excel のマクロにはウイルスなど危険なものもたくさんあります。そのため, デフォルトではマクロは実行できないようになっています。ここでは自分が作 成したマクロの実行のみを行ないますから,マクロが実行できるようにセキュ リティを設定します。一般に,他から入手した不明なマクロを実行してはいけ ません。 「開発」タブの「マクロのセキュリティ」ボタンを押し「セキュリティセン ター」ダイアログボックスを表示します。 「マクロの設定」で「警告を表示して すべてのマクロを無効にする」のラジオボタン(オプションボタン)をオンに してみましょう。 和歌山大学経済学部 牧野真也 Excel による社会シミュレーションⅠ─セル・オートマトン─ 15 この設定を選択した場合,マクロを含むブックを開くと「セキュリティの警 告」が上部に示されます。 その場合は,そこのオプションボタンをクリックして,ダイアログボックス で「このコンテンツを有効にする」を選択する必要があります。これが,煩わ しい場合は,先ほどの「マクロの設定」で「すべてのマクロを有効にする」に してもいいですが,その場合は不明なマクロ付きのブックは絶対に開かないよ うにしましょう(ファイルを開いただけで実行されるマクロもあります)。また, 今回の作業を終えた後は,必ず「マクロの設定」を元に戻しておきましょう。 ・マクロの記録・実行 「開発」タブの「マクロの記録」ボタンでマクロを記録します。まず,ワー クシート間のコピー&ペーストをマクロとして記録してみましょう。 「マクロの 記録」ボタンを押して,あるワークシートで特定の領域を選択しコピーし,別 のワークシートの適当なところにペーストして, 「記録終了」のボタンを押して みましょう。これでそこまでに行なわれた操作がマクロとして記録されました。 このマクロを実行するには,「マクロ」ボタンを押して,「マクロ」ダイアロ グボックスから該当するマクロを選んで(この場合多分1つしかない)実行し ます。そうすると,先ほど記録したコピー&ペーストの一連の操作がいつでも 実行できます。 「マクロの記録」ダイアログボックスでショートカットのアルフ ァベットを指定しておけば,ctrl+k のようにショートカットで実行することも できます。 ・マクロと VBA では,記録したマクロの中身をみてみ ましょう。たとえば,先ほどの「マクロ」 ダイアログボックスで「編集」ボタンを 押すと VBE とよばれるエディタが起動 しマクロの中身が VBA(プログラム)で 表示されます。図9のようになっている と思います。 ここで,Sub Macro1()……End Sub で 囲まれた部分が Macro1 の中身です。なお, 図9 '(クォート)の後ろの緑色になっている マクロの VBA プログラム 和歌山大学経済学部 牧野真也 16 和歌山大学経済学部,Working Paper Series,No.11-2(2011 年 6 月) 部分はコメントと呼ばれ,プログラム上は書いてないものと見なされます(処 理系は'から行末までを無視します)。コメントには,通常プログラムの説明な どを書きます。 VBA では,基本的に1行に1つのステートメント(命令)を書きます。ステ ートメントは通常(特別な制御構造でなければ)上の行から順番に1つずつ(通 常1行ずつ)実行されます。 マ ク ロ 中 , Range("B2:E17").Select は 「 "B2:E17" の 範 囲 を 選 択 」, Selection.Copy は「選択部分をコピー」…,ActiveSheet.Paste は「アクティ ブシートにペースト」といった具合に,実際に行なった操作が記述されている 感じが出ていると思います。VBA ではこのようなステートメントで操作を表現 します。 ここでは,コピー&ペーストのために,2つのステートメントを使おうと思 います。1つは,あるワークシートのある範囲をコピーするもの,もう一つは あるワークシートのある場所にその値のみをペーストするといったものです。 以下は,"After"という名前のワークシートの範囲"B2:AE31"をコピーし, "Before"という名前のワークシートの"B2"を基点にして「値のみ」をペースト するというものです(「形式を選択して貼り付け」の「値」に相当します)。 Worksheets("After").Range("B2:AE31").Copy Worksheets("Before").Range("B2").PasteSpecial Paste:=xlPasteValues 上記のステートメント中,ドット(.)は,オブジェクトのプロパティやメソッ ドを示して(参照して)いますが,「ワークシート After の範囲("B2:AE31") をコピーする」, 「ワークシート Before の範囲("B2")で特別貼り付け(値)を する」のような理解で十分です。プロパティやメソッドという概念はオブジェ クト指向の考え方に基づいているもので,オブジェクトの属性や動作を表わし ます。プロパティは「オブジェクトの~」,メソッドは「オブジェクトを~する」 といった理解でとりあえずは十分でしょう。この資料ではオブジェクト指向の 説明はしません。なお,Worksheets オブジェクトは,先ほどのマクロの Sheets オブジェクトと違ってワークシートに限定した(シートには,ほかにもグラフ シートなどがあります)オブジェクトです(実用上はどちらを使ってもほとん ど違いはありません)。 では,Macro1 の中身を上記のプログラムに変更してみましょう。これにあわ せて,ライフゲームデータが入っている方の(第1世代の)ワークシート名を Before,ルールが入っている方のワークシートを After に変更しましょう。ま た「マクロ」ダイアログボックスで「オプション」ボタンを押し,適当なアル 和歌山大学経済学部 牧野真也 Excel による社会シミュレーションⅠ─セル・オートマトン─ 17 ファベットをショートカットに割り当てておきましょう。 ワークシート Before を選択して(アクティブにして),このマクロを割り当 てたショートカットによって繰り返せば,ライフゲームの世代は進んでいきま す。試してみてください。 (3) For~Next ループ 以上の方法では,1回のコピー&ペーストを手動で何回も繰り返すというこ とになり,多くの回数繰り返すことは面倒です。そこで VBA の For~Next ルー プを試してみましょう。一般的なプログラミング言語(手続き型)では, 「指定 された順番に実行する(順次実行)」, 「条件によって処理を変える(条件分岐)」, 「同じ処理を繰り返す(繰り返し)」の3つの制御が用いられます7。For~Next ループは VBA のいくつかの繰り返し制御文の中で最も簡単なものです。 プログラムを VBE で入力してみましょう。 「開発」タブの「Visual Basic」ボ タンを押して VBE を起動し,「挿入」メニューから「標準モジュール」を選び ましょう。プログラムを入力する領域(コードウィンドウと呼ばれるエディタ) が開きます。 図 10 VBE とコードウィンドウ 7 この3つの制御の組み合わせであらゆる手順(アルゴリズム)は記述できることになって います。 和歌山大学経済学部 牧野真也 18 和歌山大学経済学部,Working Paper Series,No.11-2(2011 年 6 月) ではコードウィンドウに以下の図 11 のプログラムを入力してみましょう。コ メント部分を入力する必要はありません。 図 11 繰り返しのプログラム プログラム中,1 行目の Sub <手続き名>()から,6 行目の End Sub の間にその 手続き名のプログラムを書きます。<手続き名>は利用者が自由に名付けてかま いません。漢字やひらがなカタカナでもかまいませんが,特殊文字(+,-,@,&な ど)は一般に利用できず,先頭文字にかぎり数字や_(アンダーバー)にするこ ともできません。あと,あらかじめ処理系によって使われている文字列(たと えば,Sub や For といった文字列で予約語と呼ばれます。エディタ中で文字が青 く示されます)も使えません。また,VBA ではステートメント中の大文字小文 字は区別されませんが,正しい記述の場合先頭が大文字に勝手に変わります。 なお,<手続き名>のあとの()の中には,この手続きが呼び出される際の仮引数 を書きます(したがって,この場合手続き Kurikaeshi には仮引数がないことを 示しています) 。手続きの仮引数はこの稿では扱いません。 2 行目の Dim <変数名> As <データ型>によって変数を定義します。変数とは, データ型で指定されたいろんなデータを入れることができる箱のようなもので す。数学の変数と同じように理解してもかまいません。<変数名>も<手続き名> と同様のルールで利用者が自由に名前をつけられます。<データ型>にはいろい ろありますが,当面は整数型(Integer)をよく使います。Integer は 0,25,-89 など数学の整数と同じと理解しておいて実用上問題はないでしょう。なお,同 じデータ型の変数を複数宣言する場合は,変数名を,(カンマ)で区切って複数書 くこともできます。 3 行目から 5 行目の For <変数> = <初期値> To <最終値> (Step <増分>)から Next (<変数>)の間に記述された処理(ここでは 4 行目)が繰り返されます。こ こで用いられる<変数>は制御変数やループ変数などと呼ばれ,この変数の値に よって繰り返しが制御されます。図 11 のプログラムでは変数 i が 1 から 10 ま で 1 ずつ増えながら(増分 1 で)間に記述された処理が実行されます。したが って,処理は 10 回繰り返されます。(Step <増分>)はオプションであり(書い ても書かなくてもかまわない記述でありここでは“()”」で括って示しています), 省略した場合の増分は 1 となります。たとえば,Step 2 と書けば,増分は 2 に 和歌山大学経済学部 牧野真也 Excel による社会シミュレーションⅠ─セル・オートマトン─ 19 なります(2 ずつ増えながら繰り返されます)。 具体的にみると,繰り返しの 1 回目は i の値が 1 で,2回目は i の値が 2 で という具合に1ずつ増えながら処理が実行され,i の値が 10 の場合が実行され て繰り返しが終了し,次のステートメントに進みます。 For ループで行なわれる処理は,その For と対応する Next との間にいくつで もかけます。VBA のステートメントは原則 1 行に 1 つなので,その場合は複数 行に分けて書きます8。この例では,Cells(i, 1) = i * 2 のみが書かれていま す。ここでは,Cells(<行数>, <列数>)は現在のワークシートの<行数>, <列数> のセルを参照するプロパティです。また, ‘=’は代入演算子と呼ばれるもので, 左辺の場所に右辺の計算結果(評価した結果)を代入します。ここでは Cells(i, 1)の値に,i * 2 の計算結果を代入します9。ちなみに,セルの値を変数に代入 する場合は(通常この方が多いでしょう)x = Cells(1, 2)のように書きます。 変数 x に 1 行 2 列(セル番地 B1)の値が代入されます。 For ループ中,最初の繰り返しでは i は 1 なので,Cells(1, 1)に i * 2→2 が 代入され,1 行目 1 列目のセル(=A1)に 2 が入ります。VBA では Excel と同 様に+, -, *, /, ^(べき乗)などの算術演算子を利用できます。繰り返しの結 果,セル A1,A2,A3,A4,…,A10 に 2,4,6,8,…,20 と入っていくのが理解できるで しょうか? なお,VBA のプログラムは 1 行入力するごとに処理系によって解釈されます (BASIC 自体がそのような仕様です)。設定によっては,1行ごとに文法上の 間違いがメッセージボックスで指摘されたりします。これは最初のうちは役に 立ったり理解を深めたりすることもありますが,そのうち煩わしくなってくる ので,適当なタイミングで VBE の「ツール」メニューの「オプション」を選び ダイアログボックスの「編集」タブの「自動構文チェック」チェックボックス をオフにしておきましょう。 では,入力したプログラムを実行してみましょう。もちろん「マクロ」ボタ ンからも実行できますが,VBE のツールバーの ▶ ボタンで,エディタ中のカー ソルのある現在対象となっている手続き(エディタの上部に手続き名が表示さ れている)を実行できます。 For ループを理解できれば,これと全く同様の方法で,先ほどのプログラムを 自動的に複数回繰り返すものに変更できます。各自書いてみましょう。繰り返 8 For と Next の間が長くなると,それらの対応関係がわかりにくくなります。そのような 場合の対応関係を確認するためにも,Next のオプション<変数>の制御変数をなるべく書く ようにしましょう。 9 正確には Cells(i, 1).Value = i * 2 と書きますが,この場合 Value プロパティは省略し てもかまいません。 和歌山大学経済学部 牧野真也 20 和歌山大学経済学部,Working Paper Series,No.11-2(2011 年 6 月) しの回数は,プログラム中に直接書いてもかまいませんが,Cells プロパティや Range プロパティによってセルの値で与える方が便利でしょう。 ・代入演算子によるセルのコピー 先ほどのプログラムのコピー&ペースト(値のみ)の代わりに,代入演算子 (=)を使っても,同じことができます。すなわち,Cells(1,1) = Cells(2,2) と書けば,Cells(2,2)の値(計算結果)が Cells(1,1)に入ります。さらに,プ ロパティ Range を用いると複数のセル同士の代入がいっぺんにできます。 たとえば,以下のように1つのステートメントで書くことができます。 Worksheets("Before").Range("B2:AE31").Value = _ Worksheets("After").Range("B2:AE31").Value 上記ステートメント中,1行目末の‘ _’ (スペース+アンダーバー)は「行 継続文字」と呼ばれるもので,複数行にわたってステートメントを記述する場 合の行末に書かれます。したがって,上記ステートメントは1つのステートメ ントであり‘ _’を省いて1行に書いてもかまいません(ここでは,表示の文 字数の関係で2行に分けています)。 また, Range プロパティに対しては Cells プロパティとほぼ同様の操作ができ, Range プロパティを用いると,セル範囲の対応するセル間の複数の代入が 1 つの ステートメントで記述できます。ここで,Value プロパティは Cells の場合と同 様に通常省略可能ですが,セル範囲(複数のセル)を指定する場合は省略でき ないようです。また,代入を使う方がコピー&ペーストよりも高速に処理でき るので,繰り返しの回数が多い場合は書き換えましょう。なお,処理が早すぎ る場合は,Windows の API 関数 Sleep(ミリ秒)を使って,引数で指定されるミリ 秒の間処理を停止できます。詳しい使い方はインターネットなどで調べてくだ さい。 また,同様に, Worksheets("Before").Range("B2:AE31").Value = 0 で対象範囲の全セルに 0 を代入できます(もちろん 0 に限らず任意の値を全 対象セルに代入できます)。これによって,データの 0 クリアも簡単に書けます。 和歌山大学経済学部 牧野真也 Excel による社会シミュレーションⅠ─セル・オートマトン─ 21 (4) ライフゲームにみられる特徴的なパターン プログラムが完成したら,適切な矩形の領域を設定してシミュレーションを してみましょう。まずは,ランダムに初期値を設定して(乱数を使うのもいい でしょう),定義した繰り返しの手続きを実行してみましょう。 ライフゲームは単純なルールに基づくものですが,実にさまざまな複雑な動 きをするパターンがあります。死滅する(なくなる)ものや動かなくなるもの, 周期的に同じ形を繰り返すもの,周期的に形を変えながら移動していくもの, どんどん発展して形を変えていくものなどいろいろなパターンがあります。ウ ィキペディア項目「ライフゲーム」や練習問題の問題2などにしたがって,い ろんなパターンを試してみましょう。以下にいくつかの代表的なパターンを挙 げておきます。 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 理髪店の看板 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 時計 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ペンタデカソロン 0 0 0 0 0 0 0 図 12 タンブラー 0 0 0 0 周期的に同じ形を繰り返す「振動子」 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 グライダー 0 0 0 0 0 図 13 0 宇宙船(というよりは鳥) 0 0 0 0 0 0 0 0 0 0 周期的に形を変えながら移動していく「移動体」 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Rペントノミ 0 0 Tテトロノミ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 図 14 発展していき,ある世代以降安定するパターン (T テトロノミは 10 世代以降安定,R ペントノミは 1103 世代以降安定) 和歌山大学経済学部 牧野真也 22 和歌山大学経済学部,Working Paper Series,No.11-2(2011 年 6 月) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 図 15 グライダー銃 図 15 の「グライダー銃」と呼ばれるパターンを試してみましょう。このパタ ーンは,一定の周期ごとに「グライダー」という移動体を発生させます。この, グライダー銃は MIT(マサチューセッツ工科大)の学生が試行錯誤の末に発見 したものだそうです。 ここまでみてきたパターンをはじめとして,ライフゲームでは誰かが意志を 持ってつくったとしか思えない複雑な動きをするものがいくつも見つかってい ます。しかし,それらは,決して誰かがその動作を意図してつくったものでは なく,非常に限られた領域の2つ値の特定の配列と簡単な局所的なルールのみ に基づいて偶然できあがった(創発された)ものにすぎません。 (5) トーラス 1次元セル・オートマトンのと きと同様に,2次元セル・オート マトンの端の処理について考えて みましょう。1次元セル・オート マトンでは両端をつないで輪状に しました。同様に,2次元セル・ オートマトンの端では矩形(長方 形)の領域の上と下,左と右がそ れぞれつながっているものを考え 図 16 トーラス[ウィキペディアより] ます。イメージとしては,矩形の 上下の辺をつないで筒状にし,その筒の両端をつなげてドーナツ状にします(も ちろん左右を先につないでもいいです)。この形をトーラス(torus)といいます。 トーラスでは,下端の 1 つ下は上端に(上端の 1 つ上は下端に),右端の 1 つ 右は左端に(左端の一つ左は右端に)なっています。トーラスをふつうの平面 に展開すると図 17 のように矩形の2次元セル・オートマトンが(無限に)つら なる形状をイメージできるでしょう。 和歌山大学経済学部 牧野真也 Excel による社会シミュレーションⅠ─セル・オートマトン─ では,2次元セル・オートマ トンをトーラスにしてみましょ う。その方法には,1 次元セル・ オートマトンの際と同様に,ル ールを変更する方法とデータを 変更する方法がありますが,こ の場合データを変更する方法の 方が遙かに簡単です(一般に一 部のセルのルールのみを特別な ものにすることは,あまりスマ 図 17 23 トーラスの平面への展開 ートなやり方ではないでしょ う) 。 領域の周囲のデータの参照をトーラスになるように適切に追加します。4辺 の上下左右は簡単ですね。では角の部分はどうなるでしょうか。図 17 を参考に 考えてみましょう。トーラスにすることによって,2次元セル・オートマトン の端や角は特殊な位置ではなくなります10。 トーラスにするための修正を終えたら,グライダーのような移動体を使って, トーラスの端や角の処理が正しくできているかテストしてみましょう。端や角 に到達した移動体が,反対側から出現し継続すればテストに合格です。 10 2次元セル・オートマトンと直接の関係はありませんが,たとえば,囲碁やオセロ(リ バーシ)のようなゲームは端(囲碁では辺)や角(囲碁では隅)の特殊性がそのゲームの 重要な特徴となっています。トーラス盤で囲碁やオセロをするとゲーム性が全く違って面 白いかもしれません(序盤でシチョウアタリを正確に判断することは難しそうですが)。実 際トーラス碁というものがあるようです。 (蛇足ながら将棋やチェスをトーラス盤でするに は,少なくとも駒の初期配置を変えなければなりません。) 和歌山大学経済学部 牧野真也 24 和歌山大学経済学部,Working Paper Series,No.11-2(2011 年 6 月) 4. おわりに 以上,Excel によるセル・オートマトンのシミュレーションをみてきました。 まずは,次ページ以下の練習問題を自分でやってみましょう。特に問題3は, 2次元セル・オートマトンによる社会の簡単なモデルです。 もちろん,これら以外にも,さまざまなセル・オートマトンによる社会シミ ュレーションがこれまで検討されてきました。興味のある人は調べて試してみ ましょう。ほとんどの場合は Excel+VBA で簡単にできると思います。 これからの問題解決の選択肢にセル・オートマトンをはじめとする社会シミ ュレーションをぜひ加えていただきたいものです。 参考文献 Gilbert, N. and Troitzsch, K. G. (1999), Simulation for the Social Scientist, Open University Press. (井庭崇・岩村拓哉・高部陽平訳『社会シミュレ ーションの技法─政治・経済・社会をめぐる思考技術のフロンティア』日 本評論社,2003。) Poundstone, W. (1985), The Recursive Universe: Cosmic Complexity and the Limits of Scientific Knowledge, Contemporary Books. (有澤誠訳『ラ イフゲイムの宇宙・新装版』日本評論社,2003。) 「ウィキペディア─フリー百科事典」 (http://ja.wikipedia.org/wiki/)項目: 「セ ル・オートマトン」,「ライフゲーム」,「トーラス」。 和歌山大学経済学部 牧野真也 Excel による社会シミュレーションⅠ─セル・オートマトン─ 25 練習問題 問題1(1次元セル・オートマトン) 本文にしたがって,近傍が両隣の2つ のセルの場合の1次元セル・オートマトンをつくってみましょう。倍率 10% で表示し, セル数が数百のオートマトンを 300 世代ほど計算してみましょう。 (1) 2(1)のルールに従って,直線状(端の隣の存在しないセルは「死に」),リ ング状(左端の左隣は右端,右端の右隣は左端)の1次元セル・オートマト ンを,それぞれ試してみましょう。 (2) ルールを 10 進数の 0~255 で与えると,そのルールに基づいてあらゆるル ールの1次元セル・オートマトンの計算ができるワークシートをつくってみ ましょう。ルール 30,90 において中央の1つのセルが生きている状態から始 めると本文のようなパターンになるか試してみましょう。また,初期値を乱 数などで適当に与えてどのようなパターンになるか試してみましょう。 (3) ルール 14,32,60,82,110 は,それぞれクラス1,2,3,4のどれに 該当しますか?初期値を乱数などで適当に与え,その結果をみて考えましょ う。クラス3と4の判別は困難ですが,ランダムな部分のみの場合はクラス 3,ランダムな部分と規則的な部分が混在している場合はクラス4と考えま しょう。 (4) (3)以外のルール番号でいくつか計算し,そのクラスの判定を試みてくださ い。 問題2(ライフゲーム) 本文にしたがってライフゲームをつくりましょう。 数十×数十くらいの大きさにしましょう。それを使って以下のことをやって みましょう。 (1) 初期値を(乱数を使うなど)適当に設定しシミュレーションしてみましょ う。その過程で,固定物体や振動子を発見しましょう(できれば,本文やウ ィキペディア項目「ライフゲーム」にないものをみつけるよう努力しましょ う)。なお,有限の領域内のライフゲームは,最終的には定常状態(固定物体 または振動体の集合)になるはずです。 (2) 本文で示したパターンのいくつかを試してみましょう。さらにインターネ ットなどで調べて面白そうなパターンでシミュレーションしてみましょう。 特に「Tテトロノミ」は,最終的にどうなりますか? (3) トーラス状にしてみましょう。グライダーなどの移動体で端や角の処理が 適切にできているか確認しましょう。 (4) さらにさまざまな工夫をして施しましょう。たとえば,世代を表示したり, 和歌山大学経済学部 牧野真也 26 和歌山大学経済学部,Working Paper Series,No.11-2(2011 年 6 月) 繰り返しの回数指定できるようにしたり,ランダムな初期値の設定や,初期 値のクリアを簡単にできるようにしたりしましょう。Excel と VBA で適切に 役割を分担するなど工夫すれば難しくないと思います。また, 「開発」タブの 「フォームコントロール」で,ボタンにマクロを割り当てることができるの で,これを利用するとマクロ(手続き)の実行がボタンのクリックでできる ようになります。 問題3(多数派モデル) ファッションの流行やデファクト・スタンダード(標 準規格で,公式に決められたものではなく,競争によって勝ち残るもの)の 普及などはどのように広がるのでしょうか?ここでは近くにいる人のうちの 多数が取り入れている流行をその人自身も採用するというルールを考えて, 2次元セル・オートマトンでモデル化してみましょう11。 まず,簡単のために流行は2つのみとし,各セルは2つの流行のうちのど ちらかを必ず取り入れていることにします。たとえば,現在流行している赤 と青のどちらかの服を着るという感じです。そして,近くの人の多くが取り 入れている流行を取り入れることにします。たとえば,パソコンの OS や DVD など記憶媒体にみられるデファクト・スタンダードの普及(競争)では,近 くの人うちの多くが使っている規格に準拠した製品に変更すると考えます。 実際このようなネットワーク性の強い製品では,近くの知り合いが採用して いる規格が採用される傾向がみられます。 このモデルは近傍における多数派の状態を採用するので「多数派モデル」 と呼ばれています。 (1) 近傍をムーア近傍(周囲 8 つ)とします。あるセルの次世代の状態は,そ の近傍の 8 個のセルのうち多数の状態を採用し,同数(2 つの状態がそれぞれ 4 個ずつ)であれば現在の状態を維持するというルールを用いてシミュレーシ ョンしてみましょう。2次元セル・オートマトンの大きさは数十×数十くら いにし,トーラス状にしましょう(このモデルの場合トーラスにしないと, 端や角のセルの近傍を適切に与えられません)。初期状態は乱数を使って,2 つの状態がほぼ同数になるように与えましょう。このモデルで十分に時間を 経過させた場合,一般に定常状態になります。どのような状態になりますか? (2) (1)は通常,十分な時間が経過すれば定常状態となります。そこで,ルール に次のような変更を加え,さらに計算して継続してみましょう。全体のセル のうちほぼ 1/3 はそのままのルールとします。残りのうちのほぼ 1/3 は近傍の 6 個以上の状態が現在の状態と違う場合のみ変化するように変更し,残りのほ ぼ 1/3 は同様に 4 個以上の場合に変化するように変更します。つまり,セル 11 Gilbert et al. (1999) 邦訳 142─145 ページ。 和歌山大学経済学部 牧野真也 Excel による社会シミュレーションⅠ─セル・オートマトン─ 27 の性質が(1)と同じものと,影響を受けにくいものと,影響されやすいものの 3 種類にほぼ均等に分けることとします。この 3 種類の性質の設定は,世代が 変わるたびに適当に設定することとします。このルールでさらにシミュレー ションを続けるとどのようになりますか? 問題4(その他) その他,セル・オートマトンによる社会のモデル化とシミ ュレーションについて自分で調べていろいろ試してみましょう。 和歌山大学経済学部 牧野真也 ISSN 1343-3997 非売品 Faculty of Economics, Wakayama University