基于R-agent的邻近性

基于R-agent的邻近性,r,proximity,agent-based-modeling,R,Proximity,Agent Based Modeling,我试图使用R来模拟代理的网格,这些代理根据直接邻近的其他代理的决策来更改其决策。基本上,每个代理都会关注网格上他周围的其他代理,并且可能会根据他周围的行为改变其行为。我在下面包含了一些小玩具代码示例,以显示(一次迭代)这种动态的 我想知道 有一种优雅的方式来处理网格的边界(目前t+1,i+1代码在边上不起作用) 或者是否有其他方法使用矩阵的“空间”维度/使用基于图形的方法来模拟此类模型 NCols=10 NRows=10 df=圆形(矩阵(runif(NCols*NRows),ncol=NCo

我试图使用R来模拟代理的网格,这些代理根据直接邻近的其他代理的决策来更改其决策。基本上,每个代理都会关注网格上他周围的其他代理,并且可能会根据他周围的行为改变其行为。我在下面包含了一些小玩具代码示例,以显示(一次迭代)这种动态的

我想知道

  • 有一种优雅的方式来处理网格的边界(目前t+1,i+1代码在边上不起作用)

  • 或者是否有其他方法使用矩阵的“空间”维度/使用基于图形的方法来模拟此类模型


  • NCols=10
    NRows=10
    df=圆形(矩阵(runif(NCols*NRows),ncol=NCols),0);df
    t=1;i=1
    适用于(i/1:(nrow(df)-1)){
    对于(t/1:(ncol(df)-1)){
    prox=总和(df[t+1,i]+df[t+1,i-1]+df[t+1,i+1]+df[t,i-1]+df[t,i+1]+df[t-1,i]+df[t-1,i-1]+df[t-1,i+1])
    
    如果(prox边缘问题的一个相对简单的解决方案是使相对边缘上的代理与相对边缘上相应位置上的代理相邻。这使网格成为一种圆环体。由于编号从0到
    n
    ,实现这一点的一个简单方法是使用模。例如,代替
    i+1
    ,使用
    (i+1)%%(NRows+1)
    。例如,当
    NRows=10
    时,
    %%(NRows+1)
    将11映射为0,将-1映射为10

    有许多不同的方法来设置规则,指定哪些代理相互影响,这些规则可以产生完全不同的行为,而相同的规则指定在决定谁与谁交互后要做什么。看起来您使用的是8元素冯·诺依曼邻域。另一种常见的基于网格的替代方法是4-元素摩尔邻里。我从J.McKenzie Alexander的书中了解了很多关于网络结构和邻里结构如何影响结果的知识。这种见解还有其他来源,但Alexander确实阐明了这一点


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

    Boundary conditi在有限差分法中,非对称性是一个常见的问题。我建议研究文献。
    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