ホーム : ダウンロード : 解説とコメント : 正誤表 : リンク (山影研究室ホームへ) ( 学術創成プロジェクトへ)
『人工社会構築指南』
解説とコメント
この章で出てくる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.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章のラッシュアワーのモデルでは、人々が左右から対向して進み、その結果、きれいなレーンが形成されていました。では、もし、スクランブル交差点のように、人の流れが直角にぶつかったら、どうなるでしょうか? 試してみましょう。
westwardのルールエディタを開き、「My.Direction = 180」を、「My.Direction =
90」と書き換えてみてください。(Agt_Init、Agt_Stepの一番最後の2カ所で書き換えが必要です。)
こうすると、westwardは、下から上に向かって進みます。
どんなパターンになるか予想してから、実行してみましょう。どうですか?予想どおりになったでしょうか?
この章では、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のうちいずれかの数になります。
15章で、牧羊犬のモデルを作りました。このモデルは、簡略化のために、犬が羊を一匹ずつ捕まえては柵に戻す仕様になっていました。現実の牧羊犬のイメージと違うと感じた人もいるかもしれません。21章とその後のコラムで学んだ技法を使えば、羊を追いかけたり、追い込んだりするような動きも実現できます。
ひとつの例としては、こんな感じ(注)です。ルールを見ると、意外に簡単です。羊は犬が来たら逃げます。一方、犬は、群れの中心から一番離れた羊の外側に回り込みます。
牧羊犬を複数にしてみたり、牧羊犬を近視にしてみたりすることで、羊を集める効率はどのように変化するでしょうか?柵を作ってそこに追い込むようにできますか?
注 (2008年12月19日追記): artisocのアップグレードに伴って、予約語のチェックが強化されていました。上の牧羊犬のモデルではエラーが出るようになってしまいましたので、対処版に差し替えました。ちなみに、予約語は、artisocのヘルプファイルでリストになっています。その他: Javaをアップデートしたら挙動がおかしくなった・・・
【2008年3月31日】