0

R で (効率的な) エージェント ベースのモデルを構築しようとしています。各エージェントには、リスト内の data.table にキャプチャされた情報があります。これを行うより効率的な方法はありますか?簡単なコードを次に示します。

require(data.table)

# Setup simulation
numAgents <- 5
numIterations <- 10

# Create collection of agents which have a property someValue that we want to track through the simulation
agents <- vector("list", numAgents)

for(i in 1:numAgents) {
  agents[[i]] <- data.table(someValue1 = rep(as.integer(NA), numIterations), someValue2 = rep(as.integer(NA), numIterations))
}

# Iterate through simulation
for(i in 1:numIterations) {
  # Generate values for someValue1, someValue2 for the agents
  #   Note: This is just to give an idea of what will be involved
  #   Note2: The values depend upon history and other agents
  agentValues1 <- lapply(agents, function(x) {
                                   sum(x[, median(someValue1, na.rm = TRUE)], round(runif(1)), na.rm = TRUE)
                                 })
  agentValues2 <- ifelse(runif(numAgents) < as.integer(agentValues1)/max(as.integer(agentValues1)), 1, 0)

  # Update the agents history (I'm trying to optimize this)
  for(k in 1:numAgents) {
    set(agents[[k]], i, j = "someValue1", as.integer(agentValues1[k]))
    set(agents[[k]], i, j = "someValue2", as.integer(agentValues2[k]))
  }
}

data.tables のリストを使用しないという推奨事項も歓迎されますが、質問の範囲が少し拡大する可能性があります。

注として、値生成プロセスには、(1) エージェントの複数のプロパティ (たとえば、someValue1 と someValue2) (2) これらのプロパティの履歴、および (3) 他のエージェントの動作が含まれます。サンプルコードには(まだ)反映されていません。反映する簡単な方法を考えていないためです...できたら更新します。


[編集] 複数のエージェント プロパティと、履歴と他のエージェントに依存するサンプル値の生成を含むようにコードが改訂されました。サンプル コードの値生成プロセスは本質的に意味のあるものではありませんが、実際のコードでの依存関係の種類を示すことを目的としています。

4

1 に答える 1

0

エージェントの値を格納するために行列を使用する方が望ましい場合があります。

numAgents <- 5
numIterations <- 10

agents <- matrix(NA, nrow=numAgents, ncol=numIterations)

for(i in 1:numIterations) {
  agentValues <- as.integer(ceiling(runif(numAgents)*10))
  agents[,i] <- agentValues
}
于 2013-09-24T06:33:45.393 に答える