在上一篇文章中,我演示了如何使用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线性编程的文章感兴趣。
专业领域为优化和仿真的工业工程师(R,Python,SQL,VBA)
Leave a Reply