在R中的另一个循环内循环

时间:2015-03-24 21:11:59

标签: r loops for-loop gradient-descent

循环函数中的循环结果有问题。它只对内部循环进行一次计数,并为第一个原始选择最佳解决方案,然后停止。

我想记住矩阵zmienne的每一行的最佳解决方案。我做错了什么?

schaffer <- function(xx)
{x1 <- xx[1]
 x2 <- xx[2]

 fact1 <- (sin(x1^2-x2^2))^2 - 0.5
 fact2 <- (1 + 0.001*(x1^2+x2^2))^2

 y <- 0.5 + fact1/fact2
 return(y)
}

gradient_descent <- function(func, step, niter) { 

  N <- 3 #N- number of random points
  zmienne <- matrix(runif(N*2, min = -100, max = 100), N, 2)
  print(zmienne)
  h = 0.001;
  iter_count = 0;

  for (i in 1:N) {
  x_0 <- zmienne[i,]
  x_n = x_0;

    for (j in 1:niter) {
      func_grad = (func(x_n+h) - func(x_n))/h;
      if (abs(func_grad) < 0.0001) { break; }
      x_n = x_n - step * func_grad;
      print(x_n)
      iter_count = iter_count + 1
    }
  }
return(list(iterations = niter, best_value = func_grad, best_state = x_n, x0=x_0))
    }

solution_m1 <- gradient_descent(schaffer, 0.1, 20)
solution_m1

2 个答案:

答案 0 :(得分:0)

返回不应该在内部循环内部,而是在函数的末尾。

答案 1 :(得分:0)

我认为这就是你想要的:

gradient_descent <- function(func, step, niter) { 

  N <- 3 #N- number of random points
  zmienne <- matrix(runif(N*2, min = -100, max = 100), N, 2)
  print(zmienne)
  h = 0.001;
  iter_count = 0;
  best.vals <- NULL
  for (i in 1:N) {
    x_0 <- zmienne[i,]
    x_n = x_0;

    for (j in 1:niter) {
      func_grad = (func(x_n+h) - func(x_n))/h;
      if (abs(func_grad) < 0.0001) { break; }
      x_n = x_n - step * func_grad;
      print(x_n)
      iter_count = iter_count + 1
    } 
    best.vals <- c(best.vals, func_grad)
  }

  return(list(iterations = iter_count, best_value = best.vals, best_state = x_n, x0=x_0))
}

solution_m1 <- gradient_descent(schaffer, 0.1, 20)
solution_m1