加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

数学建模教程四、动态规划——生产计划问题

(2014-03-09 00:04:50)
标签:

动态规划

生产计划

r语言

it

分类: 数学建模
动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。
下面是几个著名的动态规划问题以及它们的R语言求解过程。

  • 案例二、生产规划问题

工厂生产某种产品,每单位(千件)的成本为 1(千元),每次开工的固定成本为 3 (千元),工厂每季度的最大生产能力为 6(千件)。经调查,市场对该产品的需求量第一、二、三、四季度分别为 2,3,2,4(千件)。如果工厂在第一、二季度将全年的需求都生产出来,自然可以降低成本(少付固定成本费),但是对于第三、四季度才能上市的产品需付存储费,每季每千件的存储费为 0.5(千元)。还规定年初和年末这种产品均无库存。试制定一个生产计划,即安排每个季度的产量,使一年的总费用(生产成本和存储费)最少。

这一类生产计划问题(Production planning problem),阶段按计划时间自然划分,状态定义为每阶段开始时的储存量x(k),决策为每个阶段的产量u(k),记每个阶段的需求量(已知量)为d(k),则状态转移方程为:

x(k+1)=x(k) + u(k) − d(k) x(k)≥0, k=1,2,...,n

设每阶段开工的固定成本费为a,生产单位数量产品的成本费为b,每阶段单位数量产品的储存费为c,阶段指标为阶段的生产成本和储存费之和,即
 
v(x(k), u(k)) = cx(k) + (a + bu(k))          if u(k)>0
v(x(k), u(k)) = cx(k) + 0                    if u(k)=0

最优值函数f(x(k))为从第k段的状态x(k)出发到过程终结的最小费用,满足 :
f(x(k))=min(v(x(k), u(k)) + f(x(k+1)))

以上分析过程R语言的实现代码:

#每阶段单位数量产品的储存费为c
C = 0.5;
#每阶段开工的固定成本费为a
A = 3;
#生产单位数量产品的成本费为b
B = 1;
#市场对该产品的需求量数组
ds <- c(2, 3, 2, 4);
#市场对该产品的需求量函数
d <- function(k) {
  return (ds[k])
};
#生产目标,所有初始化为NA,在每次遍历的时候,需要更新这个值!!!
us <- rep(NA, times=length(ds));
u <- function(k) {
  return (us[k]);
}

#每阶段开始时的储存量x(k)
x <- function(k) {
  if(k<=1) {
    result <- 0;
  } else {
    result <- x(k-1) + u(k-1) - d(k-1);
  }
  return (result);
}
#阶段的生产成本和储存费之和
vs <- c();
v <- function(k) {
  #v(x(k), u(k)) = cx(k) + (a + bu(k))          if u(k)>0
  #v(x(k), u(k)) = cx(k) + 0                    if u(k)=0
  if(u(k)==0) {
    vs[k] <- C*x(k);
  }
  if(u(k)>0) {
    vs[k] <- C*x(k) + (A + B*u(k));
  }
  return (vs[k]);
}

f <- function(k) {
  #设置终止条件,如果为第k+1季度,则返回
  #f(x(k))=min(v(x(k), u(k)) + f(x(k+1)))
  
  if(k==(length(ds)+1)) {
    result <- 0;
  } else {
    result <- v(k) + f(k+1);
  }
  
  return (result);
}

uss <- expand.grid(s1=c(0:sum(ds)), s2=c(0:sum(ds)), s3=c(0:sum(ds)), s4=c(0:sum(ds)));
uss <- data.matrix(uss[which(rowSums(uss)==sum(ds)),]);

#i<- 2
#uss[which(rowSums(matrix(uss[,1:i], ncol=i))>=sum(ds[1:i])),];

for(i in 1:length(ds)) {
  uss <- uss[which(rowSums(matrix(uss[,1:i], ncol=i))>=sum(ds[1:i])),];
}

rs = c();
for(i in 1:nrow(uss)) {
  #重新设置us值
  us <- uss[i,];
  rs[i] <- f(1);
}
min(rs)
uss[which(rs==min(rs)),]

计算结果:

> min(rs)
[1] 20.5
> uss[which(rs==min(rs)),]
     s1 s2 s3 s4
870   5  0  6  0
6920  7  0  0  4

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有