以下是评估函数,我将其用作遗传算法的输入:
evaluate <- function(string=c()) {
z <- 0
for (i in 1:56) {
z=(z+cost[i,string[i]])
for (j in 1:numadj[i]) {
coi<-adj[i,j]
d1<-string[i]
d2<-string[coi]
z=z+comrev[d1,d2]*wt[i,j]
}
}
z
}
Cost
是一个52x52
稀疏矩阵,有很多零。目前,代码实际上是遍历所有元素。我想确保上面的函数只循环非零值。
感谢任何帮助。
答案 0 :(得分:0)
你实际上并没有迭代你所有的52x52(56x56?)entires 成本矩阵,如果您重写这样的代码,可以看到:
evaluate <- function(string=c()) {
z <- 0
for (i in 1:56)
z = z + cost[i,string[i]]
for (i in 1:56)
for (j in 1:numadj[i])
z = z + comrev[string[i],
string[adj[i,j]]]*wt[i,j]
return(z)
}
说,你可以更有效地初始化z
,如此
evaluate <- function(string=c()) {
z = sum(cost[cbind(1:56,match(string,colnames(cost))[1:56])])
for (i in 1:56)
for (j in 1:numadj[i])
z = z + comrev[string[i],
string[adj[i,j]]]*wt[i,j]
return(z)
}
并且我怀疑识别零的成本与在此解决方案中添加总计零元素的成本相似。