与一般的动态规划相比,随机动态规划是指 下一阶段的状态是不确定的,每个状态有一定的概率。因此,在计算递推公式时,需要取期望。
确定的动态规划的递推公式:
\begin{equation}f(S_{i})=\max\limits_{x_{i}}\{V(S_{i},x_{i})+f(S_{i+1})\}\end{equation}
而随机的动态规划的递推公式为:
\begin{equation}f(S_{i})=\max\limits_{x_{i}}\{\sum p_{k}V(S_{i},x_{i})+\sum p_{k}f(S_{i+1})\}\end{equation}
其中, p_{k} 表示随机变量取值 的概率, 在随机动态规划中,每一个决策 x_{i} 对应多个 S_{i+1}。
举例,库存管理问题:
3个阶段,初始库存为1,每个阶段的需求随机,需求量以均匀分区在 1 与2 两个数之间取值;最大生产量为4,不能缺货及延迟补货。成本包括:
库存持有成本,生产启动成本,可变生产成本。在第3阶段期末时,可以出售残值。单位残值价值2。其中,单位库存成本为1,生产成本的表达式如下:
\begin{equation}c(x)=\begin{cases} 0\quad &x=0\\ 3+2x &x>0 \end{cases}\end{equation}
上式中,3 表示生产启动成本,2 表示单位可变生产成本。
因此递推公式为:
\begin{equation}f(S_{i})=\begin{cases} \max\limits_{2-S_{i}\leq x_{i}\leq 4}\big\{\sum p_{k}V(S_{i},x_{i})+\sum p_{k}f(S_{i+1})\big\}\quad &i=1,2\\ \sum p_{k}V(S_{i},x_{i}) &i=3 \end{cases}\end{equation}
f(S_{i}) 表示当第 i 阶段初始库存为 S_{i} 时,i, i+1, ..,3 阶段的最小期望总成本。
逆推的 matlab 代码为:
function sdp
T=3;
state=4;
d=[1,2];
prod_cost1=0;
prod_cost2=@(x)3+2*x;
hold_cost=@(i,x)0.5*(i+x-d(1))+0.5*(i+x-d(2));
salv_cost1=0;
salv_cost2=@(i,x)0.5*(i+x-d(1))+0.5*(i+x-d(1));
xx=zeros(T,state);%记录每个阶段每个状态的最优决策
M=100;
CC=M*ones(T,state);%记录每个阶段每个状态的累计最优成本
for t=T:-1:1
for temp_i=1:state
i=temp_i-1;
if t==1
i=1;
end
minc=M;
for x=2-i:4-i
if t==3
salv_cost=salv_cost2(i,x);CC_next=0;
else
salv_cost=salv_cost1;CC_next=0.5*CC(t+1,i+x-d(1)+1)+0.5*CC(t+1,i+x-d(2)+1);
end
if x==0
prod_cost=prod_cost1;
else
prod_cost=prod_cost2(x);
end
temp_c=prod_cost+hold_cost(i,x)-salv_cost+CC_next;
if temp_c<minc
minc=temp_c;CC(t,i+1)=minc; xx(t,i+1)=x;
end
end
if t==1
break;
end
end
end
[eOptimalCost,index]=min(CC(1,:));
fprintf('optimal expected total cost=%.4f\n',eOptimalCost);
fprintf('optimal production amount in period 1 =%d\n',xx(1,index));
end