Stokastik dinamik programlama - Stochastic dynamic programming

Başlangıçta tarafından tanıtıldı Richard E. Bellman içinde (Bellman 1957 ), stokastik dinamik programlama problemleri modellemek ve çözmek için bir tekniktir belirsizlik altında karar verme. Yakından ilişkili stokastik programlama ve dinamik program Stokastik dinamik programlama, incelenmekte olan sorunu bir Bellman denklemi. Amaç bir hesaplamaktır politika Belirsizlik karşısında nasıl en iyi şekilde hareket edileceğini belirtmek.

Motive edici bir örnek: Kumar oyunu

Bir kumarbazın 2 doları vardır, 4 kez şans oyunu oynamasına izin verilir ve hedefi, en az 6 $ ile bitme olasılığını en üst düzeye çıkarmaktır. Kumarbaz $ bahis yaparsa oyunun bir oyununda, 0.4 olasılıkla oyunu kazanır, ilk bahsi telafi eder ve sermaye pozisyonunu $ arttırır.; 0.6 olasılıkla, bahis tutarı $ 'ı kaybeder; tüm oyunlar ikili bağımsız. Oyunun herhangi bir oyununda kumarbaz, oyunun başında sahip olduğundan daha fazla parayla bahis oynayamaz.[1]

Bu problemi modellemek ve kumarbazın bahis ufkunun sonunda en az 6 $ 'lık bir servet elde etme olasılığını en üst düzeye çıkaran bir bahis stratejisi belirlemek için stokastik dinamik programlama kullanılabilir.

Oynanabilecek oyunların sayısında bir sınır yoksa, sorunun iyi bilinen bir varyant haline geleceğini unutmayın. St.Petersburg paradoksu.

Optimal bahis stratejisi.
Oyuncunun bahis ufkunun sonuna kadar en az 6 $ 'lık bir servet elde etme olasılığını en üst düzeye çıkaran optimal bir bahis stratejisi; oyun için bahis miktarını temsil eder kumarbazın $ 'ı olduğunda o oyunun başında. Karar verici bu politikayı izlerse, 0.1984 olasılıkla en az 6 $ 'lık bir servet elde edecektir.

Resmi arka plan

Üzerinde tanımlanan ayrı bir sistemi düşünün her aşamada ile karakterizedir

  • bir başlangıç ​​hali , nerede aşamanın başlangıcındaki uygulanabilir durumlar kümesidir ;
  • a karar değişkeni , nerede aşamadaki uygulanabilir eylemler dizisidir - Bunu not et başlangıç ​​durumunun bir işlevi olabilir ;
  • bir anında maliyet / ödül işlevi , aşamadaki maliyeti / ödülü temsil eden Eğer başlangıç ​​durumu ve seçilen eylem;
  • a durum geçiş işlevi sistemi devlete götüren .

İzin Vermek aşağıdakileri takip ederek elde edilen optimum maliyeti / ödülü temsil eder optimal politika aşama aşama . Aşağıdakilerde genelliği kaybetmeden bir ödül maksimizasyonu ayarını değerlendireceğiz. Deterministik olarak dinamik program genellikle ilgilenir fonksiyonel denklemler aşağıdaki yapıyı almak

nerede ve sistemin sınır koşulu

Amaç, en üst düzeye çıkaran optimum eylemler kümesini belirlemektir. . Mevcut durum göz önüne alındığında ve mevcut eylem , Biz kesin olarak bil mevcut aşamada ve - durum geçiş işlevi sayesinde güvence altına alınan ödül - sistemin geçiş yapacağı gelecekteki durum.

Ancak uygulamada, mevcut aşamanın başlangıcındaki sistemin durumunu ve alınan kararın ne olduğunu bilsek bile, sistemin sonraki aşama başlangıcındaki durumu ve cari dönem ödülü genellikle rastgele değişkenler bu sadece mevcut aşamanın sonunda gözlemlenebilir.

Stokastik dinamik programlama cari dönem ödülünün ve / veya sonraki dönem durumunun rastgele olduğu problemlerle, yani çok aşamalı stokastik sistemlerle ilgilenir. Karar vericinin amacı, belirli bir planlama ufku boyunca beklenen (indirimli) ödülü maksimize etmektir.

En genel haliyle, stokastik dinamik programlar, aşağıdaki yapıyı alan fonksiyonel denklemlerle ilgilenir.

nerede

  • aşamalar sırasında elde edilebilecek maksimum beklenen ödül , verilen durum aşamanın başında ;
  • sete ait aşamada uygulanabilir eylemlerin verilen başlangıç ​​durumu ;
  • ... indirim faktörü;
  • aşamanın başındaki durumun koşullu olasılığı dır-dir verilen mevcut durum ve seçilen eylem .

Markov karar süreci temelini oluşturan özel bir stokastik dinamik programlar sınıfını temsil eder. Stokastik süreç bir durağan süreç özellikleri Markov özelliği.

Stokastik dinamik bir program olarak kumar oyunu

Kumar oyunu Stokastik Dinamik Program olarak şu şekilde formüle edilebilir: oyunlar (ör. aşamalar) planlama ufkunda

  • durum Dönem içinde dönemin başındaki ilk serveti temsil eder ;
  • aksiyon verilen durum Dönem içinde bahis miktarı ;
  • geçiş olasılığı eyaletten belirtmek ne zaman eylem eyalette alındı bir oyunu kazanma (0.4) veya kaybetme (0.6) olasılığından kolayca türetilir.

İzin Vermek 4. oyunun sonunda oyuncunun $ 'a sahip olduğu göz önüne alındığında, en az 6 $' a sahip olma olasılığı oyunun başında .

  • anlık kar eğer eylem eyalette alındı beklenen değer tarafından verilir .

Türetmek için fonksiyonel denklem, tanımlamak elde eden bir bahis olarak , sonra oyunun başında

  • Eğer hedefe ulaşmak imkansızdır, yani için ;
  • Eğer hedefe ulaşılır, yani için ;
  • Eğer kumarbaz, hedefe ulaşmak için yeterince bahis yapmalıdır, yani için .

İçin fonksiyonel denklem , nerede aralıklar ; amaç bulmak .

Fonksiyonel denklem göz önüne alındığında, optimal bir bahis politikası, aşağıda belirtildiği gibi ileri özyineleme veya geriye dönük özyineleme algoritmaları yoluyla elde edilebilir.

Çözüm yöntemleri

Stokastik dinamik programlar, aşağıdakiler kullanılarak optimum hale getirilebilir: geriye dönük özyineleme veya ileri özyineleme algoritmalar. Memoization tipik olarak performansı artırmak için kullanılır. Ancak, deterministik dinamik programlama gibi, stokastik varyantı da boyutluluk laneti. Bu yüzden yaklaşık çözüm yöntemleri tipik olarak pratik uygulamalarda kullanılır.

Geriye doğru özyineleme

Sınırlı bir durum uzayı verildiğinde, geriye dönük özyineleme (Bertsekas 2000 ) tablo oluşturarak başlar olası her durum için son aşamaya ait . Bu değerler, ilgili optimal duruma bağlı eylemlerle birlikte tablo haline getirildikten sonra sahneye geçmek mümkün ve tablo haline getirin sahneye ait tüm olası durumlar için . Süreç, bir geriye ilkine kadar kalan tüm aşamaları biçimlendirin. Bu çizelge süreci tamamlandığında, - başlangıç ​​durumuna göre optimal bir politikanın değeri - ve ilgili optimal eylem tablodan kolaylıkla alınabilir. Hesaplama geriye doğru bir şekilde ilerlediğinden, geriye doğru özyinelemenin, hesaplanması için gerekli olmayan çok sayıda durumun hesaplanmasına yol açabileceği açıktır. .

Örnek: Kumar oyunu

İleri özyineleme

Başlangıç ​​durumu göz önüne alındığında 1. periyodun başında sistemin, ileri özyineleme (Bertsekas 2000 ) hesaplar fonksiyonel denklemi aşamalı olarak genişleterek (doğrudan geçiş). Bu, herkes için özyinelemeli çağrıları içerir verilen bir hesaplamak için gerekli . Optimal bir politikanın değeri ve yapısı daha sonra bir (geri geçiş) askıya alınan özyinelemeli çağrıların çözüldüğü. Geriye doğru özyinelemeden önemli bir fark, yalnızca hesaplanmasıyla ilgili durumlar için hesaplanır . Memoization halihazırda dikkate alınmış durumların yeniden hesaplanmasını önlemek için kullanılır.

Örnek: Kumar oyunu

Önceden tartışılan Kumar oyunu örneği bağlamında ileri yinelemeyi göstereceğiz. Başlıyoruz doğrudan geçiş dikkate alarak

Bu noktada henüz hesaplamadık hesaplamak için gerekli olan ; devam ediyor ve bu öğeleri hesaplıyoruz. Bunu not et bu nedenle kaldıraç kullanılabilir hafızaya alma ve gerekli hesaplamaları yalnızca bir kez yapın.

Hesaplama

Şimdi hesapladık hepsi için hesaplamak için gerekli . Ancak bu, aşağıdakileri içeren ek askıya alınmış yinelemelere yol açmıştır: . Devam ediyor ve bu değerleri hesaplıyoruz.

Hesaplama

4. aşama sistemimizdeki son aşama olduğundan, temsil etmek sınır şartları bunlar aşağıdaki gibi kolayca hesaplanır.

Sınır şartları

Bu noktada, optimal politikayı ve değerini bir geri geçiş dahil olmak üzere ilk aşamada 3

Geriye doğru geçiş

ve sonra 2. aşama.

Geriye doğru geçiş

Sonunda değeri geri kazandık optimal bir politikanın

Bu, daha önce gösterilen optimal politikadır. Aynı optimum değere götüren birden çok optimum politika olduğunu unutmayın ; örneğin, ilk oyunda 1 $ veya 2 $ bahis yapılabilir.

Python uygulaması. Takip eden tam bir Python bu örneğin uygulanması.

itibaren yazıyor ithalat Liste, Tupleithalat hatırlamak gibi memithalat functools sınıf hatırlamak:         def __içinde__(kendini, işlev):         kendini.işlev = işlev         kendini.ezberlenmiş = {}         kendini.method_cache = {}     def __telefon etmek__(kendini, *argümanlar):         dönüş kendini.cache_get(kendini.ezberlenmiş, argümanlar,             lambda: kendini.işlev(*argümanlar))     def __almak__(kendini, obj, objtype):         dönüş kendini.cache_get(kendini.method_cache, obj,             lambda: kendini.__sınıf__(functools.kısmi(kendini.işlev, obj)))     def cache_get(kendini, önbellek, anahtar, işlev):         Deneyin:             dönüş önbellek[anahtar]         dışında KeyError:             önbellek[anahtar] = işlev()             dönüş önbellek[anahtar]         def Sıfırla(kendini):        kendini.ezberlenmiş = {}         kendini.method_cache = {} sınıf Durum:    kumarbazın yıkım sorununun durumu    '''    def __içinde__(kendini, t: int, servet: yüzen):        '' 'durum kurucusu        Argümanlar:            t {int} - dönem            servet {float} - ilk servet        '''        kendini.t, kendini.servet = t, servet    def __eq__(kendini, diğer):         dönüş kendini.__dict__ == diğer.__dict__    def __str__(kendini):        dönüş str(kendini.t) + " " + str(kendini.servet)    def __hash__(kendini):        dönüş karma(str(kendini))sınıf Kumarbazlar:    def __içinde__(kendini, bahis:int, targetWealth: yüzen, pmf: Liste[Liste[Tuple[int, yüzen]]]):        kumarbazın mahvetme sorunu        Argümanlar:            betHorizon {int} - bahis ufku            targetWealth {float} - hedef servet            pmf {List [List [Tuple [int, float]]]} - olasılık kütle fonksiyonu        '''        # örnek değişkenlerini başlat        kendini.bahis, kendini.targetWealth, kendini.pmf = bahis, targetWealth, pmf        # lambdas        kendini.ag = lambda s: [ben için ben içinde Aralık(0, min(kendini.targetWealth//2, s.servet) + 1)] # eylem oluşturucu        kendini.st = lambda s, a, r: Durum(s.t + 1, s.servet - a + a*r)                       # Devlet geçişi        kendini.iv = lambda s, a, r: 1 Eğer s.servet - a + a*r >= kendini.targetWealth Başka 0      # anında değer işlevi        kendini.cache_actions = {}  Optimum durum / işlem çiftlerine sahip # önbellek    def f(kendini, servet: yüzen) -> yüzen:        s = Durum(0, servet)        dönüş kendini._f(s)    def q(kendini, t: int, servet: yüzen) -> yüzen:        s = Durum(t, servet)        dönüş kendini.cache_actions[str(s)]    @memoize    def _f(kendini, s: Durum) -> yüzen:        #Forward recursion        v = max(            [toplam([p[1]*(kendini._f(kendini.st(s, a, p[0]))                   Eğer s.t < kendini.bahis - 1 Başka kendini.iv(s, a, p[0]))   # gelecekteki değer                  için p içinde kendini.pmf[s.t]])                                     # rastgele değişken gerçekleştirme             için a içinde kendini.ag(s)])                                             # hareketler        opt_a = lambda a: toplam([p[1]*(kendini._f(kendini.st(s, a, p[0]))                                Eğer s.t < kendini.bahis - 1 Başka kendini.iv(s, a, p[0]))                                için p içinde kendini.pmf[s.t]]) == v                  q = [k için k içinde filtre(opt_a, kendini.ag(s))]                              # en iyi eylem listesini al        kendini.cache_actions[str(s)]=q[0] Eğer bool(q) Başka Yok                    # sözlüğe bir eylem kaydedin                dönüş v                                                                # geri dönüş değeriörnek = {"bahisHorizon": 4, "targetWealth": 6, "pmf": [[(0, 0.6),(2, 0.4)] için ben içinde Aralık(0,4)]}gr, initial_wealth = Kumarbazlar(**örnek), 2# f_1 (x), kumarbazın bahisin sonunda $ targetWealth elde etme olasılığıdırYazdır("f_1 ("+str(initial_wealth)+"): " + str(gr.f(initial_wealth))) # 2. periyodun başlangıcındaki ilk servet 1 dolar olduğunda 2. periyot için en uygun eylemi kurtarın.t, initial_wealth = 1, 1Yazdır("b_"+str(t+1)+"("+str(initial_wealth)+"): " + str(gr.q(t, initial_wealth)))

Java uygulaması. KumarbazlarRuin.java bağımsızdır Java 8 yukarıdaki örneğin uygulanması.

Yaklaşık dinamik programlama

Giriş yaklaşık dinamik programlama Tarafından sağlanmaktadır (Powell 2009 ).

daha fazla okuma

  • Bellman, R. (1957), Dinamik program, Princeton University Press, ISBN  978-0-486-42809-3. Dover ciltsiz baskısı (2003).
  • Ross, S. M .; Bimbaum, Z. W .; Lukacs, E. (1983), Stokastik Dinamik Programlamaya Giriş, Elsevier, ISBN  978-0-12-598420-1.
  • Bertsekas, D.P. (2000), Dinamik Programlama ve Optimal Kontrol (2. baskı), Athena Scientific, ISBN  978-1-886529-09-0. İki cilt halinde.
  • Powell, W. B. (2009), "Yaklaşık dinamik programlama hakkında bilmeniz gerekenler", Deniz Araştırma Lojistiği, 56 (1): 239–249, CiteSeerX  10.1.1.150.1854, doi:10.1002 / nav.20347

Ayrıca bakınız

Referanslar

  1. ^ Bu problem W. L. Winston, Operations Research: Applications and Algorithms (7. Baskı), Duxbury Press, 2003, böl. 19, örnek 3.