本篇請結合課本Reinforcement Learning: An Introduction學習
Jack's Car Rental是一個經典的應用馬爾可夫決策過程的問題,翻譯過來,我們就直接叫它“租車問題”吧。租車問題的描述如下:
Jack’s Car Rental Jack manages two locations for a nationwide car rental company. Each day, some number of customers arrive at each location to rent cars. If Jack has a car available, he rents it out and is credited $10 by the national company. If he is out of cars at that location, then the business is lost.
Cars become available for renting the day after they are returned. To help ensure that cars are available where they are needed, Jack can move them between the two locations overnight, at a cost of $2 per car moved.
We assume that the number of cars requested and returned at each location are Poisson random variables, where λ is the expected number.
Suppose λ is 3 and 4 for rental requests at the first and second locations and 3 and 2 for returns.
To simplify the problem slightly, we assume that there can be no more than 20 cars at each location (any additional cars are returned to the nationwide company, and thus disappear from the problem) and a maximum of five cars can be moved from one location to the other in one night. We take the discount rate to be γ = 0.9 and formulate this as a continuing finite MDP, where the time steps are days, the state is the number of cars at each location at the end of the day, and the actions are the net numbers of cars moved between the two locations overnight.
簡單描述一下:
Jack有兩個租車點,1號租車點和2號租車點,每個租車點最多可以停放20輛車。Jack每租車去一輛車可以獲利10美金,每天租出去的車與收回的車的數量服從泊松分布。每天夜里,Jack可以在兩個租車點間進行車輛調配,每晚最多調配5輛車,且每輛車花費2美金。1號租車點租車數量服從$ \lambda = 3 $的泊松分布,回收數量的$ \lambda = 3 $。二號租車點的租車數量和回收數量的$ \lambda $分別為4和2,試問使用什么樣的調配策略可以使得盈利最優化(注意:這里的租車行為與回收行為是強制性的,是不可選擇的)。
簡單分析一下,每個租車點最多20輛車,那么狀態數量就是21*21 = 441個。最多調配5輛車,那么動作集合A = {(-5, 5), (-4, 4),...,(0, 0), (1, -1),...,(5, -5)},動作集合A中的元素表示方法為(1號租車點出入車輛,2號租車點出入車輛),正負號分別表示“入”和“出”。
獎勵期望的計算
首先來看一下動作獎勵期望如何計算, 我們以動作后狀態,1號租車點有10輛車為例:

可以肯定的是當前狀態S1經過Action選擇后的狀態是唯一的,也就說對所有的未來可能狀態來說$ P(s'|a, s) = 1 $。我們先不考慮由動作影響而造成的負收益(調配車輛的花費),而是着重計算,不論任何一個動作,只要到達狀態“1號租車點有10輛車”所獲得的收益期望,這樣再減去每個動作引起的調配車輛的費用,就是該動作的獎勵期望。
考慮狀態“1號租車點有10輛車”的未來可能獲得收益需要分析在保有10輛車的情況下的租(Rent)與回收(Return)的行為。計算該狀態收益的過程實際上是另外一個動作策略符合泊松分布的馬爾可夫決策過程。我們將1天內可能發生的Rent與Return行為記錄為[#Return #Rent],其中“#Return”表示一天內回收的車輛數,“#Rent”表示租出的的車輛數,設定這兩個指標皆不能超過20(理論上來說,進出車輛並不發生在同一時間,這兩個指標實際為流量指標,狀態每刻不超過20輛即可,但這樣有違該題的初衷,且在$ \lambda = 3 $的情況下並沒有太大意義,所以直接這樣規定了)。假設當天早上,1號租車點里有10輛車,那么在傍晚清點的時候,可能保有的車輛數為0~20輛。如果傍晚關門歇業時還剩0輛車,那么這一天的租收行為$ A_{rt, rn} $可以是:
$$ A_{rt,rn} = \left[\begin{matrix}10 & 0\\ 11 & 1\\12& 2\\...&...\\20 & 10 \end{matrix} \right] $$
可以確定的是,Rent與Return是相互獨立的行為或事件且皆服從泊松分布,所以要計算某個行為出現的概率直接將$ P(A_{rt}) $與$ P_(A_{rn}) $相乘就行了,但這里要計算的是條件概率,即為$ P(A_{rt,rn}|S'' = 0) $,所以還需要再與$ P(S'' = 0) $相除,這里的$ P(S'' = 0) $指的是傍晚清點時還剩0輛車的概率。各個租收行為所獲得的收益是以租出去的車輛數為准,所以當傍晚還剩0輛車時,這一天的收益期望可以寫為:
$$ R(S' = 10|S'' = 0) = 10\left[\begin{matrix} \frac{P(A_{rt} = 10)P(A_{rn} = 0)}{P(S'' = 0)} \\...\\ \frac{P(A_{rt} = 20)P(A_{rn} = 10)}{P(S'' = 0)} \end{matrix} \right]^T \left[\begin{matrix} 10\\11\\...\\20 \end{matrix} \right] $$
其中$ P(S'' = 0) $可以寫為:
$$ P(S'' = 0) = \sum P(A_{rt})P(A_{rn}) $$
在計算出矩陣$ R(S' = 10|S'' = {0, 1,...,20}) $后,在進行加權平均,即可得到狀態“1號租車點有10輛車”的獎勵期望$ R(S' = 10) $
$$ R(S' = 10) = P(S'' = {0, 1,..., 20}) R^T(S' = 10|S'' = 0)$$
兩個租車點,所有的狀態按上述方法計算后,即可得出兩個租車點的獎勵矩陣$\begin{matrix} [R_1(S') & R_2(S')] \end{matrix}$。在計算出獎勵矩陣后,這個問題就變成了bandit問題的變種,bandit問題是一個動作固定對應一個未來的狀態,而這里雖然也是這樣,不過所對應的狀態卻要以當前狀態為基礎進行計算得出,還是有些不同,所以稱為bandit問題的一個變種。
基本算法——Policy-Evaluation & Policy-Improvement
這里所用到的主要解決方法為動態編程(DP)里的Policy-Evaluation和Policy-Improvement,我會先用Policy-Evaluation + Softmax求解一次,再用Policy-Evaluation + Policy-Improvement求解一次。這里先給出Policy-Evaluation + Softmax的算法流程:
- 計算獎勵矩陣,初始化Q矩陣和V矩陣
- 進入迭代循環
- 將當前狀態轉變為1號與2號租車點的保有車輛數[#Car1 #Car2]
- 帶入動作集合計算找出可能的未來狀態S’與可執行的動作PossibleAction
- 用式子$ Q(S, \mathrm{Possible\ Action}) = R_1(S') + R_2(S') - 2\mathrm{Cost}(Possible\ Action) + \gamma V(S')$計算Q矩陣
- 用式子$ V(S) = \pi(S, A)Q^T(S) $更新V矩陣
- Softmax優化$ \pi(S, A) $: $$ \pi(S) = \frac{\exp{Q(S)}}{\sum \exp(Q(S, A))} $$
- 計算收斂程度,如果已收斂,退出循環;未收斂,繼續迭代循環
Policy-Evaluation + Softmax的特點是將Softmax優化動作選擇策略嵌入到迭代過程中去,這樣好處是可以迅速的計算出較優的動作選擇策略(在V值收斂之前),但不能保證是最優的。這中方法實際上叫Value-Iteration,是一種有策略的自更新policy的算法,大的框架還是policy-evaluation的,這一點並沒有太大改變。
Policy-Improvement是將已有的動作選擇策略$\pi(S, A)$和V矩陣帶入與最優值進行比較,從而將$\pi(S, A)$跟新為最優。下面我們來看Policy-Improvement的算法流程,再將其與Policy-Evaluation結合起來:
- 初始化Q矩陣,將計算好的V矩陣與策略$ \pi(S, A) $帶入狀態循環中(每一個狀態計算一遍)
- 將當前狀態轉變為1號與2號租車點的保有車輛數[#Car1 #Car2]
- 帶入動作集合計算找出可能的未來狀態S’與可執行的動作PossibleAction
- 用式子$ Q(S, \mathrm{Possible\ Action}) = R_1(S') + R_2(S') - 2\mathrm{Cost}(Possible\ Action) + \gamma V(S')$計算Q矩陣
- 用策略$\pi(S, A)$與$ Q_{max} $所在的動作進行比較,若是不符則令一個flag:Policy_Stable = False
Policy-Evaluation + Policy-Improvement算法:
- 計算獎勵矩陣,初始化Q矩陣與V矩陣
- 判斷Policy_Stable是否為False,如為True則輸出結果$\pi(S,A)$,如為False則進入迭代循環過程。
- 令Policy_Stable = True
- 執行Policy-Evaluation算法
- 執行Policy-Improvement算法,得到Policy_Stable的結果,返回第2步
結果與評價
下面這幅圖表示出了Policy-Improvement策略進化的過程,直到第5次迭代,動作策略最終穩定為最優策略。在這幅圖中,橫軸表示2號租車點的車輛保有量,縱軸表示1號租車點的車輛保有量,圖上的顏色由藍到綠到黃表示了車輛調配的策略,正負號分別表示從1號調出車輛到2號,從2號調出車輛到1號。

從第1次迭代的策略到第5次迭代的策略分別去測試Jack平均每日的實際收益,測試以10000日為基准(我並不是很清楚這里的第三次迭代的結果為何比第四次還要好,但最終的穩定后的策略是最優的):
| 迭代次數 | 實際每日收益 |
| 0(無策略) | $38 |
| 1 | $42.5 |
| 2 | $43.7 |
| 3 | $44.9 |
| 4 | $44.3 |
| 5 | $45.2 |
