2013-12-20 78 views
0

我正在嘗試使用R來模擬基於其直接鄰近的其他代理的決定更改其決策的代理網格。基本上,每個代理都會在網格上看到他周圍的其他代理,並且可能會根據他周圍的行爲改變其行爲。我已經在下面包含了一些示例dinky-toy代碼來顯示(一次迭代)這種動態。R agent-based proximity

我想知道是否

  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 
+0

邊界條件是有限差分方法的常見問題。我建議研究文獻。 – Roland

回答

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非常適合這種實驗。這有點古怪,但易於學習,並且很容易告訴它建立各種網絡結構,或者將Von Neumann或Moore社區使用內置網格。還有一個插件允許NetLogo和R之間的交互,但我從來沒有嘗試過。但是,您可能有充分的理由在R中從頭開始構建模型。

相關問題