1、问题描述
工厂生产某种产品,每单位(千件)的成本为 1(千元),每次开工的固定成本为 3 (千元),工厂每季度的最大生产能力为 6(千件)。经调查,市场对该产品的需求量第一、二、三、四季度分别为 2,3,2,4(千件)。如果工厂在第一、二季度将全年的需求都生产出来,自然可以降低成本(少付固定成本费),但是对于第三、四季度才能上市的产品需付存储费,每季每千件的存储费为 0.5(千元)。还规定年初和年末这种产品均无库存。试制定一个生产计划,即安排每个季度的产量,使一年的总费用(生产成本和存储费)最少。
2、解题思路
这一类生产计划问题(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,阶段指标为阶段的生产成本和储存费之和,即
if u(k)>0
v(x(k), u(k)) = cx(k) + (a + bu(k))
if u(k)=0
v(x(k), u(k)) = cx(k) + 0
最优值函数f(x(k))为从第k段的状态x(k)出发到过程终结的最小费用,满足 :
f(x(k)) = min(v(x(k), u(k)) + f(x(k+1)))
3、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(x)
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) {
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)),]
4、输出结果
> min(rs)
[1] 20.5
> uss[which(rs == min(rs)), ]
s1 s2 s3 s4
870 5 0 6 0
6920 7 0 0 4