我正在尝试在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)其他代理的行为。它没有反映在示例代码中(尚未),因为我没有想到一种简单的方法来反映它......我会尽快更新。
[编辑]代码修订为包括多个代理属性和样本值生成,这些属性都是历史记录和其他依赖于代理的。示例代码中的值生成过程本质上没有意义,但它是为了说明实际代码中的依赖类型。
答案 0 :(得分: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
}