ホームダウンロード : 解説とコメント : 正誤表 : リンク     (山影研究室ホームへ)  ( 学術創成プロジェクトへ)


『人工社会構築指南』

解説とコメント


目次:
8章 ExitSimulationMsgLn()についての注意。
10章 シェリングの「分居モデル」を作る。
11章 ラッシュアワーモデルの改造。
12章 RGBでの色づくりに慣れよう。
16章 引っかかってしまう人へのヒント。
21章 よりリアルな牧羊犬のモデル。
28章 personnelモデルの改造。派閥闘争モデルのススメ
その他 ルールが200行を超えてしまったときは・・・
その他 Mac OS X で日本語ファイルが読み込めない・・・
その他 Javaをアップデートしたら挙動がおかしくなった・・・


第8章

この章で出てくるExitSimulationMsgLn()について一つ注意があります。artisocの組み込み関数は、変数の型をチェックしています。このチェックは、間違いを未然に防ぐ上で便利な反面、自由度を下げてしまうという欠点もあります。ExitSimulationMsgLn()もその一例です。たとえば、終了ステップだけを書き出したいときに、

  ExitSimulationMsgLn(Getcountstep())

とだけ書いてしまうと、教科書添付版のartisocでは、エラーが出てしまいます。なぜでしょうか?ExitSimulationMsgLn()は文字列型(詳しくは109ページのコラムや22章を参照してください)の引数をとります。しかし、Getcountstep() は長整数型の値に置き換わりますから、型が合わない訳です。このため、artisocが作成者のミスを疑い、エラーを出して警告してしまいます。

この問題を回避するためには、二つの方法があります。一つ目は教科書のように

  ExitSimulationMsgLn("Simulation Completed after " & Getcountstep() & " Steps")

の様に書く方法です。こうすると、変数の先頭が文字列型になりますから、エラーを回避できます。もう一つの方法は、Cstr()という関数(239ページ参照)を用いて、Getcountstep() の型を変えてしまう方法です。

  ExitSimulationMsgLn(CStr(Getcountstep()))

と書きます。こちらの方が正攻法ですが、他の箇所でprint関数などを併用した場合、数字だけが羅列されたり、数字同士がくっついたりして訳が分からなくなることもあります。どちらでも自分にあった方法を選んでください。


 第10章:

10.4節について、Q&A方式で補足したいと思います。

◎個々のエージェントにとっての分居度ではなく、全体の分居度を時系列グラフで表す。

Q1: Universe..averagelevel = Universe..averagelevel + rate はどこに挿入したら良いですか?
A1: rateが確定した後に挿入する必要があります。たとえば、pennyのルールであれば、
If NP + ND == 0 Then
rate = NP / (NP + ND)
End if
の直後に書くと良いでしょう。dimeのルールにも書き込むことを忘れないでください。
 
Q2: エージェントの平均分居度が、3割くらいにしかならないのですが、マップを見るともっと高そうです。なぜですか?
A2: 集計が正しくできていません。6割くらいになるはずです。新しく作った変数Universe.averagelevelがきちんと実数型になっているか、もう一度確認してみてください。この変数を整数型として定義してしまうミスがよく起きます。整数型の変数に実数を代入しようとすると、小数点以下が切り捨てられてしまうので、集計したときに実際よりも低い値が出力されてしまうのです。

Q3: 出力設定で、時系列グラフの罫線を0.1単位にしたいのですが、数字が入力できません。
A3: まず、「1」を入力してから、カーソルを左に持って行って、「.」「0」の順番で入力してみてください。

◎満足しているエージェントの割合を時系列グラフに表示する。

Q4: Universe.satisfied = Universe.satisfied + 1 はどこに挿入したらよいですか?
A4: 実は、この部分、説明が不適切・不親切でした。ごめんなさい。挿入するルールは、Universeのレベルに作った変数satisfiedに1をプラスする、というルールですから、自分が満足した時に実行されるようにします。pennyのルールの後半を見てみましょう。

If NP + ND == 0 Then
rate = NP / (NP + ND)
End if
If rate < 1/3 Then
MoveToSpaceOwn Cell(2)
End if
(同じモデルで続けて作成している場合、3行目と4行目の間には、先ほどのUniverse..averagelevel = Universe..averagelevel + rate が入っているかもしれませんね)

さて、この最後のIf文の条件文、rate < 1/3 が満たされる時は、そのpennyが不満なときです。今回は、満足した時に実行するルールを挿入したい訳ですから、このIf文にElseを足してあげましょう。すると、最後のIf文は以下のようになります。

If rate < 1/3 Then
MoveToSpaceOwn Cell(2)
Else
Universe.satisfied = Universe.satisfied + 1
End if

これで、「不満なときには移動して、満足なときにはUniverse.satisciedに1をプラスする」というルールになりますね。dimeについても、同様の変更を加えてください。


 第11章:

11章のラッシュアワーのモデルでは、人々が左右から対向して進み、その結果、きれいなレーンが形成されていました。では、もし、スクランブル交差点のように、人の流れが直角にぶつかったら、どうなるでしょうか? 試してみましょう。

westwardのルールエディタを開き、「My.Direction = 180」を、「My.Direction = 90」と書き換えてみてください。(Agt_Init、Agt_Stepの一番最後の2カ所で書き換えが必要です。)
こうすると、westwardは、下から上に向かって進みます。

どんなパターンになるか予想してから、実行してみましょう。どうですか?予想どおりになったでしょうか?



 第12章:

この章では、RGB()という関数を使った色の指定を説明しました。本文でも説明したように、R、G、Bは、Red、Green、Blueの略で、それぞれの要素の強さを0から255の数で表します。赤を作りたければ、Rを255、GとBを0にすればよいわけです。しかし、黄色を作りたいときに、R255、G255、B0というのは、なかなかピンとこないかもしれません。練習問題12.1のモデルを作って少しいじってもらえれば、どんな値の時にどんな色になるのかイメージが掴めるのではないでしょうか?

いちいちモデルを作るなんて面倒という方。実は裏技があります。

どのエージェントでもよいので、「マップ出力設定」の中の「要素設定」の「エージェント表示色」で、「選択」ボタンを押してみてください。サンプル、HSB、RGBという3つのタブが出てきたことと思います。つまみを動かすと、下のプレビューで色が表示されます。動かして、どんなときにどんな色ができるのか試してみてください。

ちなみに、このRGBタブの隣には、HSBというタブがあります。HSBという名前は、Hue(色相)、Saturation(彩やかさ)、Brightness(明るさ)の頭文字からきています。RGBよりも色を選びやすいかもしれません。「色の設定」ダイアログで、HSBタブを開くと、真ん中右寄りに帯が見えます。つまみを上下に動かして好みの色に合わせた後に、左端の大きな色パレットの気に入った色合いのところをクリックすると、簡単に細かな色を指定することができます。サンプルより細かい色を指定したい、という時に使ってみてください。


 第16章:

授業中、引っかかる人が多かったポイントを、解説したいと思います。

・ 時系列グラフを追加しようとしたが、Phytoプランクトンの数が出力されないで、エラーが出てしまう。
→ 教科書の171ページでは、「numphyto / 10」と書かれている部分があります。これをそのまま時系列グラフの要素設定のところに書いてしまうと、エラーが出ます。ここはきちんと、「Universe.numphyto / 10」と書いてあげてください。

・ 章の最後で、zooプランクトンが餌を食べて体力を蓄えて子供を産むようにしたが、シミュレーションがすぐに終了してしまう。
→ 教科書をよく見てください。ここではAgt_Initのルールが省略されていますね。powerの初期値を設定しましたか?設定しないと0なので、すぐに終了してしまいます。Agt_Initでランダムに4から9の値を与えてあげてください。やり方のヒントですが、int(rnd()*6) と書くと、0,1,2,3,4,5のうちいずれかの数になります。



 第21章:

15章で、牧羊犬のモデルを作りました。このモデルは、簡略化のために、犬が羊を一匹ずつ捕まえては柵に戻す仕様になっていました。現実の牧羊犬のイメージと違うと感じた人もいるかもしれません。21章とその後のコラムで学んだ技法を使えば、羊を追いかけたり、追い込んだりするような動きも実現できます。

ひとつの例としては、こんな感じ(注)です。ルールを見ると、意外に簡単です。羊は犬が来たら逃げます。一方、犬は、群れの中心から一番離れた羊の外側に回り込みます。

牧羊犬を複数にしてみたり、牧羊犬を近視にしてみたりすることで、羊を集める効率はどのように変化するでしょうか?柵を作ってそこに追い込むようにできますか?

注 (2008年12月19日追記): artisocのアップグレードに伴って、予約語のチェックが強化されていました。上の牧羊犬のモデルではエラーが出るようになってしまいましたので、対処版に差し替えました。ちなみに、予約語は、artisocのヘルプファイルでリストになっています。

 第28

personnelモデルは(紙幅の関係で)非常に単純でした。興味のある人は、少し手を加えてみましょう。たとえば、役員が持ち回りで入社面接の最終決定権を持つ、としたらどうなるでしょうか? 役員は自分の部下になりそうな人(x,y座標が近い候補者)を採用したがります。人工会社の人材は、どんな風に偏っていくでしょうか? 派閥はできるでしょうか? お勤めの読者は、個々のエージェントに上司や同僚の名前を付けたりすると途端に生々しいモデルになる・・・かもしれません。

 その他: ルールが200行を超えてしまったときは・・・

教科書を一通り終え、自分でモデルを作っていたら、ルールが200行(Artisoc Textbookの制限)を超えてしまった人もいるかもしれません。数行超えてしまっただけでしたら、余計な改行を削除したり、変数の宣言文を

dim a as double; dim b as double; dim i as integer

という風に、; で区切りながら1行にまとめてしまうと良いでしょう。もし、200行を大幅に超えてしまうような本格的なモデルを作りたいときには、正式版(academicまたは processional)を利用する必要が出てきます。研究や教育目的のものについては、構造計画研究所がArtisoc Academicを無償貸与しています。こちらを参照してみてください。

その他: Mac OS X で日本語ファイルが読み込めない 

MacのOS X のLeopardを使用している場合、日本語が混じったモデルを読み込もうとすると、文字化けしてしまって動かないことがあります。これは、どうやら文字コードがShift-JISからUTF-8に変更された(?)ことが原因のようです。

この場合、動かないモデルファイルの文字コードをUTF-8に変換してあげることで、動作可能になります。
文字コードを変換するフリーソフトはたくさんありますが、たとえば、

http://www.vector.co.jp/soft/mac/util/se102523.html

を例にとって説明しましょう。ソフトをインストールしたうえで、

1. 「MultiTextConverter」メニューの「環境設定」を開く
2. 「変換」タブの「文字コード」を「UTF 8」にして
「BOM有り」のチェックを外す
3. 「拡張子」タブの「変換対象とする拡張子」リストに「+」ボタ
ンを押して「model」を追加する
4. そして最後にMultiTextConverterのアイコンに対象とするモデルファイルをドロップ。

これで変換されるはずです。

その他: Javaをアップデートしたら挙動がおかしくなった・・・ 

【2008年3月31日】

ご存じの通り、artisocはJavaと言われるソフトの上で動いています。
先日、このJavaが「Java 6 Update 5」にアップデートされて、内部の仕様が大幅に変更されました。
このため、このアップデートを行うと、artisoc textbookが正常に動かなくなってしまいます。
MASコミュニティ に行って、対処版をダウンロードしてください。