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

static uncertainty策略下的随机批量生产问题(stochastic lot sizing) 的建模与求解,Matlab


基于论文:Bookbinder J H, Tan J Y. Strategies for the probabilistic lot-sizing problem with service-level constraints[J]. Management Science, 1988, 34(9): 1096-1108.

对于单产品批量生产问题,问题模型为:


文中提出了三种订货策略。其中,static uncertainty 是指订货点与订货量在生产周期开始前就确定。static uncertainty 下的数学模型变为:将随机模型中的随机变量全部加上期望,并加上一个服务率约束:


第3个约束条件通过转换得到:



作者设法将模型3 变为模型1 的形式,从而可以按照需求确定时求解。

用新的形式表示需求 d:


模型3 变为:


将:

 

视作模型1种的 I_t,则模型3 可以按照模型1的算法求解。即使用Wagner-Whitin算法求解。Matlab代码如下:



[plain] view plain copy

  1. function StaticUncertainty  

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

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

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

  5. % I0 initial inventory level  

  6. % assume demand is normaldistribution with expected demand in d  

  7.   

  8. I0=15;  

  9. n=8;  

  10. alpha=0.95;  

  11.   

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

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

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

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

  16.   

  17. sigma=randi(5,1,n);  

  18. sigma_sum=sigma;  

  19. for i=2:n  

  20.     sigma_sum(i)=sqrt(sigma(1:i)*sigma(1:i)');  

  21. end  

  22. d_sum=cumsum(d);  

  23. d_sta=norminv(alpha,d_sum,sigma_sum);  

  24. d_sta=[d_sta(1),diff(d_sta)];  

  25.   

  26. x=zeros(1,n);  

  27. y=zeros(1,n);  

  28. I=zeros(1,n);  

  29.   

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

  31. opt_cost=zeros(n,1);  

  32. initial_I=zeros(n,1);  

  33. for i=1:n  

  34.     if i>1  

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

  36.     end  

  37.     for j=i:n  

  38.         if I0>=sum(d_sta(1:j))  

  39.             if i==1  

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

  41.             else  

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

  43.             end  

  44.         else  

  45.             initial_I(i)=I0;  

  46.             if i>1  

  47.                 if I0>sum(d_sta(1:i-1))  

  48.                     initial_I(i)=I0-sum(d_sta(1:i-1));  

  49.                 else  

  50.                     initial_I(i)=0;  

  51.                 end  

  52.             end  

  53.             prod_amount=sum(d_sta(i:j))-initial_I(i);  

  54.             temp_I=initial_I(i)+prod_amount;  

  55.             h_sum=h(i:j)*(temp_I-cumsum(d_sta(i:j)))';  

  56.             if i>1  

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

  58.             else  

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

  60.             end  

  61.         end  

  62.    end  

  63. end  

  64.   

  65. %back track  

  66. j=n;  

  67. while j>=1  

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

  69.     if I0<sum(d_sta(1:index))  

  70.         x(index)=1;  

  71.         if i>1  

  72.             y(index)=sum(d_sta(index:j))-initial_I(index);              

  73.         else  

  74.             y(index)=sum(d_sta(index:j))-initial_I(index);  

  75.         end  

  76.     end  

  77.     j=index-1;  

  78. end  

  79. fprintf('最小成本为: %.4f\n',min(C(:,n)));  

  80. fprintf('初始库存量: %.2f\n',I0);  

  81. % fprintf('各阶段库存量为 \n');  

  82. % for i=1:n  

  83. %     if i==1  

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

  85. %     else  

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

  87. %     end  

  88. %     fprintf('  %.2f',I(i));  

  89. % end  

  90. % fprintf('\n');  

  91. fprintf('各阶段需求量\n');  

  92. for i=1:n  

  93.     fprintf('  %.2f',d(i));  

  94. end  

  95. fprintf('\n');  

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

  97. for i=1:n  

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

  99. end  

  100. fprintf('\n');  

  101. fprintf('static uncertainty 各阶段生产量\n');  

  102. for i=1:n  

  103.     fprintf('  %.2f',y(i));  

  104. end  

  105. fprintf('\n');  

  106. end  




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

分享