线性规划的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. HDFS编程 —— 用Java API 操作HDFS

    使用Java操作HDFS,首先需要创建maven工程,创建maven工程的方法:https://www.cnblogs.com/ynqwer/p/14540108.html. 在新建的maven工程的 ...

  2. Microsoft Edge 浏览器中 Vue.js devtools 插件安装与使用

    下载插件 通过插件下载网站crx4chrome搜索下载,也可以直接百度"site:(www.crx4chrome.com) Vue.js Devtools"找到下载页面下载 或者通 ...

  3. spring中.xml配置文件头部

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  4. Python+Django(1)——建立项目

    为项目新建一个目录,将其命名为learning_log,再在终端中切换到这个目录(Python 3): 运行模块venv 来创建一个名为ll_env的虚拟环境:python -m venv ll_en ...

  5. C# 连接EXCEL和ACCESS字符串2003及2007版字符串说明

    97-2003版本 EXCEL Provider=Microsoft.Jet.OLEDB.4.0;Data Source=文件位置;ExtendedProperties=Excel 8.0;HDR=Y ...

  6. 高德地图使用websocket后重新设置点进行优化

    // 设置第一次点赋值,重新定义一个新数组,将设备号为对象名,索引值作为键值 const getListNEW = useCallback( (params, reload, gps) => { ...

  7. 安装SQL Server 2008 R2出现的问题及解决方法(配合Visual Studio )

    学校的一个作业需要SQL Server,所以就安装一个,没想到还真是有不少问题 总结:遇到问题,取消安装,完全删除(注册表啥的,小心,细心),重新安装. tips:彻底删除SQL Server应用及组 ...

  8. 1011.Django状态保持以及表单

    一.session保持状态 状态保持: 1. http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态: 2. 客户端与服务器端的一次通信,就是一次会话实现状态保持的方式:在客户端或服 ...

  9. 鲁迅文集 第3卷 而已集 华盖集续编 华盖集 热风\四十一.md

    目录 导读 正文 导读 本篇首次发表于1919年1月15日<新青年>第六卷第一号.署名唐俟.   文章以生物进化的事实,驳斥旧势力对改革者的嘲讽,号召青年蔑视反改革者的冷笑和暗箭,&quo ...

  10. 1022 Digital Library (30分)

    本题题意很好读,看上去也不难写 写完运行才发现输出title只有一个单词... 后来把cin >> t换成了getline(cin, t) 还有一个坑点: Line #1: the 7-d ...