2015-03-24 3 views
0

У меня проблема с результатами цикла в функции цикла. Он подсчитывает внутренний цикл только один раз и выбирает наилучшее решение для первого raw, а затем останавливается.Петля внутри другого цикла в R

Я хотел бы запомнить лучшее решение для каждой строки матрицы 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 
+0

Можете ли вы предоставить свои данные (или подмножество) се мы можем проверить выход? – Molx

+0

Рассмотрите возможность выделения 'итераций',' best_value', 'best_state' и' x0' с 'NA' вне первого цикла и добавьте лучший результат в эти переменные для каждой строки. Затем верните за пределы внешнего цикла список из 'итераций',' best_value', 'best_state' и' x0'. – ConfusedMan

+0

Можете ли вы объяснить мне изменения, добавив свои советы в код? должен ли я добавить возврат после закрытия внутреннего цикла, а затем после закрытия основного цикла? – user3463225

ответ

0

Возврат не должен находиться внутри внутреннего контура, но в конце функции.

+1

@Pascal Извините, но он дает четкий и краткий ответ на вопрос «что я делаю неправильно?», Если вы не считаете, что мы должны систематически писать код в ответ. Я отредактировал, чтобы уточнить, что делать. – cmbarbu

+0

Да, мы должны предоставить код. В противном случае такой ответ должен быть записан как комментарий. –

+0

@Pascal Любая статья в политике stackoverflow о том, что я бы пропустил? – cmbarbu

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 
+0

Спасибо, но этот код возвращает $ best_value = func_grad для последней строки zmienne. Я хочу вернуть best_value из all.vals - в моем случае это будет самое маленькое положительное значение, чтобы найти глобальный минимум. – user3463225

+0

Если я правильно понял, чем это просто, я обновил сообщение, повторите попытку. – Molx

+0

не совсем так, потому что теперь у меня есть три лучших значения, а best_state - одно - для последнего значения лучших значений. Я хочу вернуть best_values ​​для каждой точки - так что три лучших значения и из этих значений выбирают самый лучший - самый маленький положительный - и затем возвращают best_state = x_n для этого значения наилучшего значения, а не последнего x_n – user3463225

Смежные вопросы