我如何在适应度函数中打印迭代
how do i print iterations in fitness function
我想监控算法的进度,以了解算法的工作时间
我想看到类似
的内容
for(i in 1:100) print( paste("iter number",i))
[1] "iter number 1"
[1] "iter number 2"
[1] "iter number 3"
[1] "iter number 4"
[1] "iter number 5"
[1] "iter number 6"
[1] "iter number 7"
我试过这样做,但我的计数器没有更新。
i <- 0
fit <- function(x) {
##/// my count
i <- i+1
print( paste("iter number",i))
##////
y <- numeric(2)
y[1] <- crossprod(x, x)
y[2] <- crossprod(x - 5, x - 5)
return (y)
}
当我运行优化算法时,我得到以下结果
library(mco)
ns <- nsga2(fit, 2, 2,
generations=150, popsize=100,
lower.bounds=rep(-5, 2),
upper.bounds=rep(10, 2))
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
如何才能正确做到这一点?
如评论中所述,这里是一个小演示。
这是因为我只会在您的函数内更新,而不会在您的函数之外更新。这就是为什么您的函数不打印 0 而是一直打印 1 的原因。因为环境。您可以做的是将 i <- i+1
更改为 i <<- i+1
并且 i 将在函数外更新。
简单演示
i <- 0
z <- 0
fit <- function() {
i <- i + 1
print(paste("i iter number:", i))
z <<- z + 1 # note the <<- instead of <-
print(paste("z iter number:", z))
}
for(x in 1:3) fit()
[1] "i iter number: 1"
[1] "z iter number: 1"
[1] "i iter number: 1"
[1] "z iter number: 2"
[1] "i iter number: 1"
[1] "z iter number: 3"
i # is still 0
[1] 0
z # is now 3
[1] 3
我想监控算法的进度,以了解算法的工作时间 我想看到类似
的内容for(i in 1:100) print( paste("iter number",i))
[1] "iter number 1"
[1] "iter number 2"
[1] "iter number 3"
[1] "iter number 4"
[1] "iter number 5"
[1] "iter number 6"
[1] "iter number 7"
我试过这样做,但我的计数器没有更新。
i <- 0
fit <- function(x) {
##/// my count
i <- i+1
print( paste("iter number",i))
##////
y <- numeric(2)
y[1] <- crossprod(x, x)
y[2] <- crossprod(x - 5, x - 5)
return (y)
}
当我运行优化算法时,我得到以下结果
library(mco)
ns <- nsga2(fit, 2, 2,
generations=150, popsize=100,
lower.bounds=rep(-5, 2),
upper.bounds=rep(10, 2))
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
[1] "iter number 1"
如何才能正确做到这一点?
如评论中所述,这里是一个小演示。
这是因为我只会在您的函数内更新,而不会在您的函数之外更新。这就是为什么您的函数不打印 0 而是一直打印 1 的原因。因为环境。您可以做的是将 i <- i+1
更改为 i <<- i+1
并且 i 将在函数外更新。
简单演示
i <- 0
z <- 0
fit <- function() {
i <- i + 1
print(paste("i iter number:", i))
z <<- z + 1 # note the <<- instead of <-
print(paste("z iter number:", z))
}
for(x in 1:3) fit()
[1] "i iter number: 1"
[1] "z iter number: 1"
[1] "i iter number: 1"
[1] "z iter number: 2"
[1] "i iter number: 1"
[1] "z iter number: 3"
i # is still 0
[1] 0
z # is now 3
[1] 3