У игрока есть 2 доллара, ему разрешается сыграть в азартную игру 4 раза, и ее цель - максимизировать вероятность того, что она закончит с минимум 6 долларами. Если игрок ставит $ в ходе игры, то с вероятностью 0,4 она выигрывает игру, возвращает первоначальную ставку и увеличивает свою позицию капитала на $; с вероятностью 0,6 она проигрывает сумму ставки $; все пьесы попарно независимые. При любом ходе игры игрок не имеет права ставить больше денег, чем он имел в начале этой игры.[1]
Стохастическое динамическое программирование может использоваться для моделирования этой проблемы и определения стратегии ставок, которая, например, максимизирует вероятность игрока достичь состояния по крайней мере в 6 долларов к концу горизонта ставок.
Обратите внимание, что если нет ограничения на количество игр, в которые можно играть, проблема становится вариантом хорошо известного Петербургский парадокс.
Оптимальная стратегия ставок, которая максимизирует вероятность игрока достичь состояния не менее 6 долларов к концу горизонта ставок; представляет собой сумму ставки на игру когда у игрока есть $ в начале пьесы. Если лицо, принимающее решения, будет следовать этой политике, с вероятностью 0,1984 он достигнет состояния не менее 6 долларов.
Формальный фон
Рассмотрим дискретную систему, заданную на этапы, в которых каждый этап характеризуется
ан начальное состояние, куда набор возможных состояний в начале этапа ;
а переменная решения, куда набор возможных действий на этапе - Обратите внимание, что может быть функцией начального состояния ;
ан функция немедленных затрат / вознаграждения, представляющий стоимость / вознаграждение на этапе если начальное состояние и выбранное действие;
а функция перехода между состояниями что ведет систему к состоянию .
Позволять представляют собой оптимальную стоимость / вознаграждение, полученное при соблюдении оптимальная политика по этапам . Без потери общности в дальнейшем мы рассмотрим настройку максимизации вознаграждения. В детерминированном динамическое программирование обычно имеют дело с функциональные уравнения принимая следующую структуру
куда а граничное условие системы
Цель состоит в том, чтобы определить набор оптимальных действий, которые максимизируют . Учитывая текущее состояние и текущее действие , мы знать с уверенностью вознаграждение, полученное на текущем этапе, и - благодаря функции перехода между состояниями - будущее состояние, к которому переходит система.
На практике, однако, даже если мы знаем состояние системы в начале текущего этапа, а также принятое решение, состояние системы в начале следующего этапа и вознаграждение за текущий период часто случайные переменные что можно наблюдать только в конце текущего этапа.
Стохастическое динамическое программирование имеет дело с проблемами, в которых вознаграждение текущего периода и / или состояние следующего периода являются случайными, то есть с многоступенчатыми стохастическими системами. Цель лица, принимающего решения, - максимизировать ожидаемое (дисконтированное) вознаграждение в течение заданного горизонта планирования.
В самом общем виде стохастические динамические программы имеют дело с функциональными уравнениями, имеющими следующую структуру
куда
это максимальная ожидаемая награда, которую можно получить на этапах , учитывая состояние в начале этапа ;
принадлежит набору возможных действий на этапе данное начальное состояние ;
Азартная игра как стохастическая динамическая программа
Азартную игру можно сформулировать как стохастическую динамическую программу следующим образом: есть игры (т.е. этапы) в горизонте планирования
то государственный в период представляет собой начальное богатство в начале периода ;
то действие данное состояние в период это сумма ставки ;
то вероятность перехода от государства заявить когда действие принимается в состоянии легко выводится из вероятности выигрыша (0,4) или проигрыша (0,6) игры.
Позволять - вероятность того, что к концу игры 4 у игрока будет не менее 6 долларов, при условии, что у него есть в начале игры .
то немедленная прибыль понесено, если действие принимается в состоянии дается ожидаемым значением .
Чтобы получить функциональное уравнение, определять как ставка, которая достигает , затем в начале игры
если невозможно достичь цели, т.е. за ;
если цель достигнута, т.е. за ;
если игрок должен сделать ставку, достаточную для достижения цели, т.е. за .
За функциональное уравнение , куда колеблется в ; цель найти .
Учитывая функциональное уравнение, оптимальную политику ставок можно получить с помощью алгоритмов прямой рекурсии или обратной рекурсии, как описано ниже.
Методы решения
Стохастические динамические программы могут быть оптимально решены с помощью обратная рекурсия или же прямая рекурсия алгоритмы. Мемоизация обычно используется для повышения производительности. Однако, как и детерминированное динамическое программирование, его стохастический вариант страдает проклятие размерности. По этой причине приближенные методы решения обычно используются в практических приложениях.
Обратная рекурсия
Учитывая ограниченное пространство состояний, обратная рекурсия (Бертсекас 2000 ) начинается с табулирования для каждого возможного состояния принадлежащий к финальной стадии . После того, как эти значения занесены в таблицу вместе с соответствующими оптимальными действиями, зависящими от состояния , можно перейти на сцену и свести в таблицу для всех возможных состояний, принадлежащих сцене . Процесс продолжается рассмотрением в назад модифицируйте все оставшиеся этапы вплоть до первого. После завершения процесса табуляции - значение оптимальной политики при начальном состоянии - а также соответствующее оптимальное действие можно легко извлечь из таблицы. Поскольку вычисление происходит в обратном порядке, очевидно, что обратная рекурсия может привести к вычислению большого количества состояний, которые не являются необходимыми для вычисления .
Пример: азартная игра.
Эта секция нуждается в расширении. Вы можете помочь добавляя к этому. (Январь 2017 г.)
Прямая рекурсия
Учитывая начальное состояние системы в начале периода 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,объект)))defcache_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)defq(себя,т:int,богатство:плавать)->плавать:s=Состояние(т,богатство)возвращатьсясебя.cache_actions[ул(s)]@memoizedef_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.т]])==vq=[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 реализация приведенного выше примера.
Примерное динамическое программирование
Эта секция нуждается в расширении. Вы можете помочь добавляя к этому. (Январь 2017 г.)
Беллман, Р. (1957), Динамическое программирование, Издательство Принстонского университета, ISBN978-0-486-42809-3. Дуврское издание в мягкой обложке (2003 г.).
Росс, С. М .; Bimbaum, Z. W .; Лукач, Э. (1983), Введение в стохастическое динамическое программирование, Эльзевьер, ISBN978-0-12-598420-1.
Бертсекас, Д. П. (2000), Динамическое программирование и оптимальное управление (2-е изд.), Athena Scientific, ISBN978-1-886529-09-0. В двух томах.
Пауэлл, В. Б. (2009), "Что следует знать о приблизительном динамическом программировании", Логистика военно-морских исследований, 56 (1): 239–249, CiteSeerX10.1.1.150.1854, Дои:10.1002 / nav.20347