확률론적 동적 프로그래밍

Stochastic dynamic programming

원래 리차드 E에 의해 소개되었다. (Bellman 1957)의 벨만(Bellman 1957)은 확률론적 동적 프로그래밍은 불확실성 속에서 의사결정 문제를 모델링하고 해결하기 위한 기술이다.확률론적 프로그래밍과 동적 프로그래밍과 밀접한 관련이 있는 확률론적 동적 프로그래밍은 벨만 방정식의 형태로 정밀하게 검토 중인 문제를 나타낸다.그 목적은 불확실성 앞에서 어떻게 최적으로 행동할 것인가를 규정하는 정책을 계산하는 것이다.

동기부여 사례: 도박 게임

도박꾼은 2달러를 가지고 있고, 그녀는 4번의 기회 게임을 할 수 있으며, 그녀의 목표는 최소 6달러로 끝날 확률을 극대화하는 것이다.도박꾼이 게임 플레이에 $을(를) 걸면, 0.4 확률로 게임에서 이기고, 초기 베팅을 회수하고, 자본 위치를 $까지 늘리면 0.6 확률로, 그녀는 베팅 금액 $를 잃는다 모든 플레이는 쌍으로 독립적이다.어떤 게임에서든 도박꾼은 그 게임을 시작할 때 그녀가 가진 돈보다 더 많은 돈을 걸지 않을 수도 있다.[1]

확률론적 동적 프로그래밍을 사용하여 이 문제를 모델링하고 예를 들어, 도박자가 베팅 지평선이 끝날 때까지 최소 6달러의 부를 달성할 확률을 최대화하는 베팅 전략을 결정할 수 있다.

게임 횟수에 제한이 없다면 문제는 잘 알려진 세인트루이스의 변종이 된다는 점에 유의한다. 페테르부르크의 역설.

Optimal betting strategy.
도박자가 베팅 지평선 끝까지 최소 6달러의 부를 획득할 확률을 극대화하는 최적의 베팅 전략; t($ ) 는 도박자가 플레이 에 $ x 을(를) 보유할 때 게임 에 대한 베팅 금액을 나타낸다.만약 의사 결정자가 이 정책을 따른다면, 확률 0.1984로 그녀는 적어도 6달러의 부를 얻게 될 것이다.

형식 배경

각 단계 = ,…, 이(가) 특징인 단계에 정의된 이산 시스템을 고려하십시오.

  • 초기 상태 서 S 는 단계 t의 시작 부분에서 실현 가능한 상태의 집합이다
  • 결정 변수 X 서 t 는 단계 에서 실현 가능한 동작의 집합이다 – t 는 초기 상태 t의 일 수 있다.
  • t 이(가) 초기 상태이고 s_이(가) 선택된 경우 단계 t 에서 비용/비용/비용 함수를 나타내는즉시 /비용 함수
  • 시스템을 상태 + = t x )로 이끄는 상태 전환 t{t}, {\.

( ) 으)는 t, + 1, 에 걸쳐 최적의 정책을 따름으로써 얻은 최적의 비용/보상을 나타냄 다음에 오는 것에 있어서 일반성의 손실 없이 우리는 보상 최대화 설정을 고려할 것이다.결정론적 동적 프로그래밍에서는 보통 다음과 같은 구조를 갖는 기능 방정식을 다룬다.

여기서 + = ( , ) 이며 시스템의 경계 조건은 다음과 같다.

목적은 ( 을(를) 최대화하는 최적의 작업 집합을 결정하는 이다 현재의 t {\ s_{ 및 x {\ x_를)를 고려할 때 현재 단계에서 확보된 보상을 확실히 알 수 있다. g – 시스템이 전환되는 미래 상태.

그러나 실제로 우리가 현 단계 초기의 시스템 상태와 취해진 결정을 알고 있다고 하더라도, 다음 단계 초의 시스템 상태와 현 기간 보상은 현 단계 말기에만 관측할 수 있는 임의의 변수인 경우가 많다.

확률론적 동적 프로그래밍은 현재 기간의 보상 및/또는 다음 기간 상태가 무작위인 문제, 즉 다단계 확률론적 시스템을 다룬다.의사결정자의 목표는 주어진 계획 지평선 상에 기대(할인) 보상을 최대화하는 것이다.

가장 일반적인 형태에서 확률론적 동적 프로그램은 다음과 같은 구조를 갖는 기능 방정식을 다룬다.

어디에

  • ( ) 은(는) 단계 , + 1, {\ 중에 얻을 수 있는 최대 기대 보상이며 t 단계 t의 시작 부분에 지정된 이다.
  • 은(는) 상태 에서 설정된 X t ) 에 속함
  • 이(가) 할인 요인임.
  • is the conditional probability that the state at the beginning of stage is given current state and selected action .

마르코프 의사결정 과정은 기초적인 확률적 과정이 마르코프 특성을 특징으로 하는 정지 과정인 특별한 종류의 확률적 동적 프로그램을 나타낸다.

확률적 다이내믹 프로그램으로서의 도박 게임

도박 게임은 다음과 같이 스토크스틱 다이내믹 프로그램으로 공식화할 수 있다: 계획적 지평선에는 = 게임(단계)이 있다.

  • 기간 의 상태 은 기간 의 초기 부를 나타낸다
  • 기간 에서 지정된 상태 은(는) 베팅 b
  • i에서 a을(를) 수행할 때 i {\ i}에서 j displaystyle 으)로의 전환 확률 j}은 한 승리(0.4 또는 패배(0.6) 확률에서 쉽게 도출된다.

f ( ) 을(를) t{\의 시작 부분에 ${\이(가) 있다는 점을 고려할 때, 4 게임이 끝날 때 도박꾼에게 최소 $6가 주어질 확률은 되도록 한다

  • 상태 에서 조치 을(를) 취할 경우 발생하는 즉각적인 이익은 기대값 , b)= t+ 1+ )+ t+ ) 1}(s+.

방정식을 도출하려면 b () 를 = 에 도달하는 베팅으로 정의하십시오

  • < 인 , 목표를 달성하는 것은 불가능하다. 즉, < 에 대해 f (s )= 이(가) 된다
  • 6의 목표가 되는 경우, 6{\ 의
  • 3 s 5 3s\ 5이() 목표를 달성할 수 있을 만큼 도박꾼은 베팅해야 한다. , ≤ 5 에 =

For the functional equation is 여기서 의 는 0 ,s ...,이며 목적은 ( ) 를 찾는 것이다

기능 방정식을 고려할 때, 아래에서 설명한 바와 같이 전방 재귀 또는 후방 재귀 알고리즘을 통해 최적의 베팅 정책을 얻을 수 있다.

솔루션 방법

확률론적 동적 프로그램은 후진 재귀 알고리즘이나 전방 재귀 알고리즘을 사용하여 최적성으로 해결할 수 있다.메모화는 일반적으로 성능을 향상시키기 위해 사용된다.그러나 결정론적 동적 프로그래밍과 마찬가지로 그것의 확률적 변형은 차원성의 저주에 시달린다.이러한 이유로 대략적인 해결방법은 일반적으로 실무적 용도에 사용된다.

후진 재귀

경계된 상태 공간이 주어진 경우, 역방향 재귀(Bertsekas 2000)는 최종 {\}에 속하는 가능한 모든 k{\ k}에 f( k를 표로 작성함으로써 시작된다 일단 이러한 값이 표로 작성되면 관련 최적의 상태 의존적 작업 n) stage - 1 stage - {\}(로 이동할 수 있으며 stage - 1 에 속하는 가능한 모든 상태를 tabulate로하여 를 계속한다.이 표 계산 프로세스가 완료되면 ( ) - 초기 s s에 주어진 최적 정책의 값 - 그리고 관련 최적 작업 ( s )}(을 표에서 쉽게 검색할 수 있다.연산이 후진적으로 진행되기 때문에, 후진 재귀가 1( 의 연산에 필요하지 않은 다수의 상태의 연산으로 이어질 수 있다는 것은 분명하다

예: 도박 게임

전진 재귀

1주기 초에 시스템의 초기 s 을(를) 하여 기능 방정식전방 패스)을 점진적으로 확장하여 ( s 을 계산한다.여기에는 주어진 ( )를 계산하는 데 필요한 모든 f + (⋅ ), f + 2 (⋅),… ),}에 대한 재귀 호출이 포함된다최적 정책의 값과 그 구조는 이러한 보류된 재귀 호출이 해결되는 (후진 패스)를 통해 검색된다.후진 재귀와의 주요 차이점은 이() f 1(s ){\의 계산에 관련된 상태에만 계산된다는 점이다 메모화는 이미 검토된 상태의 재조정을 피하기 위해 채택된다.

예: 도박 게임

우리는 이전에 논의된 도박 게임 사례의 맥락에서 전방 재귀에 대해 설명할 것이다.우리는 f1(2))분{시기에 b성공 확률 1,2,3,4 00.4f2(2+0)+0.6f2(2− 0)10.4f2(2+1)+0.6f2(2− 1)20.4f2(2+2)+0.6f2(2− 2){\displaystyle f_{1}(2)=\min \left\{{\begin{배열}{rr}b&amp을 고려하여,{\t은 앞 패스 시작한다.내선

At this point we have not computed yet , which are needed to compute ; we proceed and compute these items. ( + )= ( - 0)= (2) 2 메모화를 활용하고 필요한 계산을 한 번만 수행할 수 있다.

( ), ( 3), ( ), ( 1), ( ) , f 2 ( ) }(4의 연산

We have now computed for all that are needed to compute . However, this has led to additional suspended recursions involving }(1{3}(1),0 이러한 값을 계속 계산한다.

( 4), ( ), ( 2), f ( ), f ( ) , 3 () 의 연산

4단계는 우리 시스템의 마지막 단계인 만큼 f () )는 다음과 같이 쉽게 계산되는 경계 조건을 나타낸다.

경계 조건

이 시점에서 3단계를 포함하는 역방향 패스를 통해 최적의 정책과 그 가치를 계속 회복할 수 있다.

) 을(를) 포함하는 후진 패스

그리고 2단계.

() 을(를) 포함하는 후진 패스

마침내 최적의 정책의 값 (2) {\}(2을 복구함

이것은 앞서 설명한 최적의 정책이다.예를 들어, 첫 번째 게임에서 1달러 또는 베팅이 있을 수 있는 동일한 최적값 =

Python 구현.다음은 이 예제의 완전한 파이썬 구현이다.

로부터 타자 치기 수입하다 리스트, 투플레 수입하다 메모하다 로서 밈 수입하다 펑토스   계급 메모하다:           반항하다 __init___(자아의, 펑크):          자아의.펑크 = 펑크          자아의.메모한 = {}          자아의.method_properties = {}       반항하다 __call__(자아의, *아그):          돌아오다 자아의.cache_get(자아의.메모한, 아그,              람다: 자아의.펑크(*아그))       반항하다 __get___(자아의, 오비지, 오비타이프):          돌아오다 자아의.cache_get(자아의.method_properties, 오비지,              람다: 자아의.__class___(펑토스.부분적(자아의.펑크, 오비지)))       반항하다 cache_get(자아의, 캐쉬, 핵심을, 펑크):          해보다:              돌아오다 캐쉬[핵심을]          빼고는 키에러:              캐쉬[핵심을] = 펑크()              돌아오다 캐쉬[핵심을]           반항하다 리셋하다(자아의):         자아의.메모한 = {}          자아의.method_properties = {}   계급 주:     '''노름꾼의 파멸 문제의 상태 '''      반항하다 __init___(자아의, t: 인트로, 재산: 둥둥 뜨다):         ''state constructor'          인수: t {int} -- 기간 재산 {filename} -- 초기 재산 '''         자아의.t, 자아의.재산 = t, 재산      반항하다 __eq___(자아의, 타사의):          돌아오다 자아의._____ == 타사의._____      반항하다 __str___(자아의):         돌아오다 발을 동동 구르다(자아의.t) + " " + 발을 동동 구르다(자아의.재산)      반항하다 _____(자아의):         돌아오다 해시하다(발을 동동 구르다(자아의))  계급 갬블러루인:      반항하다 __init___(자아의, 베팅호라이즌:인트로, 타겟뷰티: 둥둥 뜨다, pmf: 리스트[리스트[투플레[인트로, 둥둥 뜨다]]]):         '''노름꾼의 파멸 문제          인수: 베팅Horizon {int} -- 베팅 지평선 표적으로 삼다재산 {float} - 목표 재산 pmf {list[List[Tuple[int, float]]]} -- 확률 질량 함수 '''          # 인스턴스 변수 초기화         자아의.베팅호라이즌, 자아의.타겟뷰티, 자아의.pmf = 베팅호라이즌, 타겟뷰티, pmf          # 람다스         자아의.ag = 람다 s: [i 을 위해 i 에 범위(0, 분(자아의.타겟뷰티//2, s.재산) + 1)] #조치발생기         자아의.세인트 = 람다 s, a, r: 주(s.t + 1, s.재산 - a + a*r)                       # 국가전환         자아의.iv. = 람다 s, a, r: 1 , 만약 s.재산 - a + a*r >= 자아의.타겟뷰티 다른 0      # 즉각적인 가치 함수          자아의.cache_actions = {}  최적의 상태/수행 쌍을 갖춘 # 캐시      반항하다 f(자아의, 재산: 둥둥 뜨다) -> 둥둥 뜨다:         s = 주(0, 재산)         돌아오다 자아의._f(s)      반항하다 q(자아의, t: 인트로, 재산: 둥둥 뜨다) -> 둥둥 뜨다:         s = 주(t, 재산)         돌아오다 자아의.cache_actions[발을 동동 구르다(s)]      @piecize     반항하다 _f(자아의, s: 주) -> 둥둥 뜨다:         #앞으로 재귀         v = 맥스.(             [합계를 내다([p[1]*(자아의._f(자아의.세인트(s, a, p[0]))                    , 만약 s.t < 자아의.베팅호라이즌 - 1 다른 자아의.iv.(s, a, p[0]))   # 미래가치                   을 위해 p 에 자아의.pmf[s.t]])                                     # 임의변수실현              을 위해 a 에 자아의.ag(s)])                                             # 액션          opt_a = 람다 a: 합계를 내다([p[1]*(자아의._f(자아의.세인트(s, a, p[0]))                                 , 만약 s.t < 자아의.베팅호라이즌 - 1 다른 자아의.iv.(s, a, p[0]))                                 을 위해 p 에 자아의.pmf[s.t]]) == v                   q = [k 을 위해 k 에 여과하다(opt_a, 자아의.ag(s))]                              # 베스트 액션 목록 검색         자아의.cache_actions[발을 동동 구르다(s)]=q[0] , 만약 바가지 긁다(q) 다른 없음                    # 사전에 액션을 저장한다.                  돌아오다 v                                                                # 반환값  예시 = {"bettingHorizon": 4, "타겟뷰트": 6, "pmf": [[(0, 0.6),(2, 0.4)] 을 위해 i 에 범위(0,4)]} gr, initial_beature = 갬블러루인(**예시), 2  # f_1(x)은 도박사의 달러 목표 달성 확률베팅 호라이즌의 끝자락 인쇄하다("f_1("+발을 동동 구르다(initial_beature)+"): " + 발을 동동 구르다(gr.f(initial_beature)))   #2주기 초기의 재물이 1달러일 때 2기에 대한 최적의 작용을 회복한다. t, initial_beature = 1, 1 인쇄하다("b_"+발을 동동 구르다(t+1)+"("+발을 동동 구르다(initial_beature)+"): " + 발을 동동 구르다(gr.q(t, initial_beature))) 

Java 구현.GamblersRuin.java는 위의 예를 독립 실행형 Java 8을 구현한 것이다.

근사 동적 프로그래밍

대략적인 동적 프로그래밍에 대한 소개는 (Powell 2009)에 의해 제공된다.

추가 읽기

  • Bellman, R. (1957), Dynamic Programming, Princeton University Press, ISBN 978-0-486-42809-3. 도버 페이퍼백판(2003년).
  • Ross, S. M.; Bimbaum, Z. W.; Lukacs, E. (1983), Introduction to Stochastic Dynamic Programming, Elsevier, ISBN 978-0-12-598420-1.
  • Bertsekas, D. P. (2000), Dynamic Programming and Optimal Control (2nd ed.), Athena Scientific, ISBN 978-1-886529-09-0. 두 권으로.
  • Powell, W. B. (2009), "What you should know about approximate dynamic programming", Naval Research Logistics, 56 (1): 239–249, CiteSeerX 10.1.1.150.1854, doi:10.1002/nav.20347

참고 항목

참조

  1. ^ 이 문제는 W. L. Winston, Operations Research: Applications and Algorithm(7판), Duxbury Press, 2003, chap. 19, 사례 3에서 채택되었다.