では、実際にどのようにしてNetlogoが動いているのかを、
単純なコードを書きながらで見て行きます。
このコードは、「一匹のアリがランダムに動く」ただそれだけの内容です。
まずはNetlogoを立ち上げます。
このNetlogo5.0.3をクリックします。
視聴者はダウンロードしたバージョンのアイコンをクリックしてください。
まず最初に、"setup"と"go"のボタンを作ります。
メニューのこの部分から"Button"を選びます。
この部分は、インターフェース作成用メニューになっていて、
このようにクリックすると
インターフェースとして追加できるオブジェクト群が表示されます。
とりあえず、"Button"をクリックしてボタンを追加します。
このボタンを"setup"と名付けます。
つぎに、もう一つプログラムを実行するためのボタンを追加します。
"go"ボタンがここにできました。
この上で右クリックから"Select"を選ぶと位置を動かしたり、
サイズを変えたりして調整する事ができます。
これで、"setup"と"go"ボタンができました。
ボタンの文字の色が赤いのは、このボタンに何のコードも関連づけられていないからです。
このままでは、ボタンをクリックしても何も起きません。
なのでこのボタンにコードを記述する必要があります。
では、"setup"、"go"ボタンのコードを作って行きます。
上の"Code"タブをクリックし,対応する手順を書き込んで行きます。
まず"setup"ボタンに対して、最初に"to setup"と書き込みます。
これは、"setup"ボタンをクリックした時の処理という意味です。
次に"clear-all"、これは全ての消去、
つまり、アリを含むその他の全てのプログラムの生成物を消去するコマンドです。
これにより、それ以前に走らせたプログラムの結果は全て消去されます。
次に"reset-ticks"、
これは時間経過を記録する"ticks"をゼロに戻します。
では、アリを作ってみます。
NetLogoでは、アリのように自動で動くプログラム（エージェント）を、
"turtles"で表します。
これには込み入った事情があります。
それはNetLogoそのものを記述するLogoという言語において、
アリのようなエージェントプログラムを"turtles"で表す為です。
今回の場合、最終的にはたくさんのアリを作りますが、
最初は"create-turtles 1"で一匹のアリを作ります。
次に、アリに何をさせるかを記述します。
"ask turtle"と書き込み、
その後に括弧でくくられた動作リストを記述します。
" set shape "bug" "
これによってエージェントは、NetLogoに組み込まれたアリの形になります。
" set size 3 "
これによってエージェントのサイズが"3"になり見やすくなります。
" set color red "で、
エージェントの色が"red"になります。
一旦ここで終える為に、リストを括弧で閉じ、"end"と記述します。
さらに、ここにコードのバグを調べる為の"Check"ボタンがあるのでクリックします。
すると、バグが検出されました。
バグの場所は、青く強調されます。
そして気づきました。"ask turtles"にしなければなりません。
"s"を忘れていました。
常に"s"を付ける理由は、
NetLogoのエージェントは複数存在する事を仮定して作られているからです。
今は一匹のみですが、後ほど数を増やしその全てに適用します。
もう一度"Check"してます。
元の画面に戻ってきたので、問題ないようです。
なので"setup"をクリックしてみます。
画面の真ん中にアリが作られました。
"go"ボタンの文字が赤いのは、
まだ対応するコードが書かれていないからです。
次に"go"の内容を記述します。
"Code"タブの画面に戻り、
"to go"に、
同様に"ask turtles"で、
いくつかの動作を記述します。
まず体を右に30°回転させます。
これは"right 30"となります。
さらに4ステップ前進させます。
これは"forward 4"となります。
次に時間を1ステップ経過させる為に、
tickコマンドを使います。
上で"reset-ticks"により、ゼロに初期化されたticksの値が、
このコマンドのたびに1ずつ加えられていきます。
以上です。
"Check"も問題ないようです。
"Interface"タブに、戻り、
実行してみます。
アリは、体を右に30°回転させ、
4ステップ進みます。
何回も"go"ボタンを押すと、
アリは輪を描いて進みます。
"go"ボタンをいちいち手動で押さずに、
自動で連続して動かす事もできます。
"go"ボタン上で右クリックから"Edit"を選び、
"Forever"オプションにチェックします。
これは、"go"ボタンを押す事を永遠に繰り返す意味になります。
やってみます。
少しスピードを遅くします。
アリが動いているのが見えます。
ぐるぐる。
もう一度"go"ボタンを押す事で止まります。
再開するには、もう一度"go'ボタンを、
止めるにはもう一度"go"ボタンを押します。
最初からやり直したい時は"setup"ボタンを押します。
"setup"ボタンを何回も押すと、
アリは常に画面の真ん中にいますが、
その体の向きは"setup"ボタンを押すごとに変わります。
これは、"setup"ボタンの役割が、
"アリを画面の真ん中に配置し"、
”ランダムな方向へ体を向ける”事だからです。
ここまでのモデルを保存します。
"File"タブから"Save As"へ、
名前は"Ant1"とします。
デスクトップに"Ant1.nlogo"として保存されます。
こうしておくと、
"NetLogo"メニューからNetLogoを閉じた後でも、
前の続きから始めたい時に、
保存したファイルのアイコンをダブルクリックで、
直接NetLogoに読み込ませることができます。
ただ、一つだけ、
このプログラムは退屈です。
アリがただ輪を描いて進むだけです。
なのでもう少し面白くしてみます。
その為に、一つ簡単なコマンドをコードに加えます。
右へ30°回転を示す"right 30"の代わりに、
"right random 30"とします。
"random"を加えた事により、アリの向く角度は、
0から29° (=30-1)の間のランダムな方向になります。
そして、それは"go"ボタンが押されるたびに繰り返されます。
同様の事を4ステップ前進する事を示す"forward 4"にも行い、
"forward random 4"とすることで、
0から3ステップ(=4-1)の間のランダムなステップを進みます。
実際にどうなるか見てみます。
"Interface"タブに戻り、
"setup"ボタンを押し、"go"ボタンを押します。
すると、依然大まかに輪を描いてはいるものの、
少しだけ面白くなりました。
一つ気づいたと思いますが、
アリは画面の端を通り抜けて、
逆側から出てきます。
つまり、画面上の黒い空間は上下と左右がつながっています。
ドーナッツもしくはトーラス体の形をした世界を思い浮かべてもらえばいいと思います。
画面上では平坦に見えても、
端と端はつながっています。
アリは上端を通り抜けると、
下端から、
横の端を抜けると、
反対側から出てくるのがわかります。
これでは少し不自然なので直します。
黒い画面上で右クリックから"Edit"を開きます。
ここでは座標系に関する様々な情報を調整することができます。
例えば、空間を格子状に分割している"Patch"の数などです。
今、興味があるのは、このデフォルトでチェックされている二つの項目です。
このチェックを外すと水平垂直方向のつながりを断つことになります。
では見てみます。
アリは端にぶつかるとそこで止まります。
通り抜ける事はできず、向きを変えて進み始めます。
これで、以前に比べ少しは現実に近い動作になりました。
しかし、多少ランダムに動くようになったものの、
常に右方向に向きを変えるのも不自然です。
なので左右両方にランダムに向きを変えるコードを書いてみます。
言うなれば、動作のたびにコインを投げて、
その表裏を使って右へ向くか左へ向くかを決める要領です。
では、コイン投げの機能をコードに組み込みます。
それには、"to-report"を使い"coin-flip?"という処理を作ります。
"to-report"は"to"のみの場合と違い、戻り値を持ちます。
この場合、戻り値はコインの表裏に対応した、”真”か”偽”になります。
次に"report random 2 = 0"と書き込み"end"で終えます。
これの意味するのは、
"random 2"は、0または1(=2-1)のどちらかを、
半々の確率でランダムに選ぶため、
0の時はこの文は”真”、
1の時は”偽”となり、
戻り値はこの”真”もしくは”偽”になります。
つまり、この"coin-flip?"は戻り値として、
”真”もしくは”偽”を、
半々の確率で返すことになります。
これを使って、
"ifelse coin-flip?"と書いていきます。
これは、もし"coin-flip?"の戻り値が”真”の場合は、
最初の括弧内の手順、
”偽”の場合は二つ目の括弧内の手順を実行する事を示します。
二つ目の括弧内には"left random 30"と記述します。
よって"go"ボタンが押されるたびに、
"coin-flip?"が”真”の場合、"right random 30"、
”偽”の場合、"left random 30"が実行され、
右へ進むか左へ進むかが決まります。
どのように動くか見てみます。
"setup"してから"go"。
アリが右にも左にも向きを変えて進むのが見えます。
画面の端にぶつかっても左右に向きを変え進もうとします。
次に問題なのは画面の端で行き詰まる場面が多すぎる点です。
そこで、それを直すために体の向きを変える角度の部分を、
"random 30"から"random 60"にします。
これで、アリはより大きな角度で曲がる事ができます。
見てみると、画面の端で行き詰まる場面は多少減り、
より実物に近い動きになりました。
コードを書く時には、コメントを追記しておく事はとても有用です。
コードの画面に戻り、コメントを加えます。
コメントとは、プログラム内に付け加える文で、
コンピュータには無視されますが、
人がコードを読む際には役に立ちます。
NetLogoでは、コメントは";"の後に文を書いて表します。
なので、ここに";"を打てば、
その後に何を書いてもコンピュータは無視します。
なのでこの行の説明として、
"戻り値として、”真”か”偽”をランダムに返す"
という風に書いておきます。
ここにもう一つ、次のコメントを加えます。
”"coin-flip?"が”真”の場合、右に向きを変え、
”偽”の場合、左に向きを変える”
これらは、コードを書いた私達自身や、
それを後から読む人にとって、
内容を把握するための注釈になります。
この機能は、さらに込み入ったプログラムを作る際には大変役に立ちます。
特に、間が数日空いて戻ってきた時など、
以前書いたプログラムの内容を、
思い出すための大きな助けになります。
コメントはたとえあなた以外にプログラムを読む人が居なくても、
欠くことのできないものです。
ここで、これまでのコードを保存しておきます。
まずは名前を付けておきます。
これはただのテキストで書き込みます。
メニューから"Note"を選び、ここに書き込みます。
モデル名として"Ant 1"とします。
文字を少し大きくするために、サイズを"18"にします。
さらに、これを"Select"して、少し位置を下げ見栄えを良くします。
これで完了です。
モデルを保存してNetLogoを終了します。
ここで、NetLogoの使い方を学ぶ理由について触れておきます。
このクラスでは多くのNetLogoのシミュレーションを使うため、
視聴者にそのプログラムがどのように動作するのかを、
理解してもらうのが目的です。
それほど多くのプログラムは書きません。
コードの動作、インターフェースその他の動作への感覚を、
手に入れて欲しいです。
今後、プログラムを自らの手で改良したり、
さらに発展して一から書き始める場面もあるかもしれません。
今回、自主的な課題として"Ant 1"と同様なプログラムを書く事を勧めます。
これは、成績には関係ありません。
ただ、ここで示した内容を確認する良い機会になると思います。
質問はいつでも"Forum"で受け付けます。
遠慮なく利用してください。