我正在R中编写一个路径查找器,它找到从一个节点列表(表示为节点对象)到另一个节点列表(表示为节点对象)的所有路径(在n个距离处)。为了加速路径发现,我在两个方向上构建路径。然后,作为最后一步,我检查节点是否相交。
简而言之,我正在针对另一个节点列表运行一个节点列表,寻找所有匹配。但是,代码有效,运行速度非常慢。有没有人对如何重新编写此代码以获得更好的优化有任何建议?
unlist(llply(list.nodepath.1,
# For each node.1 in list.nodepath.1...
function(node.1){
llply(list.nodepath.2,
# And for each node.2 in list.nodepath.2...
function(node.2){
if(node.1@internode == node.2@internode){
cat("Connection found!...\n")
# Merge node objects, including meta-data (defined elsewhere)
intersect(node.1, node.2)
}
})
})
)
我尝试过并行化;但是,我似乎无法使用llply(.parallel = TRUE)来处理这个函数......
根据Rprof()性能分析,瓶颈似乎与llply()调用有关 - 而不是与intersect()函数有关。
我很欣赏有关重组此代码的任何建议。
答案 0 :(得分:1)
你看过TSP包吗?你的问题看起来像是那里遇到的问题的变种;其使用的一个例子如下:
> ## load library and read data
R> library("TSP")
R> data("USCA312")
R> ## create a TSP object from the data
R> tsp <- TSP(USCA312)
R> tsp
object of class 'TSP'
312 cities (distance 'euclidean')
R> ## find a 2-optimal solution
R> tour <- solve_TSP(tsp, method = "2-opt")
R> tour
答案 1 :(得分:0)
您可能会发现简单地使用lapply()比llply()更有效。例如,
L1 <- as.list(letters)
L2 <- list("f", "h", "k", "m")
unlist(lapply(L1, function(l) {
lapply(L2, function(m) {
if (l == m) {
print("match found")
return(m)
}
})
}))