基于R代理的接近度

时间:2013-12-20 11:28:37

标签: r proximity agent-based-modeling

我正在尝试使用R来模拟代理网格,这些网格会根据其他代理商直接接近的决策来改变他们的决策。基本上,每个代理都会在网格上查看周围的其他代理,并可能根据他周围的操作更改其行为。我已经在下面添加了一些示例的极小玩具代码来显示这种动态的(一次迭代)。

我想知道是否

  1. 有一种优雅的方式来解决网格的边界(目前t + 1,i + 1代码在边缘不起作用),

  2. 或者是否有其他方法使用矩阵的“空间”维度/使用基于图形的方法来模拟这些模型?


  3. 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
    

1 个答案:

答案 0 :(得分:1)

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

有许多不同的方法来设置规则,指定哪些代理相互影响,并且这些规则可以产生完全不同的行为,这些行为来自相同的规则,指定一旦决定与谁交互,该做什么。看起来你正在使用8元Von Neumann社区。另一种常见的基于网格的替代方案是4元素摩尔邻域。我学到了很多关于网络结构和邻里结构如何影响J. McKenzie Alexander的书The Structural Evolution of Morality的结果。这种见解有其他来源,但亚历山大确实明确了这一点。

R可能不是在不同网络结构上尝试简单交互规则的最佳语言。当然你可以做到这一点,并且可能有R套件可以让它变得更容易,但是拥有这种实验的简单工具真的很不错。我个人认为NetLogo非常适合这种实验。它有点古怪,但易于学习,并且很容易告诉它建立各种网络结构,或者将内置网格与Von Neumann或Moore社区一起使用。还有一个附加组件允许NetLogo和R之间的交互,但我从来没有尝试过。但是,您可能有充分的理由在R中从头开始构建模型。