随机动态规划,随机库存管理,matlab 代码, c 代码

与一般的动态规划相比,随机动态规划是指 下一阶段的状态是不确定的,每个状态有一定的概率。因此,在计算递推公式时,需要取期望。

确定的动态规划的递推公式:

\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

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页