프로그래밍

다이나믹 프로그래밍 질문합니다..

비전공자라 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번 관련해서 참고할 수 있는 자료나 링크가 있을까요?

미리 감사합니다..!

6개의 댓글

2023.07.09

gpt돌리면 알려줌 ㅋㅋㅋ

0
2023.07.09

DP와 R의 조합이라.. 둘다 답변듣기 힘든 질문의 조합인데? ㅋㅋㅋㅋ

0

아무리 비전공자라고 해도 왜 굳이 생산성을 위한 하이 레벨 언어인 R을 써서 DP를 고민하는지도 모르겠고...

DP의 핵심은 분할 정복과 메모이제이션인데 왜 재귀함수 형태 얘기가 먼저 나오는지도 모르겠음;

 

지금 주어진 R 코드가 문제를 분할해서 푼 다음 (분할 정복) 이를 저장해서 다시 사용하도록 (메모이제이션) 되어있는 거임?

DP는 이거 두개부터가 나와야되는데 뭔가 다른게 자꾸 나오는거 같은데..

1
2023.07.09

R 코드는 기억도 안 나서 모르겠고ㅋㅋㅋㅋㅋ

목적이 뭔지 알 수도 없어서 코드에 대한 설명은 생략하고

DP에 대한 설명한 하자면

 

일단 윗댓처럼 DP의 핵심은 분할 정복과 메모이제이션임

분할 정복은 어떤 문제를 작은 문제들로 나누어 해결한 결과로 큰 문제를 해결하고 (분할 정복)

문제들을 해결할 때마다 그 결과를 저장해 중복해서 문제를 푸는 걸 방지하는 것(메모이제이션)

 

보통 이런 문제가 점화식과 같은 형태를 띄다 보니 쉽게 설명하기 위해 처음에는 재귀함수로 풀어서 보여주는 경우가 많음.

하지만 언어 특성에 따라 다를 수도 있지만 보통은 함수 호출이란 게 상대적으로 무거운 작업이라 반복문으로 바꾸는 경우가 많을 거야

하여튼 요지는 DP를 꼭 재귀로 구현하지 않아도 좋고 개인적으로는 반복문을 이용한 bottom-up 방식으로 해결하는 게 좋다고 봄.

1
2023.07.10

R은 잘 모르겠지만 재귀함수로 푸는거면 배열이나 맵같은거에다가 저장해놓고 함수 처음에 체크하고 재귀 돌리기 전에도 체크하면 댐

1
2023.07.11

동적계획법을 논하는 데 재귀가 왜 나옴?

동적계획법이 뭔지 모릅니다 라고 말하는 거랑 똑같은데

백트래킹이 재귀를 쓰는 거지 동적계획법은 재귀쓰는 알고리즘이 아님.

 

동적계획법은 쉽게 말하자면 문제가 점화식이 존재하는 경우에 대해 사용가능한 알고리즘임.

점화식이 존재한다 = 최적화가 가능한 해가 존재한다 = 고로 최적 알고리즘이 있다임.

 

점화식이 존재하지 않는다 = 인간이 문제 풀듯이 하나씩 다 찾아봐야 한다 = 최적해가 없다 = 백트래킹이고

1
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
5709 [프로그래밍] 패스트 캠퍼스 <---- 얘내는 가격 인상 원툴임? 3 조강현 0 20 시간 전 221
5708 [프로그래밍] 클라가 파이썬 셀레니움같은거 써서 클릭하고 그러는걸 감지 ... 5 리옴므 0 2 일 전 182
5707 [프로그래밍] leetcode 50일 달성 1 JimmyMcGill 1 2 일 전 156
5706 [프로그래밍] 그냥 개인공부용 git 만들건데 4 년째재수강 0 2 일 전 238
5705 [프로그래밍] html 자바스크립트 질문 19 책걸이 0 2 일 전 290
5704 [프로그래밍] 아니 시바 이게 무슨일이야 4 인간지표 0 3 일 전 306
5703 [프로그래밍] 아두이노 키트 아무것도 모르고 사도 될까? 6 그것 0 3 일 전 253
5702 [프로그래밍] 횽들 Vimeo에 올라가있는 동영상의 원본크기를 확인할 수 있... 13 카뜨만두 0 3 일 전 181
5701 [프로그래밍] c# 이벤트와 델리게이트 13 RX7900XTX 0 6 일 전 304
5700 [프로그래밍] Aws 람다에 파이썬 올려서 결과 받아오는데 11 아르피쥐 0 8 일 전 342
5699 [프로그래밍] 마리아DB mediumtext 그냥 쓰고 싶은데 21 잉텔 0 8 일 전 220
5698 [프로그래밍] 안드로이드 씹뉴비 질문이요 2 집에가게해줘 0 9 일 전 125
5697 [프로그래밍] c언어 7년했는데 이런게 되는거 처음알았음.. 4 케로로중사 0 10 일 전 890
5696 [프로그래밍] 파이썬 1도 모르는데 GPT로 프로그램 뚝딱 만듬 2 푸르딩딩 1 13 일 전 742
5695 [프로그래밍] 담주 면접잡혔는데 8 삐라루꾸 0 13 일 전 499
5694 [프로그래밍] 아두이노 부트로더를 구웠는데.. 4 렙이말한다ㅡ니가옳다 0 14 일 전 233
5693 [프로그래밍] IOS 개발자 있나여? 1 g4eng 0 16 일 전 260
5692 [프로그래밍] 시스템 디자인 인터뷰 준비 도움좀!!! 1 Nognhyup 0 17 일 전 201
5691 [프로그래밍] 최근에 vscode 쓴 사람 도움! 3 172102 0 18 일 전 523
5690 [프로그래밍] 책을 또 사버리고 말았다... 1 찰나생멸 2 18 일 전 523