【问题标题】:how do i print iterations in fitness function我如何在适应度函数中打印迭代
【发布时间】:2022-01-13 22:09:08
【问题描述】:

我想监控算法的进度,以了解算法的工作时间 我想看看类似的东西

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"

如何正确地做到这一点?

【问题讨论】:

  • 我真的希望无论算法或包如何,都可以通过适应度函数来完成一些事情
  • 这是因为i 只会在您的函数内部而不是在您的函数外部更新。这就是为什么您的函数不打印 0 而是一直打印 1 的原因。因为环境。您可以做的是将i &lt;- i+1 更改为i &lt;&lt;- i+1,我将在函数外更新。

标签: r optimization fitness


【解决方案1】:

如 cmets 中所述,这里有一个小演示。

这是因为我只会在您的函数而不是在您的函数之外更新。这就是为什么您的函数不打印 0 而是一直打印 1 的原因。因为环境。您可以做的是将i &lt;- i+1 更改为i &lt;&lt;- i+1,我将在函数外更新。

简单演示

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-30
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2013-01-25
    • 1970-01-01
    • 2020-01-01
    相关资源
    最近更新 更多