线性规划的R语言实现

R语言在针对各类优化模型时都能快速方便的求解,对运输问题、生产计划问题、产销问题和旅行商问题等都有专门的R包来解决。线性规划与整数规划的区别主要在于对决策变量的取值约束有所不同。线性规划的决策变量为正实数,而整数规划则要求决策变量为正整数。在R语言中,有众多相关的R包可以解决这两类问题,例如stat包中的optim、optimize函数,这里给大家推荐lpsolve包,lpsolve包用法简单,平移性好,核心函数调用方便,对解决大型的线性规划和整数规划问题十分好用。

1. R包lpSolve概述

lpSolve包专为求解线性规划问题的R包,与以前大家学习过的LINGO与MATLAB求解相仿。其核心函数为lp函数,其用法如下:

lp (direction = "min", objective.in, const.mat, const.dir, const.rhs,transpose.constraints = TRUE, int.vec, presolve=0, compute.sens=0, binary.vec, all.int=FALSE, all.bin=FALSE, scale = 196, dense.const, num.bin.solns=1, use.rw=FALSE)

参数Argument 释义 中文解释
direction Character string giving direction of optimization: "min" (default) or "max." 目标函数 "min" (缺省) or "max."
objective.in Numeric vector of coefficients of objective function 目标函数系数
const.mat Matrix of numeric constraint coefficients, one row per constraint, one column per variable (unless transpose.constraints = FALSE; see below) 系数矩阵
const.dir Vector of character strings giving the direction of the constraint: each value should be one of "<," "<=," "=," "==," ">," or ">=". (In each pair the two values are identical.) 约束方向"<=" "=" ">="
const.rhs Vector of numeric values for the right-hand sides of the constraints 常数项
int.vec Numeric vector giving the indices of variables that are required to be integer. The length of this vector will therefore be the number of integer variables. 整数变量设置
compute.sens Numeric: compute sensitivity? Default 0 (no); any non-zero value means "yes." 灵敏度分析设置
binary.vec Numeric vector like int.vec giving the indices of variables that are required to be binary 0-1变量设置
all.int Logical: should all variables be integer? Default: FALSE 可设全部变量都取整数
all.bin Logical: should all variables be binary? Default: FALSE 可设全部变量都是0-1变量

2. 线性规划的R计算

2.1 线性规划示例

例1:一家公司希望最大化两种产品A和B的利润,分别以25美元和20美元的价格出售。每天有1800个资源单位,产品A需要20个单位,而B需要12个单位。这两种产品都需要15分钟的生产时间,并且可用的总工作时间为每天8小时。每种产品的生产数量应该是什么才能使利润最大化。

产品A 产品B 资源
资源1 20 12 1800
时间2 15 15 4800
利润 25 20

解:设生产两种产品的数量为\(x_1\),\(x_2\)

上述问题的目标函数是:

\(max(销售额)=max\) (25 \(x_1\) + 20 \(x_2\))

问题中的约束(资源和时间):

20\(x_1\) + 12 \(x_2\) <= 1800 (资源约束)

15\(x_1\) + 15 \(x_2\)<=4800 (时间约束)

数学模型(LP)为:

\begin{array}{l} \max z = 25{x_1} + 20{x_2} \\ s.t.\left\{ {\begin{array}{*{20}{c}} {20{x_1} + 12{x_2} \le 1800}\\ {15{x_1} + 15{x_2} \le 4800}\\\ {{x_1} \ge 0,{x_2} \ge 0} \end{array}} \right. \end{array}

例2:线性规划

#Set up problem: maximize
x1 + 9 x2 + x3
#subject to
x1 + 2 x2 + 3 x3 <= 9
3 x1 + 2 x2 + 2 x3 <= 15
x1>=0, x2>=0

2.2线性规划R求解

例1求解
library(lpSolve)
f.obj <- c(25, 20)
f.con <- matrix (c(20,12, 15,15), nrow=2, byrow=TRUE)
f.dir <- c("<=", "<=")
f.rhs <- c(1800, 4800)
lp ("max", f.obj, f.con, f.dir, f.rhs)
lp1<-lp ("max", f.obj, f.con, f.dir, f.rhs)
lp1$solution
lp1$objval
lp ("max", f.obj, f.con, f.dir, f.rhs)
Success: the objective function is 3000
lp1$solution
[1] 0 150 #最优解
lp1$objval
[1] 3000 #最优值
例2求解
library(lpSolve)
f.obj <- c(1, 9, 1)
f.con <- matrix (c(1, 2, 3, 3, 2, 2), nrow=2, byrow=TRUE)
f.dir <- c("<=", "<=")
f.rhs <- c(9, 15)
lp ("max", f.obj, f.con, f.dir, f.rhs)
lp2<-lp ("max", f.obj, f.con, f.dir, f.rhs)
lp2$solution
lp2$objval
lp ("max", f.obj, f.con, f.dir, f.rhs)
Success: the objective function is 40.5
lp2$solution
[1] 0.0 4.5 0.0 #最优解
lp2$objval
[1] 40.5 #最优值

3. 整数规划R计算

例3:使用lpSolve求解整数规划最大值

\begin{array}{l} \max z = 5{x_1} + 7{x_2} \\ s.t.\left\{ {\begin{array}{*{20}{c}} {{x_1} + 2{x_2} \le 16}\\ {2{x_1} + 3{x_2} \le 9}\\{{x_1} + {x_2} \le 8}\ \\{{x_1} \ge 0,{x_2} \ge 0} 且都是整数\end{array}} \right. \end{array}

library(lpSolve)
f.obj <- c(5,7)
f.con <- matrix(c(1,2,2,3,1,1), nrow=3,byrow=TRUE)
f.dir <- c('<=', '<=', '<=')
f.rhs <- c(16,9,8)
lp('max', f.obj, f.con,f.dir,f.rhs,all.int=TRUE)

求解结果如下

lp('max', f.obj, f.con,f.dir,f.rhs,all.int=TRUE)
Success: the objective function is 22
lp3<-lp('max', f.obj, f.con,f.dir,f.rhs,all.int=TRUE)
lp3$solution
[1] 3 1 #最优解都是整数
lp3$objval
[1] 22 #最优值

不加整数约束的解

lp('max', f.obj, f.con,f.dir,f.rhs)
Success: the objective function is 22.5
lp3<-lp('max', f.obj, f.con,f.dir,f.rhs)
lp3$solution
[1] 4.5 0.0
lp3$objval
[1] 22.5

参考文献

(【R语言在最优化中的应用】lpSolve包解决 指派问题和指派问题)[https://cloud.tencent.com/developer/article/1411788]

线性规划与整数规划—R实现的更多相关文章

  1. Python数模笔记-PuLP库(1)线性规划入门

    1.什么是线性规划 线性规划(Linear programming),在线性等式或不等式约束条件下求解线性目标函数的极值问题,常用于解决资源分配.生产调度和混合问题.例如: max fx = 2*x1 ...

  2. Python小白的数学建模课-03.线性规划

    线性规划是很多数模培训讲的第一个算法,算法很简单,思想很深刻. 要通过线性规划问题,理解如何学习数学建模.如何选择编程算法. 『Python小白的数学建模课 @ Youcans』带你从数模小白成为国赛 ...

  3. Python小白的数学建模课-04.整数规划

    整数规划与线性规划的差别只是变量的整数约束. 问题区别一点点,难度相差千万里. 选择简单通用的编程方案,让求解器去处理吧. 『Python小白的数学建模课 @ Youcans』带你从数模小白成为国赛达 ...

  4. **ML : ML中的最优化方法

    前言:         在机器学习方法中,若模型理解为决策模型,有些模型可以使用解析方法.不过更一般的对模型的求解使用优化的方法,更多的数据可以得到更多的精度.         AI中基于归纳的方法延 ...

  5. Python小白的数学建模课-07 选址问题

    选址问题是要选择设施位置使目标达到最优,是数模竞赛中的常见题型. 小白不一定要掌握所有的选址问题,但要能判断是哪一类问题,用哪个模型. 进一步学习 PuLP工具包中处理复杂问题的字典格式快捷建模方法. ...

  6. ACM/ICPC竞赛

    ACM知识点分类   第一类:基础算法 (1) 基础算法:枚举,贪心,递归,分治,递推,构造,模拟 (2) 动态规划:背包问题,树形dp,状态压缩dp,单调性优化,插头dp (3) 搜索:dfs,bf ...

  7. 10分钟明白对偶建模法 / +Leampms的“主模型建模”和“对偶模型建模” 之 —— 三类最短路径问题

    摘要 对偶模型建模是非常有独特的一种建模方式 —— 当问题本身要求指标极小的情况下,对偶模型表现为求极大.本文给出三种最短路径问题的线性规划/混合整数规划模型,其中的第三类最短路径问题采用对偶建模方法 ...

  8. ACM知识点分类

    (知识点分类.看完想(╯‵□′)╯︵┻━┻) orz...一点点来吧.简单标记一下. 蓝色,比较熟悉,能够做. 蓝绿色,一般熟悉,需要加强 红色,(比个辣鸡.jpg) (标记完突然想打人...) 第一 ...

  9. Python小白的数学建模课-05.0-1规划

    0-1 规划不仅是数模竞赛中的常见题型,也具有重要的现实意义. 双十一促销中网购平台要求二选一,就是互斥的决策问题,可以用 0-1规划建模. 小白学习 0-1 规划,首先要学会识别 0-1规划,学习将 ...

  10. Python小白的数学建模课-06 固定费用问题

    Python 实例介绍固定费用问题的建模与求解. 学习 PuLP工具包中处理复杂问题的快捷使用方式. 『Python小白的数学建模课 @ Youcans』带你从数模小白成为国赛达人. 前文讲到几种典型 ...

随机推荐

  1. windows jetbrains toolbox 无法修改应用安装目录(应用正在运行)的解决方案

    打开 jetbrains toolbook安装目录/.settings.json 添加一行 "install_location": 指定的路径地址 解决方案来自 JetBrains ...

  2. 20200925--矩阵乘法(奥赛一本通P94 多维数组)

    计算两个矩阵的乘法.n*m阶的矩阵A乘以m*k阶的矩阵B得到的矩阵C是n*k阶的,且C[i][j]=A[i][0]*B[0][j]+A[i][1]*B[1][j]+...+A[i][m-1]*B[m- ...

  3. 使用SharpCompress压缩文件后把压缩的文件流传给前端

    1 SharpCompress版本 0.30.1 2 应用场景:前端传递某个标识符,如Id,查询和该Id相关联的文件,并把文件压缩,最后返回给前端.适用于压缩多个体积较小的文件,如果文件体系过大,可能 ...

  4. uniapp相关

    1.uniapp官网 网址:https://uniapp.dcloud.net.cn/ 2.引入组件库 网址:https://www.uviewui.com/ 3.问题如下 (1)使用SwipeAct ...

  5. React中的固定组件(随遇随记)

    <React.StrictMode></React.StrictMode>对组件中使用严格模式 <React.Fragment></React.Fragmen ...

  6. 基于CMMI的软件工程及实训指导 第一章

    第一章 软件工程基础 1. 软件工程概述 1.1 软件工程概念 软件工程是从管理和技术两方面来研究如何采用工程的概念.原理和技术方面并加以综合,指导开发人员更好地开发和维护计算机软件的一门新学科. 1 ...

  7. Ndisuio win10 注册表下载

    看了一下应该没有什么隐私内容,丢失这个注册表信息会让网络服务无法启动,新建txt,复制后修改后缀为.reg,双击录入,在管理员权限下cmd中输入 netsh winsock reset 重启 Wind ...

  8. mysql知识点二

    1.mysql中的语言有哪些?分别代表什么意思1.DDL(Data Define Language) 数据定义语言2.DML(Data Manipulation Language) 数据操作语言3.D ...

  9. ASP.NET利用JQuery实现AJAX(前台脚本代码)调用后台静态方法

    前台页面的script代码 PS: 如果不需要参数的话,就把data那一行删除 $(function () { //AJAX同步后台 var orderid = parseInt($(this).pa ...

  10. 渲染器的实现(1)--《vue.js设计与实现》

    function renderer(domString, container) { container.innerHTML = domString } let count = ref(1) rende ...