我需要解决以下微观经济问题:
下面是代表我在给定年份(j)中生产每种资产(i)的潜在收入的矩阵。
2011 2012 2013 2014 2015
Asset1 35* 37 39 42 45
Asset2 16 17 18 19 20*
Asset3 125 130 136*139 144
Asset4 15 27 29 30* 33
Asset5 14 43* 46 50 52
Asset6 5 7 8 10 11*
星号(*
)代表什么是最佳解集。
我如何使用R来解决生产计划,以在概述的约束条件下最大化我的收入(并因此获得利润)。我的输出应该是0
和1
的类似6x5矩阵,其中1
代表选择在给定年份内生产商品。
这是一个经典的问题,需要重新制定。
重新开始您的问题
Max( sum_[i,t] (pi_[i,t] - C_[i,t]) * x_[i,t])
Sd.
sum_t x_[i,t] = 1 [ for all i ]
sum_i x_[i,t] >= 30 [ for all t ]
x_[i,t] >= 0 [for all i, t]
lpSolve
包中的最大化问题以线性表示形式给出,例如非矩阵格式。让我们从制作代表我们的x_[i,t]
的向量开始。为方便起见,让我们为其命名(尽管未使用),以便我们跟踪。
n <- 6
t <- 5
#x ordered by column.
x <- c(35, 16, 125, 15, 14, 5, 37, 17, 130, 27, 43, 7, 39, 18, 136, 29, 46, 8, 42, 19, 139, 30, 50, 10, 45, 20, 144, 33, 52, 11)
# if x is matrix use:
# x <- as.vector(x)
names(x) <- paste0('x_[', seq(n), ',', rep(seq(t), each = n), ']')
head(x, n * 2)
x_[1,1] x_[2,1] x_[3,1] x_[4,1] x_[5,1] x_[6,1] x_[1,2] x_[2,2] x_[3,2] x_[4,2] x_[5,2] x_[6,2]
35 16 125 15 14 5 37 17 130 27 43 7
length(x)
[1] 30
现在我们需要创造条件。从第一个条件开始>
sum_t x_[i,t] = 1 [ for all i ]
我们可以相当简单地创建它。需要注意的是,尺寸必须正确。我们有一个长度为30的向量,因此我们需要条件矩阵具有30行。此外,我们有6个资产,因此对于这种情况我们将需要6行。再次让我们命名行和列以跟踪自己。
cond1 <- matrix(0, ncol = t * n, nrow = n, dimnames = list(paste0('x_[', seq(n), ',t]'), names(x))) cond1[, seq(n + 1)] x_[1,1] x_[2,1] x_[3,1] x_[4,1] x_[5,1] x_[6,1] x_[1,2] x_[1,t] 0 0 0 0 0 0 0 x_[2,t] 0 0 0 0 0 0 0 x_[3,t] 0 0 0 0 0 0 0 x_[4,t] 0 0 0 0 0 0 0 x_[5,t] 0 0 0 0 0 0 0 x_[6,t] 0 0 0 0 0 0 0
接下来,我们填写正确的字段。
x_[1,1] + x[1, 2] + ... = 1
和x_[2,1] + x_[2,2] + ... = 1
等。对于这个问题,使用for循环是最简单的]
for(i in seq(n)){ cond1[i, seq(i, 30, n)] <- 1 } cond1[, seq(n + 1)] x_[1,1] x_[2,1] x_[3,1] x_[4,1] x_[5,1] x_[6,1] x_[1,2] x_[1,t] 1 0 0 0 0 0 1 x_[2,t] 0 1 0 0 0 0 0 x_[3,t] 0 0 1 0 0 0 0 x_[4,t] 0 0 0 1 0 0 0 x_[5,t] 0 0 0 0 1 0 0 x_[6,t] 0 0 0 0 0 1 0
我们仍然必须创建RHS并指定方向,但是我现在将等待。因此,接下来让我们为第二个条件创建矩阵
的值sum_i x_[i,t] >= 30 [ for all t ]
此过程非常相似,但是现在每个周期都需要一行,因此矩阵的尺寸为5x30。这里的主要区别是,我们需要插入
x_[i, t]
cond2 <- matrix(0, ncol = t * n, nrow = t, dimnames = list(paste0('t=', seq(t)), names(x))) for(i in seq(t)){ cond2[i, seq(n) + n * (i - 1)] <- x[seq(n) + n * (i - 1)] } cond2[, seq(1, n * t, n)] x_[1,1] x_[1,2] x_[1,3] x_[1,4] x_[1,5] t=1 35 0 0 0 0 t=2 0 37 0 0 0 t=3 0 0 39 0 0 t=4 0 0 0 42 0 t=5 0 0 0 0 45
请注意,我正在打印
x_[1, t]
的结果以说明我们做对了。最后,我们有最终条件。为此,我们注意到?lpSolve::lp
有一个参数all.bin
,并且在读取它时指出
逻辑:所有变量都应为二进制吗?默认值:FALSE。
因此,由于所有变量均为1或0,我们只需将此值设置为
TRUE
。在继续之前,让我们将条件合并为一个矩阵
cond <- rbind(cond1, cond2)
现在,RHS和方向都简单地从这两个条件中得出。从
const.dir
参数的文档中
给出约束方向的字符串向量:每个值应为“ ”或“> =”中的一个。 (在每对中,两个值相同。)
[在我们的条件下,我们有6行代表第一个条件,而行又复位了条件2。因此,我们需要
n
(6)乘以==
,而t
(5)乘以>=
。
cond_dir <- c(rep('==', n), rep('>=', t))
以类似方式创建RHS
RHS <- c(rep(1, n), rep(30, t))
就是这样!现在,我们准备使用
lpSolve::lp
函数来解决我们的问题。
sol = lpSolve::lp(direction = 'max', objective.in = x, const.mat = cond, const.dir = cond_dir, const.rhs = RHS, all.bin = TRUE) sol$objval [1] 275
解决方案的权重存储在
sol$solution
中
names(sol$solution) <- names(x) sol$solution sol$solution x_[1,1] x_[2,1] x_[3,1] x_[4,1] x_[5,1] x_[6,1] x_[1,2] x_[2,2] x_[3,2] x_[4,2] x_[5,2] x_[6,2] x_[1,3] x_[2,3] x_[3,3] 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 x_[4,3] x_[5,3] x_[6,3] x_[1,4] x_[2,4] x_[3,4] x_[4,4] x_[5,4] x_[6,4] x_[1,5] x_[2,5] x_[3,5] x_[4,5] x_[5,5] x_[6,5] 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 matrix(sol$solution, ncol = t, dimnames = list(rownames(cond1), rownames(cond2))) t=1 t=2 t=3 t=4 t=5 x_[1,t] 1 0 0 0 0 x_[2,t] 0 0 0 0 1 x_[3,t] 0 0 1 0 0 x_[4,t] 0 0 0 1 0 x_[5,t] 0 1 0 0 0 x_[6,t] 0 0 0 0 1
我们很快就会看到这是正确的解决方案。 :-)