2016-09-13 5 views
0

while 루프가 R의 무한 루프에 걸렸을 때 루프를 인식하는 가장 좋은 방법은 무엇입니까?루프가 무한 동안 종료 됨

diff_val = Inf 
last_val = 0 

while(diff_val > 0.1){ 

    ### calculate val from data subset that is greater than the previous iteration's val 
    val = foo(subset(data, col1 > last_val)) 

    diff_val = abs(val - last_val) ### how much did this change val? 
    last_val = val ### set last_val for the next iteration 
} 

목표는 val가 점점 더 가까이 안정적인 값으로 점진적으로 얻을 것입니다, 그리고 val 마지막 반복에서 val 0.1 내에있을 때, 그것은 충분히있는 것으로 간주 : 여기

내 상황입니다 루프는 while 루프에서 해제됩니다. 내 문제는 일부 데이터 세트에서 val이 두 값 사이에서 앞뒤로 번갈아 붙어 있다는 것입니다. 예를 들어, 27.0에서 27.7 사이에서 앞뒤로 반복합니다. 따라서 결코 안정화되지 않습니다. 루프가 발생하면 어떻게하면 while 루프를 깰 수 있습니까?

나는 break을 알고 있지만 사용법을 알리는 방법을 모른다. 나는 일하는 것이 전에 두 반복의 값 잡고 상상,하지만 난이 반복 전에 값을 유지하는 방법을 알고하지 않습니다 ...

while(diff_val > 0.1){ 

    val = foo(subset(data, col1 > last_val)) 

    diff_val = abs(val - last_val) 
    last_val = val 

    if(val == val_2_iterations_ago) break 
} 

어떻게 val_2_iterations_ago을 만들 수 있습니까?

재현 할 수없는 코드에 사과드립니다. 상황을 복제하는 데 필요한 실제 foo()data은 공유 할 수있는 것이 아니며 제어 흐름을 통해이 문제를 파악하는 데 중요하지 않습니다.

+0

프로세스가 일반적으로 감소합니까? 몇 번이나 (임의의) 한도를 초과 할 때 얼마나 많이 줄어들지 않고 중단되는지 추적 할 수 있습니다. – r2evans

답변

3

이전 두 반복을 추적하는 것이 실제로 충분할 지 모르겠지만 실제로 논리를 추가하는 것은 그리 큰 문제가 아닙니다.

논리는 두 번째에서 마지막 값이 마지막 값이되고 마지막 값이 현재 값이되고 현재 값은 foo()에서 파생됩니다. 당신의 반복을 추적하고 최대를 설정하는 것,

while (diff_val > 0.1) { 
    val <- foo(subset(data, col1 > last_val)) 

    if (val == val_2_iterations_ago) break 

    diff_val = abs(val - last_val) 
    val_2_iterations_ago <- last_val 
    last_val <- val 
} 
+0

그래도 3 가지 이상의 반복되는 값을 가질 수 있습니다. 이것을 설명하기 위해 일반화 할 수 있다면 좋을 것입니다! – CephBirk

2

또 다른 방법, 아마 좀 더 일반적인 :이 코드를 생각해 보자.

팀의 좋은 대답이 페어링이 일반적으로 수행하는 방법을

iter = 0 
max_iter = 1e6 
while (diff_val > 0.1 & iter < max_iter) { 
    val <- foo(subset(data, col1 > last_val)) 

    if (val == val_2_iterations_ago) break 

    diff_val = abs(val - last_val) 
    val_2_iterations_ago <- last_val 
    last_val <- val 
    iter = iter + 1 
} 
2

당신이 가지고있다 :

  • 수렴 허용 오차, 있도록 목적 함수가 상당히 변경하지 않는 경우, 알고리즘이 수렴 된 것으로 간주됩니다.
  • 코드가 결국 종료되도록 보장되는 반복 횟수의 제한
  • A c 목적 함수는 실제로/순환 분기 년대 상황 잡기 위해, 감소 (많은 최적화 알고리즘이 설계 그래서 이런 일이 안된다,하지만 귀하의 경우에 일어날 않음) 것을 도대체

의사 코드 :

oldVal <- Inf 
for(i in 1:NITERS) 
{ 
    val <- objective(x) 
    diffVal <- val - oldVal 
    converged <- (diffVal <= 0 && abs(diffVal) < TOL) 
    if(converged || diffVal > 0) 
     break 
    oldVal <- val 
} 
관련 문제