QQ在线咨询
售前咨询热线
15821572819
售后咨询热线
15821572819

初始库存不为0 时的 Wager Whitin 算法 Matlab 代码


最近读几篇老论文, 发现 Wager-Whitin 算法 在初始库存不为 0 时仍然成立。自己没有想到如何证明。原 wagner whitin的论文上又看了看,似乎证明时没有考虑到初始库存不为0时定理 1 不成立的情况。但经过编程测试,用了五六百个算例,发现仍然成立。此时,最优解有如下特点:

第一个生产周期刚好将初始库存与生产量消化完,之后的阶段仍然满足“”零库存“”性质。


Matlab 代码在下面:


[plain] view plain copy

  1. function MyWW  

  2. % x表示各阶段生产决策,为0-1变量  

  3. % y表示各阶段生产的数量  

  4. % I为各阶段库存水平  

  5. % I0 initial inventory level  

  6.   

  7. I0=50;  

  8. n=8;  

  9.   

  10. % d=randi([5 25],1,n);   

  11. % S=randi([20 100],1,n);   

  12. % h=randi([5 20],1,n);   

  13. % c=randi([10 25],1,n);   

  14.   

  15. d=[9,12,9,25,9,20,20,25];   

  16. S=[100,100,100,100,100,100,100,100];  

  17. h=[5,5,5,5,5,5,5,5];  

  18. c=10*ones(1,n);  

  19.   

  20. x=zeros(1,n);  

  21. y=zeros(1,n);  

  22. I=zeros(1,n);  

  23.   

  24. C=1e4*ones(n,n); %成本矩阵  

  25. opt_cost=zeros(n,1);  

  26. initial_I=zeros(n,1);  

  27. for i=1:n  

  28.     if i>1  

  29.         opt_cost=min(C(:,i-1));  

  30.     end  

  31.     for j=i:n  

  32.         if I0>=sum(d(1:j))  

  33.             if i==1  

  34.                 C(i,j)=h(1:j)*(I0-cumsum(d(i:j)))';  

  35.             else  

  36.                 C(i,j)=opt_cost+h(i:j)*(I0-cumsum(d(i:j)))';  

  37.             end  

  38.         else  

  39.             initial_I(i)=I0;  

  40.             if i>1  

  41.                 if I0>sum(d(1:i-1))  

  42.                     initial_I(i)=I0-sum(d(1:i-1));  

  43.                 else  

  44.                     initial_I(i)=0;  

  45.                 end  

  46.             end  

  47.             prod_amount=sum(d(i:j))-initial_I(i);  

  48.             temp_I=initial_I(i)+prod_amount;  

  49.             h_sum=h(i:j)*(temp_I-cumsum(d(i:j)))';  

  50.             if i>1  

  51.                 C(i,j)=opt_cost+S(i)+h_sum+c(i)*prod_amount;  

  52.             else  

  53.                 C(i,j)=S(i)+h_sum+c(i)*prod_amount;  

  54.             end  

  55.         end  

  56.    end  

  57. end  

  58.   

  59. %back track  

  60. j=n;  

  61. while j>=1  

  62.     [~,index]=min(C(:,j));  

  63.     if I0<sum(d(1:index))  

  64.         x(index)=1;  

  65.         if i>1  

  66.             y(index)=sum(d(index:j))-initial_I(index);              

  67.         else  

  68.             y(index)=sum(d(index:j))-initial_I(index);  

  69.         end  

  70.     end  

  71.     j=index-1;  

  72. end  

  73. for i=1:n  

  74.     if i==1  

  75.         I(i)=I0+y(i)-d(i);  

  76.     else  

  77.         I(i)=I(i-1)+y(i)-d(i);  

  78.     end  

  79.     fprintf('  %d',I(i));  

  80. end  

  81. fprintf('\n');  

  82. fprintf('各阶段生产量为:\n');  

  83. for i=1:n  

  84.     fprintf('  %d',y(i));  

  85. end  

  86. fprintf('\n');  

  87. fprintf('各阶段是否生产:\n');  

  88. for i=1:n  

  89.     fprintf('  %d',x(i));  

  90. end  

  91. fprintf('\n');  

  92.   

  93. end  




注:本文转载自https://blog.csdn.net/robert_chen1988/article/details/52865490,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除。
上一篇 下一篇

分享