0

我正在尝试使用 R 对代理网格进行建模,这些代理网格会根据直接邻近的其他代理的决定来改变他们的决定。基本上,每个智能体都会在网格上查看他周围的其他智能体,并且可能会根据他周围的动作改变其行为。我在下面包含了一些示例 dinky-toy 代码来显示(一次迭代)这种动态。

我想知道是否

  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

边缘问题的一种相对简单的解决方案是使相对边缘的代理靠近相对边缘上相应位置的代理。这使得网格成为一种圆环。由于您的编号从 0 到n,因此实现此目的的一种简单方法是使用模数。例如,代替i+1,使用(i+1) %% (NRows+1)。例如,当 时NRows=10%% (NRows+1)将 11 映射为 0,将 -1 映射为 10。

有许多不同的方法可以设置规则来指定哪些代理相互影响,这些规则可以产生与相同规则完全不同的行为,这些规则指定一旦决定谁与谁交互就做什么。看起来您正在使用 8 元素冯诺依曼邻域。另一个常见的基于网格的替代方案是 4 元素摩尔邻域。我从 J. McKenzie Alexander 的书The Structural Evolution of Morality中学到了很多关于网络结构和邻域结构如何影响结果的知识。这种洞察力还有其他来源,但亚历山大确实清楚地说明了这一点。

R 可能不是在不同网络结构上试验简单交互规则的最佳语言。当然你可以做到,并且可能有 R 包可以使它更容易,但是有简单的工具来进行这样的实验是很好的。我个人认为 NetLogo 非常适合这种实验。它有点古怪,但易于学习,并且很容易告诉它设置各种网络结构,或者使用带有冯诺依曼或摩尔邻域的内置网格。还有一个插件允许 NetLogo 和 R 之间的交互,但我从未尝试过。但是,您可能有充分的理由在 R 中从头开始构建模型。

于 2014-07-08T03:48:10.527 回答