NetLogo:大人と子供の両方





多くの複雑なシステムは、モデリングによってのみ調査できます。 群衆行動、多細胞生物の発達、軍事作戦など、多数の独立したオブジェクトで構成されるシステムの場合、エージェントモデリングが最も適切です。 このために設計された多くのシステムがあります。たとえば、ロシア独自のAnyLogicです。

NetLogo言語についてお話したいと思います。NetLogo言語は、教育で実証されていますが、大人のタスクにも適しています。



構文



ロゴの構文は最小限です-[]または()を使用してまれにグループ化された名前と定数のスペース区切りのシーケンス。 []はリストを作成し、ほとんどの構成でブロック内のコマンドをグループ化するために使用されます。()は部分式の通常の括弧です。 名前は、組み込みまたはプログラマ定義のエンティティ-関数、変数を指します

チーム(手順)が発表されます
to  [  ]  end
      
      







NetLogoの関数は「レポーター」と呼ばれ、わずかに異なる方法で宣言されます。



 to-reporter  [  ]  report   end
      
      







コンパイラーは、各プロシージャーまたは関数について「アリティ」(「結合価」)を知っているため、グループ化を再度使用する必要はありません。 確かに、高次の関数は誤っている可能性があります-彼は括弧の形でヒントが必要です。



関数を定義してみましょう:



 to-report inc [x] report x + 1 end to-report add [xy] report x + y end
      
      







次に書くことができます
 add add inc 1 inc 2 inc 3
      
      



ふさわしい9つを取得します。

同じように機能します
 map inc [1 2 3]
      
      



[2 3 4]のリストを返します。 追加するには、既に括弧を書く必要があります
 (map add [1 2 3] [4 5 6])
      
      







エージェント



エージェントには3つの形式があります-カメ(カメ-亀なし)、コミュニケーション(リンク)、スポット(パッチ-空間内の場所)。 カメと関係については、ユーザー定義の品種を指定できます。 同じタイプのエージェントは、対応するセット(agentset)-カメ、リンク、およびパスに結合されます。 同じ品種の代表者もセットにまとめられます。 チームによって新しい品種が作成されます
 breed [ninjas ninja]
      
      



ここで、ninjaは品種の名前であり、ninjasはこの品種のすべてのエージェントをまとめたコレクションの名前です。

オブザーバーという特別なエージェントもいます。



カメはcreate-turtlesコマンド(引数で作成するカメの数)で作成され、その後、カメのインデックス関数で検出されます。 エージェントは「最初のクラス値」であり、必要に応じて変数に格納できますが、これはほとんど必要ありません。



エージェントまたはエージェントのセットは、チームのコンテキストにすることができます。 エージェントのコンテキストでコマンドを実行することは、エージェントを操作するための主要なメカニズムです。

 ask turtles [fd 1]
      
      



このコードは、すべてのカメに一歩前進するように要求します。
 ask patch 17 13 [set pcolor pink]
      
      



そして、これはフィールドを柔らかいピンクの座標(17,13)でペイントします。



品種は動的に設定できます
 ask turtle 1 [set bread ninjas] ask ninja 1 [set pcolor black]
      
      







変数



元のロゴでは、動的スコープが実装されていたため、不便が生じ、プログラミング言語の分野における現代の傾向と矛盾しています。 NetLogo開発者は厳しく行動しました-彼らは同じ名前の変数の作成を禁じ、その範囲は交差するかもしれません。 これは図書館の開発者に便利さを追加するものではありませんが、生徒に教えるのにはかなり役立ちます。 はい、そしてモデルの開発における社会学者と軍の専門家は、より少ない間違いを犯します:-)。

スコープは静的であるため、高階関数の使用が簡単になります。

変数は、グローバル、エージェントまたはブリードのタイプに固有、正式な引数、およびコードブロック内のローカルにすることができます。 同じ変数名は異なるクラスの変数を参照できませんが、同じ関数内など、異なるブロック内のローカル変数は同じと呼ぶことができます。 ローカル変数の名前は、それが定義されている関数の引数の名前、またはグローバル変数またはエージェント変数の名前と一致することはできません。



グローバル変数について説明します
 global [1 2 ...]
      
      



所有する
 turtles-own [3 4 ...] ninjas-own [5 6 ...]
      
      



ローカル変数はコマンドによって作成されます
 let 7 _
      
      







高階関数



mapなどの一部の標準関数は、別の関数を引数の1つとして受け取ります。 それらは単に渡される関数の名前を示すか、クロージャーを書くことができます。 クロージャーは[]で囲まれたコードです。 これがリストではなくクロージャであることは、コンパイラがコンテキストによって推測します。 変数「?」、「?1」、「?2」などは、仮パラメータとして使用されます。

高階関数の使用はより複雑です。 変数を割り当てるか、特別なタスク関数を使用して別の関数に値関数を渡し、runresult(またはコマンドの実行)を使用して変数から関数を呼び出すことができます。
 to test1 [f] show (runresult f 1) show (map f [2 3 4]) end test1 (task [? + 2])
      
      





個人的には、関数を参照する関数と変数を分離するこのアプローチは失敗すると考えていますが、たとえばCommon Lispで実装されており、独自のサポーターがいます。



インターフェースとグラフィックス





このプログラムには、「インターフェース」、ドキュメント、およびコードエディターの3つのタブ(タブ)があります。 「インターフェース」タブには、グラフィックオブジェクトのフィールド(世界の画像を含む)、テキスト出力のフィールド、REPLがあります。 REPLでは、実行するコマンドが「observer」、「turtles」、「spots」、および「communications」であるコンテキストを指定するモードを切り替えることができます。 REPLには制限があります-変​​数、品種、プロシージャ、および関数を記述できません(コンテキストから作成されます)。コードエディターに移動する必要があります。



ワールドを含むフィールドが描画されるゾーンでは、「マウス」を使用して他のグラフィックオブジェクトとインターフェイス要素を作成できます(空の場所で右ボタンを押す)。 それらを作成するとき、プログラムからアクセスできる名前を指定する必要があります。 プログラム的に、グラフィックオブジェクトを生成する方法を見つけていません。 ファイルでは、これらのオブジェクトはコードの後に​​テキスト形式で保存されますが、手動での編集には適さない形式で保存されます。

たとえば、「plot1」という名前の「グラフ」を作成すると、コマンド
 set-current-plot "Class Histogram" histogram map [position ? [red green blue]] ([color] of turtles)
      
      



カメの分布を赤、緑、青でグラフ化します(他のカメが見つからないと仮定します)。



モデルライブラリ



NetLogoには、教育や娯楽から研究まで、広範なモデルのライブラリが付属しています 。 一部のモデルは、 GoGo boardなどの専用ハードウェアと通信できます。

モデルへのモデルへのアクセスは、[ファイル]メニューから実行されます。 原則として、モデルのインターフェースには「セットアップ」ボタンと「実行」ボタンがあり、それらを開始するには、この順序でクリックする必要があります。 セットアップによってモデルが初期化され、その後、インターフェイスを介して設定を変更できます。



All Articles