Стохастическое динамическое программирование - Stochastic dynamic programming

Первоначально представленный Ричард Э. Беллман в (Беллман 1957 ), стохастическое динамическое программирование это методика моделирования и решения проблем принятие решений в условиях неопределенности. Близко к стохастическое программирование и динамическое программирование, стохастическое динамическое программирование представляет исследуемую задачу в виде Уравнение беллмана. Цель состоит в том, чтобы вычислить политика предписывая, как действовать оптимально в условиях неопределенности.

Наглядный пример: азартная игра.

У игрока есть 2 доллара, ему разрешается сыграть в азартную игру 4 раза, и ее цель - максимизировать вероятность того, что она закончит с минимум 6 долларами. Если игрок ставит $ в ходе игры, то с вероятностью 0,4 она выигрывает игру, возвращает первоначальную ставку и увеличивает свою позицию капитала на $; с вероятностью 0,6 она проигрывает сумму ставки $; все пьесы попарно независимые. При любом ходе игры игрок не имеет права ставить больше денег, чем он имел в начале этой игры.[1]

Стохастическое динамическое программирование может использоваться для моделирования этой проблемы и определения стратегии ставок, которая, например, максимизирует вероятность игрока достичь состояния по крайней мере в 6 долларов к концу горизонта ставок.

Обратите внимание, что если нет ограничения на количество игр, в которые можно играть, проблема становится вариантом хорошо известного Петербургский парадокс.

Оптимальная стратегия ставок.
Оптимальная стратегия ставок, которая максимизирует вероятность игрока достичь состояния не менее 6 долларов к концу горизонта ставок; представляет собой сумму ставки на игру когда у игрока есть $ в начале пьесы. Если лицо, принимающее решения, будет следовать этой политике, с вероятностью 0,1984 он достигнет состояния не менее 6 долларов.

Формальный фон

Рассмотрим дискретную систему, заданную на этапы, в которых каждый этап характеризуется

  • ан начальное состояние , куда набор возможных состояний в начале этапа ;
  • а переменная решения , куда набор возможных действий на этапе - Обратите внимание, что может быть функцией начального состояния ;
  • ан функция немедленных затрат / вознаграждения , представляющий стоимость / вознаграждение на этапе если начальное состояние и выбранное действие;
  • а функция перехода между состояниями что ведет систему к состоянию .

Позволять представляют собой оптимальную стоимость / вознаграждение, полученное при соблюдении оптимальная политика по этапам . Без потери общности в дальнейшем мы рассмотрим настройку максимизации вознаграждения. В детерминированном динамическое программирование обычно имеют дело с функциональные уравнения принимая следующую структуру

куда а граничное условие системы

Цель состоит в том, чтобы определить набор оптимальных действий, которые максимизируют . Учитывая текущее состояние и текущее действие , мы знать с уверенностью вознаграждение, полученное на текущем этапе, и - благодаря функции перехода между состояниями - будущее состояние, к которому переходит система.

На практике, однако, даже если мы знаем состояние системы в начале текущего этапа, а также принятое решение, состояние системы в начале следующего этапа и вознаграждение за текущий период часто случайные переменные что можно наблюдать только в конце текущего этапа.

Стохастическое динамическое программирование имеет дело с проблемами, в которых вознаграждение текущего периода и / или состояние следующего периода являются случайными, то есть с многоступенчатыми стохастическими системами. Цель лица, принимающего решения, - максимизировать ожидаемое (дисконтированное) вознаграждение в течение заданного горизонта планирования.

В самом общем виде стохастические динамические программы имеют дело с функциональными уравнениями, имеющими следующую структуру

куда

  • это максимальная ожидаемая награда, которую можно получить на этапах , учитывая состояние в начале этапа ;
  • принадлежит набору возможных действий на этапе данное начальное состояние ;
  • это коэффициент дисконтирования;
  • - условная вероятность того, что состояние в начале этапа является учитывая текущее состояние и выбранное действие .

Марковский процесс принятия решений представляют собой особый класс стохастических динамических программ, в которых лежащие в основе случайный процесс это стационарный процесс это показывает Марковская собственность.

Азартная игра как стохастическая динамическая программа

Азартную игру можно сформулировать как стохастическую динамическую программу следующим образом: есть игры (т.е. этапы) в горизонте планирования

  • то государственный в период представляет собой начальное богатство в начале периода ;
  • то действие данное состояние в период это сумма ставки ;
  • то вероятность перехода от государства заявить когда действие принимается в состоянии легко выводится из вероятности выигрыша (0,4) или проигрыша (0,6) игры.

Позволять - вероятность того, что к концу игры 4 у игрока будет не менее 6 долларов, при условии, что у него есть в начале игры .

  • то немедленная прибыль понесено, если действие принимается в состоянии дается ожидаемым значением .

Чтобы получить функциональное уравнение, определять как ставка, которая достигает , затем в начале игры

  • если невозможно достичь цели, т.е. за ;
  • если цель достигнута, т.е. за ;
  • если игрок должен сделать ставку, достаточную для достижения цели, т.е. за .

За функциональное уравнение , куда колеблется в ; цель найти .

Учитывая функциональное уравнение, оптимальную политику ставок можно получить с помощью алгоритмов прямой рекурсии или обратной рекурсии, как описано ниже.

Методы решения

Стохастические динамические программы могут быть оптимально решены с помощью обратная рекурсия или же прямая рекурсия алгоритмы. Мемоизация обычно используется для повышения производительности. Однако, как и детерминированное динамическое программирование, его стохастический вариант страдает проклятие размерности. По этой причине приближенные методы решения обычно используются в практических приложениях.

Обратная рекурсия

Учитывая ограниченное пространство состояний, обратная рекурсия (Бертсекас 2000 ) начинается с табулирования для каждого возможного состояния принадлежащий к финальной стадии . После того, как эти значения занесены в таблицу вместе с соответствующими оптимальными действиями, зависящими от состояния , можно перейти на сцену и свести в таблицу для всех возможных состояний, принадлежащих сцене . Процесс продолжается рассмотрением в назад модифицируйте все оставшиеся этапы вплоть до первого. После завершения процесса табуляции - значение оптимальной политики при начальном состоянии - а также соответствующее оптимальное действие можно легко извлечь из таблицы. Поскольку вычисление происходит в обратном порядке, очевидно, что обратная рекурсия может привести к вычислению большого количества состояний, которые не являются необходимыми для вычисления .

Пример: азартная игра.

Прямая рекурсия

Учитывая начальное состояние системы в начале периода 1, прямая рекурсия (Бертсекас 2000 ) вычисляет путем постепенного расширения функционального уравнения (пас вперед). Это включает рекурсивные вызовы для всех которые необходимы для вычисления данного . Затем значение оптимальной политики и ее структура извлекаются через (обратный проход), в котором разрешаются эти приостановленные рекурсивные вызовы. Ключевым отличием от обратной рекурсии является то, что вычисляется только для состояний, релевантных для вычисления . Мемоизация используется, чтобы избежать пересчета состояний, которые уже были рассмотрены.

Пример: азартная игра.

Мы проиллюстрируем прямую рекурсию в контексте ранее обсужденного экземпляра азартной игры. Мы начинаем пас вперед С учетом

На данный момент мы еще не вычислили , которые необходимы для вычисления ; мы продолжаем и вычисляем эти элементы. Обратите внимание, что , поэтому можно использовать мемоизация и выполнить необходимые вычисления только один раз.

Расчет

Мы вычислили для всех которые необходимы для вычисления . Однако это привело к дополнительным приостановленным рекурсиям, связанным с . Мы продолжаем и вычисляем эти значения.

Расчет

Поскольку этап 4 - последний этап в нашей системе, представлять граничные условия которые легко вычисляются следующим образом.

Граничные условия

На этом этапе можно продолжить и восстановить оптимальную политику и ее значение с помощью обратный проход включающий, в первую очередь, этап 3

Обратный проход с участием

а затем этап 2.

Обратный проход с участием

Наконец-то восстанавливаем значение оптимальной политики

Это оптимальная политика, которая была проиллюстрирована ранее. Обратите внимание, что существует несколько оптимальных политик, ведущих к одному и тому же оптимальному значению. ; например, в первой игре можно поставить либо 1 доллар, либо 2 доллара.

Реализация Python. Следующее - полное Python реализация этого примера.

из набор текста импорт Список, Кортежимпорт запоминать в качестве мемимпорт functools учебный класс запоминать:         def __в этом__(себя, func):         себя.func = func         себя.памятный = {}         себя.method_cache = {}     def __вызов__(себя, *аргументы):         возвращаться себя.cache_get(себя.памятный, аргументы,             лямбда: себя.func(*аргументы))     def __получать__(себя, объект, objtype):         возвращаться себя.cache_get(себя.method_cache, объект,             лямбда: себя.__учебный класс__(functools.частичный(себя.func, объект)))     def cache_get(себя, тайник, ключ, func):         пытаться:             возвращаться тайник[ключ]         Кроме KeyError:             тайник[ключ] = func()             возвращаться тайник[ключ]         def перезагрузить(себя):        себя.памятный = {}         себя.method_cache = {} учебный класс Состояние:    '' состояние проблемы разорения игрока    '''    def __в этом__(себя, т: int, богатство: плавать):        '' 'конструктор состояний        Аргументы:            t {int} - период времени            богатство {float} - начальное богатство        '''        себя.т, себя.богатство = т, богатство    def __eq__(себя, Другой):         возвращаться себя.__dict__ == Другой.__dict__    def __str__(себя):        возвращаться ул(себя.т) + " " + ул(себя.богатство)    def __hash__(себя):        возвращаться хэш(ул(себя))учебный класс GamblersRuin:    def __в этом__(себя, ставкиГоризонт:int, targetWealth: плавать, pmf: Список[Список[Кортеж[int, плавать]]]):        проблема разорения игрока        Аргументы:            bettingHorizon {int} - горизонт ставок            targetWealth {float} - целевое богатство            pmf {List [List [Tuple [int, float]]]} - функция массы вероятности        '''        # инициализировать переменные экземпляра        себя.ставкиГоризонт, себя.targetWealth, себя.pmf = ставкиГоризонт, targetWealth, pmf        # лямбды        себя.аг = лямбда s: [я за я в классифицировать(0, мин(себя.targetWealth//2, s.богатство) + 1)] # генератор действий        себя.ул = лямбда s, а, р: Состояние(s.т + 1, s.богатство - а + а*р)                       # переход состояния        себя.iv = лямбда s, а, р: 1 если s.богатство - а + а*р >= себя.targetWealth еще 0      # функция немедленного значения        себя.cache_actions = {}  # кеш с оптимальными парами состояние / действие    def ж(себя, богатство: плавать) -> плавать:        s = Состояние(0, богатство)        возвращаться себя._f(s)    def q(себя, т: int, богатство: плавать) -> плавать:        s = Состояние(т, богатство)        возвращаться себя.cache_actions[ул(s)]    @memoize    def _f(себя, s: Состояние) -> плавать:        # Прямая рекурсия        v = Максимум(            [сумма([п[1]*(себя._f(себя.ул(s, а, п[0]))                   если s.т < себя.ставкиГоризонт - 1 еще себя.iv(s, а, п[0]))   # будущая стоимость                  за п в себя.pmf[s.т]])                                     # реализация случайных величин             за а в себя.аг(s)])                                             # действие        opt_a = лямбда а: сумма([п[1]*(себя._f(себя.ул(s, а, п[0]))                                если s.т < себя.ставкиГоризонт - 1 еще себя.iv(s, а, п[0]))                                за п в себя.pmf[s.т]]) == v                  q = [k за k в фильтр(opt_a, себя.аг(s))]                              # получить список лучших действий        себя.cache_actions[ул(s)]=q[0] если bool(q) еще Никто                    # сохранить действие в словаре                возвращаться v                                                                # возвращаемое значениепример = {"bettingHorizon": 4, "targetWealth": 6, "pmf": [[(0, 0.6),(2, 0.4)] за я в классифицировать(0,4)]}гр, initial_wealth = GamblersRuin(**пример), 2# f_1 (x) - вероятность игрока достичь $ targetWealth в конце ставки.Распечатать("f_1 ("+ул(initial_wealth)+"): " + ул(гр.ж(initial_wealth))) # Восстановите оптимальное действие для периода 2, когда начальное богатство в начале периода 2 составляет 1 доллар.т, initial_wealth = 1, 1Распечатать("b_"+ул(т+1)+"("+ул(initial_wealth)+"): " + ул(гр.q(т, initial_wealth)))

Реализация на Java. GamblersRuin.java автономный Java 8 реализация приведенного выше примера.

Примерное динамическое программирование

Введение в приблизительное динамическое программирование предоставляется (Пауэлл 2009 ).

дальнейшее чтение

  • Беллман, Р. (1957), Динамическое программирование, Издательство Принстонского университета, ISBN  978-0-486-42809-3. Дуврское издание в мягкой обложке (2003 г.).
  • Росс, С. М .; Bimbaum, Z. W .; Лукач, Э. (1983), Введение в стохастическое динамическое программирование, Эльзевьер, ISBN  978-0-12-598420-1.
  • Бертсекас, Д. П. (2000), Динамическое программирование и оптимальное управление (2-е изд.), Athena Scientific, ISBN  978-1-886529-09-0. В двух томах.
  • Пауэлл, В. Б. (2009), "Что следует знать о приблизительном динамическом программировании", Логистика военно-морских исследований, 56 (1): 239–249, CiteSeerX  10.1.1.150.1854, Дои:10.1002 / nav.20347

Смотрите также

Рекомендации

  1. ^ Эта проблема адаптирована из W. L. Winston, Operations Research: Applications and Algorithms (7th Edition), Duxbury Press, 2003, chap. 19, пример 3.