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

static dynamic策略下的随机批量生产问题


基于论文: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 dynamic" 策略是指生产周期开始前确定订货的时间点,但订货量根据已知需求确定。 根据这个情况,作者引入了新的求解变量 Y. Y 与 static uncertainty 下的订货量 X 的关系如下 (设订货节点分别为 t1, t2,.., tm):


根据:


得到:


经过转换得到:


这是约束条件,而目标函数变为:

因此,构建了一个线性规划模型,通过求解,得到 Y。

Matlab 代码如下:


[plain] view plain copy

  1. function BookbinderTan  

  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=0;  

  9. n=10;  

  10. alpha=0.95;  

  11.   

  12. d=[800,850,700,200,800,700,650,600,500,200];   

  13. S=2500*ones(1,n);  

  14. h=1*ones(1,n);  

  15. v=0*ones(1,n);  

  16.   

  17. sigma=0.333*d;  

  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=1e6*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+v(i)*prod_amount;  

  58.             else  

  59.                 C(i,j)=S(i)+h_sum+v(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('初始库存量: %.2f\n',I0);  

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

  81. for i=1:n  

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

  83. end  

  84. fprintf('\n');  

  85. fprintf('各阶段调整需求量\n');  

  86. for i=1:n  

  87.     fprintf('  %.2f',d_sta(i));  

  88. end  

  89. fprintf('\n');  

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

  91. for i=1:n  

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

  93. end  

  94. fprintf('\n');  

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

  96. for i=1:n  

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

  98. end  

  99. fprintf('\n');  

  100.   

  101. %-----------------------------------  

  102. %构造线性规划  

  103. num=sum(x);%生产启动次数  

  104. tt=zeros(num,1);  

  105. index=1;  

  106. for i=1:n  

  107.     if x(i)==1  

  108.         tt(index)=i;  

  109.         index=index+1;  

  110.     end  

  111. end  

  112. f=zeros(num,1);  

  113. for i=1:num  

  114.     f(i)=v(tt(i))+h(tt(i))*(n+1-tt(i));  

  115. end  

  116. A=tril(ones(num,num));  

  117. sigma_sum1=zeros(num,1);  

  118. mean_sum1=zeros(num,1);  

  119. for i=1:num-1  

  120.     sigma_sum1(i)=sqrt(sigma(tt(i):tt(i+1)-1)*sigma(tt(i):tt(i+1)-1)');  

  121.     mean_sum1(i)=sum(d(tt(i):tt(i+1)-1));  

  122. end  

  123. sigma_sum1(num)=sqrt(sigma(tt(num):n)*sigma(tt(num):n)');  

  124. mean_sum1(num)=sum(d(tt(num):n));  

  125. b=norminv(alpha,mean_sum1,sigma_sum1)-I0;  

  126. lb=zeros(num,1);  

  127. for i=2:num  

  128.     lb(i)=-sum(d(tt(i-1):tt(i)-1));  

  129. end  

  130. [Y,~]=linprog(f,-A,-b,[],[],lb,[]);  

  131. Y(1)=y(tt(1));  

  132. fprintf('static dynmaic decision 基准产量:\n');  

  133. index=1;  

  134. for i=1:n  

  135.     if x(i)==1  

  136.         fprintf('  %.2f',Y(index));  

  137.         index=index+1;  

  138.     else  

  139.         fprintf('  0');  

  140.     end  

  141. end  

  142. fprintf('\n');  

  143. fprintf('实际产量:\n');  

  144. index=1;  

  145. for i=1:n  

  146.     if x(i)==1  

  147.         if index==1  

  148.             fprintf('  %.2f',Y(index));y(i)=Y(index);  

  149.         else  

  150.             fprintf('  %.2f',Y(index)+sum(d(tt(index-1):tt(index)-1)));  

  151.             y(i)=Y(index)+sum(d(tt(index-1):tt(index)-1));  

  152.         end  

  153.         index=index+1;  

  154.     else  

  155.         fprintf('  0');  

  156.     end  

  157. end  

  158. fprintf('\n');  

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

  160. for i=1:n  

  161.     if i==1  

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

  163.     else  

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

  165.     end  

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

  167. end  

  168. fprintf('\n');  

  169. fprintf('生产总成本为: %.2f',S*x'+v*y'+h*I');  

  170. fprintf('\n');  

  171. end  





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

分享