R中线性规划模型的求解

R中线性规划模型的求解,r,matrix,linear-programming,R,Matrix,Linear Programming,我需要解决以下微观经济问题: 我有六项资产可以在五年(2011-2015)内生产(资产1-6) 每项资产只能在一年内生产 每项资产必须在我的五年期内生产 生产不是相互排斥的;我可以在一年内生产一种以上的产品,而不会影响任何一种产品的生产 每项资产的固定生产成本等于30 我每年必须有非负利润;收入必须至少达到30% 下面是一个矩阵,表示我在给定年份(j)生产每项资产(i)的潜在收入 星号(*)表示最佳解决方案集 我如何使用R来解决生产计划,使我的收入(因此利润)最大化,并受到概述的约束。我的输

我需要解决以下微观经济问题:

  • 我有六项资产可以在五年(2011-2015)内生产(资产1-6)
  • 每项资产只能在一年内生产
  • 每项资产必须在我的五年期内生产
  • 生产不是相互排斥的;我可以在一年内生产一种以上的产品,而不会影响任何一种产品的生产
  • 每项资产的固定生产成本等于30
  • 我每年必须有非负利润;收入必须至少达到30%
下面是一个矩阵,表示我在给定年份(j)生产每项资产(i)的潜在收入

星号(
*
)表示最佳解决方案集


我如何使用R来解决生产计划,使我的收入(因此利润)最大化,并受到概述的约束。我的输出应该是一个类似的6x5矩阵,由
0
1
组成,其中
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
我们可以简单地创建它。这里需要注意的是,维度必须是正确的。我们有一个长度为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
我们仍然需要创建RHS并指定方向,但我现在将对此进行等待。
接下来让我们创建第二个条件的矩阵

sum_t x_[i,t] = 1 [ for all i ]
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
现在,RHS和方向都是从2个条件中简单获取的。从
const.dir
参数的文档中

给出约束方向的字符串向量:每个值应为“=”之一。(每对中的两个值相同。)

在我们的条件中,有6行表示第一个条件,而行表示条件2。因此,我们需要
n
(6)次
=
t
(5)次
=

cond_dir <- c(rep('==', n), rep('>=', t))
溶液的重量存储在
sol$solution

names(sol$solution) <- names(x)
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
接下来,我们将添加一个伪约束

x_[i,t] - C_[i,t] = 0 [for all i, t]
此约束确保如果
x_[i,t]=1
,则相关成本会添加到问题中。有两种方法可以创建此约束。第一个是有一个包含
n*t
行的矩阵,每个成本和周期一行。或者,我们可以使用我们的第一个约束,实际上只使用一个constant

sum_[i,t] x_[i,t] - C_[i,t] = 0
因为我们的第一个约束确保
x[1,1]!=x[1,2]
。所以我们的第三个限制变成了

cond3 <- c(rep(1, n * t), rep(-1, n * t))

这等于我们之前的值
275
减去我们的固定成本
fixed_C*n=180

这是一个经典问题,需要重新表述

从重新规划你的问题开始

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
我们可以简单地创建它。这里需要注意的是,维度必须是正确的。我们有一个长度为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
我们仍然需要创建RHS并指定方向,但我现在将对此进行等待。
接下来让我们创建第二个条件的矩阵

sum_t x_[i,t] = 1 [ for all i ]
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
现在,RHS和方向都是从2个条件中简单获取的。从
const.dir
参数的文档中

给出约束方向的字符串向量:每个值应为“=”之一。(每对中的两个值相同。)

在我们的条件中,有6行表示第一个条件,而行表示条件2。因此,我们需要
n
(6)次
=
t
(5)次
=

cond_dir <- c(rep('==', n), rep('>=', t))
溶液的重量存储在
sol$solution

names(sol$solution) <- names(x)
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
接下来,我们将添加一个伪约束

x_[i,t] - C_[i,t] = 0 [for all i, t]
此约束确保如果
x_[i,t]=1
,则相关成本会添加到问题中。有两种方法可以创建此约束。第一个是有一个包含
n*t
行的矩阵,每个成本和周期一行。或者,我们可以使用我们的第一个约束,实际上只使用一个constant

sum_[i,t] x_[i,t] - C_[i,t] = 0
因为我们的第一个约束确保
x[1,1]!=x[1,2]
。所以我们的第三个限制变成了

cond3 <- c(rep(1, n * t), rep(-1, n * t))

这等于我们之前的值
275
减去我们的固定成本
fixed_C*n=180

嘿,奥利弗,非常感谢你回答我的问题。这个解决方案非常全面,它帮助我详细了解模型!奥利弗,谢谢你回答我的问题。这个解决方案非常全面,它帮助我详细了解模型!