线性规划的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. MQTT服务器搭建——Liunx安装mosquitto,并设置用户密码

    一.安装 1.下载mosquitto安装包 地址:http://mosquitto.org/files/source/ 2.安装依赖包 yum install gcc gcc-c++ libstdc+ ...

  2. centos7 redis 无法用 systemctl 启动

    今天刚安装了redis,修改了 /etc/redis.conf 的内容. 尝试在 bind 后添加一个地址 "bind 127.0.0.1 -::* 192.168.2.1", 后 ...

  3. Python爬虫之Scrapy制作爬虫

    前几天我有用过Scrapy架构编写了一篇爬虫的代码案例深受各位朋友们喜欢,今天趁着热乎在上一篇有关Scrapy制作的爬虫代码,相信有些基础的程序员应该能看的懂,很简单,废话不多说一起来看看. 前期准备 ...

  4. OSIDP-单处理器调度-09

    处理器调度的类型 处理器调度的目的是为了满足系统的目标,将进程分配到处理器上执行. 系统并发度:正等待处理器处理的进程个数.(这里的表述和08里面的不同,以这里为准.主要是懒得改,见谅= =) 长程调 ...

  5. Python笔记(1)——字符串(Python编程:从入门到实践)

    字符串 一.使用方法修改字符串大小写 1. 方法:变量.tittle():首字母大学显示字符串中的每个英文单词 2. 方法:变量.upper():字符串全改为大写 3. 方法:变量.lower():将 ...

  6. 转 oracle 无法使用sys用户登录 connection as SYS should be as SYSDBA OR SYSOPER

    转自:  https://blog.csdn.net/u012004128/article/details/80781979 安装Oracle11g后,为了测试安装是否成功,通过cmd命令打开了sql ...

  7. django orm性能优化

    参考: django 分页查询大表,很慢 面试小知识:MySQL索引相关 MySQL 用 limit 为什么会影响性能? 前言 orm性能优化是一件很重要的事,一般万条以上的数据都需要优化处理了. 这 ...

  8. vue项目部署后页面加载首次很慢的优化方案

    参考: vue项目首次加载特别慢需要怎么配置? 1.看看你的依赖包是不是全局引入的,改为组件内按需引入,可大大降低加载时长.或者将组件引入方式改为cdn引入.需要注意的是,两种引入方式不能共存. 2. ...

  9. Pytorch Chain-Rules

    Derivative Rules \[\begin{aligned} &\frac{\delta E}{\delta w^1_{jk}}=\frac{\delta E}{\delta O_k^ ...

  10. Windows10系统快速安装.NET Framework3.5的方法&常见问题处理方法

    Windows10系统快速安装.NET Framework3.5的方法&常见问题处理方法 因为我的win10想了办法来禁止自动更新,就无法照正常办法安装.NET Framework3.5,解决 ...