多くの複雑なシステムは、モデリングによってのみ調査できます。 群衆行動、多細胞生物の発達、軍事作戦など、多数の独立したオブジェクトで構成されるシステムの場合、エージェントモデリングが最も適切です。 このために設計された多くのシステムがあります。たとえば、ロシア独自の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などの専用ハードウェアと通信できます。
モデルへのモデルへのアクセスは、[ファイル]メニューから実行されます。 原則として、モデルのインターフェースには「セットアップ」ボタンと「実行」ボタンがあり、それらを開始するには、この順序でクリックする必要があります。 セットアップによってモデルが初期化され、その後、インターフェイスを介して設定を変更できます。