0

R を使用して、すぐ近くにいる他のエージェントの決定に基づいて決定を変更するエージェントのグリッドをモデル化しようとしています。基本的に、各エージェントは、グリッド上で自分の周りにいる他のエージェントに目を向け、自分の周りのアクションに基づいて動作を変更する可能性があります。そのような動的な (1 回の反復) を示すために、以下にいくつかの小さなおもちゃのコードのサンプルを含めました。

私は疑問に思っています

  1. グリッドの境界に対処する洗練された方法があります (現在、t+1、i+1 コードはエッジでは機能しません)。

  2. または、マトリックスの「空間」次元を使用する/グラフベースのアプローチを使用してこれらの種類のモデルをシミュレートする他のアプローチがあるかどうか?


NCols=10 
NRows=10
df=round(matrix(runif(NCols*NRows), ncol=NCols),0); df

t=1;i=1

for(i in 1:(nrow(df)-1)){
  for(t in 1:(ncol(df)-1)){
     prox=sum(df[t+1,i]+df[t+1,i-1]+df[t+1,i+1]+df[t,i]+df[t,i-1]+df[t,i+1]+df[t-1,i]+df[t-1,i-1]+df[t-1,i+1])
    if(prox<=3) {df[t,i]=0} else {df[t,i]=1}
  }
}
df
4

1 に答える 1

1

エッジの問題に対する比較的単純な解決策の 1 つは、反対側のエッジにあるエージェントを、反対側のエッジの対応する場所にあるエージェントの隣に配置することです。これにより、グリッドが一種のトーラスになります。番号付けは 0 からnまで実行されるため、これを実装する簡単な方法の 1 つはモジュロを使用することです。たとえば、 の代わりにi+1を使用します(i+1) %% (NRows+1)。たとえば、 の場合NRows=10%% (NRows+1)11 は 0 に、-1 は 10 にマップされます。

どのエージェントが互いに影響を与えるかを指定するルールを設定するには、さまざまな方法があります。これらのルールは、誰が誰と対話するかが決定されたら、何をするかを指定する同じルールとは根本的に異なる動作を生成できます。8 要素フォン ノイマン近傍を使用しているようです。もう 1 つの一般的なグリッドベースの代替手段は、4 要素ムーア近傍です。J. McKenzie Alexander の著書The Structural Evolution of Moralityから、ネットワーク構造と近隣構造が結果にどのように影響するかについて多くのことを学びました。この種の洞察には他にも情報源がありますが、アレクサンダーはその要点を明確にしています。

R は、さまざまなネットワーク構造で単純な相互作用ルールを試すのに最適な言語ではない可能性があります。もちろん、それを行うことはできますし、おそらくそれを簡単にする R パッケージもありますが、そのような実験のための簡単なツールがあると便利です。個人的には、NetLogo はこの種の実験に最適だと思います。少し風変わりですが、習得は簡単で、さまざまなネットワーク構造をセットアップしたり、組み込みのグリッドを Von Neumann または Moore 近傍で使用したりするように指示するのは簡単です。NetLogo と R の間の対話を可能にするアドオンもありますが、試したことはありません。ただし、モデルを R でゼロから構築する正当な理由がある場合もあります。

于 2014-07-08T03:48:10.527 に答える