使用lpSolve在R中使用整数变量进行简单的线性编程(优化 R)

在上一篇文章中,我演示了如何使用R中的lpSolve包来建模和解决简单的线性优化问题。

在这篇文章中,我想添加建模整数变量的主题。

在上一篇文章中,我们将目标函数2x + 3y最大化,约束条件x + y <=3。当两个变量均为连续非负值时,解为y = 3,目标函数的最佳值为9。

在本文中,我们添加了另一个约束,即y必须为整数。此外,我将初始约束调整为现在x + y <= 3.9。通过在R中使用lpSolve包,可以通过指定int.vec参数来考虑整数变量约束,该参数表示向量,该向量具有问题要考虑的整数变量的索引。在这种情况下,索引为2,因为y是整数。

我从解决与上一个相似的简单线性编程问题开始,只是x + y <= 3.9(而不是3.0)。目标函数不变-因此这是非整数问题(作为基准):

library(lpSolve)
f.obj <- c(2,3)                           # 目标函数的系数向量
f.con <- matrix(c(1,1),nrow=1,byrow=TRUE) # 约束矩阵的系数矩阵
f.dir <- c("<=")                          # 约束方向向量
f.rhs <- c(3.9)                           # 约束值
#f.intvec <- NA                           # 必须是整数的变量的索引

solution <- lp(direction = "max",
               objective.in = f.obj,
               const.mat = f.con, 
               const.dir = f.dir, 
               const.rhs = f.rhs#,
               #int.vec = f.intvec,        # 指定此函数参数指示哪些变量是整数
               #all.int = FALSE
               )

solution
## 成功:目标函数为11.7

约束x + y <= 3.9的非整数问题的最优解具有以下最优值(=最大值)。

solution$solution
## [1] 0.0 3.9

现在,我再次对上面的模型进行建模和求解-但是将y指定为整数变量。

library(lpSolve)
f.obj <- c(2,3)                           #物镜系数向量
f.con <- matrix(c(1,1),nrow=1,byrow=TRUE) # 目标函数的系数向量
f.dir <- c("<=")                          # 约束方向向量
f.rhs <- c(3.9)                           # 约束值
f.intvec <- c(2)                          # 必须是整数的变量的索引号

solution <- lp(direction = "max",
               objective.in = f.obj,
               const.mat = f.con, 
               const.dir = f.dir, 
               const.rhs = f.rhs,
               int.vec = f.intvec#,        # 指定此函数参数指示哪些变量是整数
               #all.int = FALSE
               )

solution
## 成功:目标函数为10.8

考虑到附加的整数约束,目标函数的最大值降低了。现在的最佳点是:

solution$solution
## [1] 0.9 3.0

如我们所见,最优解不再是y为3.9,而是y等于3 –的确是整数!

如果您对线性编程感兴趣,请查看我有关此主题的其他博客文章。另外,如果有兴趣,请查看我有关非线性和二次编程的文章。最后,您可能也对使用SciPy模块阅读有关Python线性编程的文章感兴趣。

Leave a Reply

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Close

功能