비전공자라 R을 쓰고있고.. dynamic programming을 해야합니다..
재귀 함수를 쓰는 형태로 알고 있고, 피보나치 수열이나 하노이의 탑 까지는 어찌저찌 풀겠는데요
두 가지가 잘 이해가 안되어서 괴수 형님들께 질문드립니다....
1. backward induction과 재귀함수를 같이 사용하는 구조가 잘 이해가 안되네요.
가령
expected_reward <- function(boxes, ref=NULL, loss_aversion_param=0.1, verbose=TRUE){
n <- length(boxes) # number of boxes remaining
ref <- ifelse(is.null(ref), sum(boxes)/n, ref) # default reference level
# reward if stopping
current <- boxes - loss_aversion_param * (boxes < ref)
current <- sum(current) / n # average
# expected reward if continuing the game
if(n == 1){
next_value <- current # the same if only one box left
} else {
next_value <- 0 # initialize
for(i in 1:n){ # accumulate expected reward component by component
next_value <- next_value + expected_reward(boxes[-i], current, loss_aversion_param, verbose)
} *****************
next_value <- next_value / n # take average
}
...(이하 출력문부분)
일단 ***************** 부분에서 재귀적으로 함수를 호출하는 것 까지는 알겠습니다.
1:T까지 돌리는거는 좋은데, backward induction 예제코드를 for문을 T:1로 돌리더라구요.
이게 구조적으로 T가 마지막 기부터 풀어오겠다는건데, 단순히 T부터 돌리기만해도 최적해가 보장되는건가요...? 이 예제가 지금 적합하지 않긴 한데 적당한 예가 없어서 일단 이거라도 가져왔습니다..
2. 만약 풀어야 하는 해가 여러개여서 행렬구조라면 어떻게 해야할까요?
3. 1번과 2번 관련해서 참고할 수 있는 자료나 링크가 있을까요?
미리 감사합니다..!
려비
gpt돌리면 알려줌 ㅋㅋㅋ
심보고약한놈
DP와 R의 조합이라.. 둘다 답변듣기 힘든 질문의 조합인데? ㅋㅋㅋㅋ
크리스토프발츠
아무리 비전공자라고 해도 왜 굳이 생산성을 위한 하이 레벨 언어인 R을 써서 DP를 고민하는지도 모르겠고...
DP의 핵심은 분할 정복과 메모이제이션인데 왜 재귀함수 형태 얘기가 먼저 나오는지도 모르겠음;
지금 주어진 R 코드가 문제를 분할해서 푼 다음 (분할 정복) 이를 저장해서 다시 사용하도록 (메모이제이션) 되어있는 거임?
DP는 이거 두개부터가 나와야되는데 뭔가 다른게 자꾸 나오는거 같은데..
개붕이는끝
R 코드는 기억도 안 나서 모르겠고ㅋㅋㅋㅋㅋ
목적이 뭔지 알 수도 없어서 코드에 대한 설명은 생략하고
DP에 대한 설명한 하자면
일단 윗댓처럼 DP의 핵심은 분할 정복과 메모이제이션임
분할 정복은 어떤 문제를 작은 문제들로 나누어 해결한 결과로 큰 문제를 해결하고 (분할 정복)
문제들을 해결할 때마다 그 결과를 저장해 중복해서 문제를 푸는 걸 방지하는 것(메모이제이션)
보통 이런 문제가 점화식과 같은 형태를 띄다 보니 쉽게 설명하기 위해 처음에는 재귀함수로 풀어서 보여주는 경우가 많음.
하지만 언어 특성에 따라 다를 수도 있지만 보통은 함수 호출이란 게 상대적으로 무거운 작업이라 반복문으로 바꾸는 경우가 많을 거야
하여튼 요지는 DP를 꼭 재귀로 구현하지 않아도 좋고 개인적으로는 반복문을 이용한 bottom-up 방식으로 해결하는 게 좋다고 봄.
레오레오
R은 잘 모르겠지만 재귀함수로 푸는거면 배열이나 맵같은거에다가 저장해놓고 함수 처음에 체크하고 재귀 돌리기 전에도 체크하면 댐
숨은음은
동적계획법을 논하는 데 재귀가 왜 나옴?
동적계획법이 뭔지 모릅니다 라고 말하는 거랑 똑같은데
백트래킹이 재귀를 쓰는 거지 동적계획법은 재귀쓰는 알고리즘이 아님.
동적계획법은 쉽게 말하자면 문제가 점화식이 존재하는 경우에 대해 사용가능한 알고리즘임.
점화식이 존재한다 = 최적화가 가능한 해가 존재한다 = 고로 최적 알고리즘이 있다임.
점화식이 존재하지 않는다 = 인간이 문제 풀듯이 하나씩 다 찾아봐야 한다 = 최적해가 없다 = 백트래킹이고