2015-03-24 81 views
0

我在循環函數中存在循環結果問題。它只在循環內計數一次,爲第一個原始數據選擇最佳解決方案,然後停止。在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 2015-03-24 22:01:58

+0

考慮在第一個循環外面用'NA'分配'iterations','best_value','best_state'和'x0',並將最佳結果添加到每行的這些變量中。然後在外循環之外返回一個由'iterations','best_value','best_state'和'x0'組成的列表。 – ConfusedMan 2015-03-24 22:10:32

+0

你能否通過在代碼中添加你的建議來解釋我的修改?我應該添加返回後關閉內循環,然後關閉主循環後? – user3463225 2015-03-24 22:13:32

回答

0

返回不應該在內部循環內部,而是在函數結束時。

+1

@Pascal對不起,但它提供了一個清晰而簡明的答案,「我做錯了什麼?」,除非你認爲我們應該系統地在答案中編寫代碼。儘管我編輯了一些更清晰的內容,但我應該做些什麼。 – cmbarbu 2015-03-25 01:52:44

+0

是的,我們應該提供代碼。否則,這樣的回覆必須寫爲評論。 – 2015-03-25 01:54:37

+0

@Pascal關於這我會錯過的任何文章在計算器策略? – cmbarbu 2015-03-25 02:04:08

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

謝謝,但此代碼爲zmienne的最後一行返回$ best_value = func_grad。我想從all.vals中返回best_value - 在我的情況下,它會是找到全局最小值的最小正值 – user3463225 2015-03-24 22:27:24

+0

如果我正確地理解它,而不是簡單的修復,我更新了該帖子,再試一次。 – Molx 2015-03-24 22:48:02

+0

不完全,因爲現在我有三個最佳值,best_state是一個 - 爲最佳值的最後一個值。我想爲每個點返回best_values - 所以三個最佳值和這些值選擇最好的值 - 最小的正值 - 然後返回best_state = x_n表示最佳值的值,而不是最後一個x_n – user3463225 2015-03-24 22:55:50