线性规划(LP)问题
约束最优化——线性规划(LP)问题
1 线性规划
约束优化问题:给定约束条件和目标函数,计算约束条件下目标函数的最大(最小)值。
目标函数和约束条件都是线性函数的情况,称为线性优化问题(LP问题)。此外,还有非线性优化问题。
线性规划问题有4个可能的情况:
1.唯一解:目标函数对应的直线与可行解空间相交于一点;
2.有无穷多个最小值解:目标函数所对应的直线与某个约束线精确垂直(图15-2(a)所示);
3.没有可行解:构建的线性规划问题的可行解域为空集,没有可行解(图15-2(b)所示);
4.无边界问题:可行解域是无界的(图15-2(c )所示)。
本文主要讨论有界线性规划问题求解(就是第1和第2种情况),对于无界线性规划问题,会在本文1.2.3 无界线性规划问题中简单提到。
1.1 图解法(计算机不适用,便于理解)
以下面的例子来讲。
约束条件如下:
目标函数为:
解:画图如下,图中对每个约束进行了编号,以便在以下的图解方法中识别它们。
让Z值不停地增大,直到再次增大Z值,使目标超出了可行区域为止。图15-1(b)显示了该变化过程,得到Z的最大值为1400。
优缺点:计算机不适用,且只能处理二维三维问题。但是便于理解,解释概念。
启示:由上述过程可以看到,最优解通常在两个约束线交汇的一个角点出现。这个点称为极点。
因此,对于有界规划问题,最优解可以使用穷举法来比较每个可行极点的目标函数值来得到。
1.2 单纯形法
由图解法得到的启示,有界线性规划的极点都是出现在两个约束线交汇的角点。由此我们可以想办法计算每个可行的极点,然后取这些极点中最大的目标函数值,就得到线性规划问题的最优解。
为了更容易理解单纯形法,下面我结合一个例子,来讲解单纯形法的思路和实现过程。
对于有界线性规划问题,我们可以想办法计算每个约束线交汇的交点,然后取这些交点中最大的目标函数值,就得到线性规划问题的最优解。
首先我们引入松弛变量。引入松弛变量使所有约束方程从不等式变成等式。
举例来说,对于约束
可以定义一个松弛变量S1,将其加到约束条件的左边,得到如下关系:
分析一下松弛变量:
如果它是正数,表示我们在这个约束条件下还有些放松的余地,还有一些资源没有完全使用。
如果它是负数,表示我们己经超过了这个约束条件。如果它是零,表示我们刚好达到这个约束条件。
以这样一组不等式为例来说明:
目标函数为:
其可行解域如下图所示:
两个约束线的交点,称为极点。有些极点在可行解域外(如F),予以忽略;
有些在可行解域边界上,这样的就是可行极点(如ABDCE)。
只要我们计算出所有可行极点处的目标函数值,取其中最大的,就能得到线性规划问题的最优解。
如何得到各个极点的坐标?
对每个约束方程引入一个不同的松弛变量,最终约束优化问题变为下面的形式:
在上述方程组中,加上松弛变量,共有6个变量,但是只有4个方程。该方程组是欠定的。
未知数个数和方程个数之差(本例中为2)直接关系到如何识别可行极点。
由于本例中未知数个数和方程个数之差为2,因此必须固定其中2个变量,令其为0,然后通过解方程组计算其余变量的值。这样就能得到其中一个极点。
例如,上述方程组中,我们令x1和s4为0,于是得到方程组:
可以解出:得到x2=6,S1=11,S2=32和S3=9。对应了极点E点。
同样,令x1和x2为0,对应A点;x1和S2为0,对应B点;
S1和S2为0,对应C点;S1和S4为0,对应D点。
6个参数,两两参数为0,组合起来共有15种情况,对应15个点。
但其中只有ABCDE的5个点是可行极点,其余的都是无效的极点。
如果计算所有的极点,必然导致效率较低。那么,能否只计算那些可行的极点?
答案是,当然可以。
如何计算那些可行的极点?
总结一下上面的过程,先设置n-m个变量为0,然后求解剩下的m个变量m个等式的方程组。
这里,我们将取零值的变量一般称为非基本变量,其他m个变量称为基本变量。
如果所有的基本变量是非负的,那么这个结果称为基本可行解。最优解就是这些基本可行解中的一个。
单纯形法 就是,先找到求出一个基本可行解,然后逐渐增加目标函数值,求出其他基本可行解,最终达到最优解,同时算法终止。
第一步,先找到一个基本可行解,令x1=x2=0,得到方程组:
用高斯-约当法解方程组,得到解为:S1=77,S2=80,S3=9和S4=6。
目标函数可以表示为:
目标函数值为:Z = 0。
第二步,移动到一个能使目标函数值增大的新可行解。很明显,增加当前非基本变量〔在这里是x1和x2)的值,Z值就会增大。
这里定义:把一个非基本变量变成基本(非零)变量,这个变量称为“进基变量〔entering rrariable)”。在处理过程中,如果一个基本变量变成非基本(零值)变量,该变量则称为“退基变poleaxing variable) "。
一般把最大负数值系数的变量选择为进基变量,因为这常常能使Z值的增加量最大。在本例中,由于x1的系数-175比x2的系数-150更小,所以x2成为进基变量。
这里,选择x2成为进基变量。选择哪个为退基变量呢?
我们需要计算上一步中,等号右边的值与x2的系数的比值,其实就是当前方程组在x2轴上的截距:
上述方程组的截距分别为:77/11=7;80/8=10;9/0=∞;6/1=6;
其中,最小截距为S4为基本变量的这个方程,因此将S4作为退基变量。其实就是相当于在可行解域图中找到了x 2 x_2x2轴上的截距最小的那个点,就是E点。
第三步,x2成为进基变量,S4作为退基变量后,用S4的方程作为主元行,消去方程组其他方程中的x2的系数,得到新的方程组:
同时也消去目标函数中的x 2 x_2x2的系数,得到目标函数为:
目标函数值为:Z = 1050。
第四步,重复上面第二步和第三步的方法,直到目标函数行不存在为负数的系数,结束。此时就是最优解。
目标函数方程
中,系数为负值的只有x1了,因此选取x1作为进基变量。
计算截距,77/11=7,32/10=3.2,9/1=0,6/0=∞ \infty∞;因此选第二个方程,S4已经是退基后的变量了,因此选S2作为退基变量。(此时,对应于可行解域图中D点。)
于是,用第二个方程作为主元行,消去x 1 x_1x1的系数,得到新的方程组,以及新的目标函数。
然后,再重复一次进基和退基之后,就能找到可行解域图中C点。然后消去得到新的方程组,以及新的目标函数后,目标函数中所有的系数都没有负数了,结束。此时,就得到最优解,就是在C点的位置。
参考文献:线性规划(LP)问题求解——单纯形法_lp松弛-CSDN博客
单纯形法:适用于约束条件和变量数目都很多的情况;对于变量数量较少的情况,以下介绍的计算几何的方法效率会更高。
1.3 计算几何的方法(待更新)
对于两个变量的线性规划问题,下面介绍的方法会更适用。不过这里面的会用到一些计算几何方面的知识。
1.3.1 分治式算法
对于线性规划问题,我们可以直接计算所有约束的可行解域(feasible region)。然后根据可行解域的边界交点,计算得到线性规划问题的最优解。
计算可行解域的最直接的方法,就是分治式算法,可计算任意 n 个约束的公共交集。算法伪代码如下:
INTERSECTHALFPLANES(H)
1.如果约束集H中约束的个数为1,返回;否则将约束集H分成两个子集H1和H2 ,大小分别为n/2;
2.如果子集H1中约束的个数大于1,调用INTERSECTHALFPLANES(H),继续将子集一分为二;
3.如果子集H1中约束的个数大于1,调用INTERSECTHALFPLANES(H),继续将子集一分为二;
4.否则,调用IntersectConvexRegions(H1 , H2)。
其中的子函数IntersectConvexRegions(H1 , H2)为计算两个凸多边形交集的算法。方法思路如下:
结论:函数IntersectConvexRegions(H1 , H2),可以 O(n)时间内计算出任意两个凸多边形的交集。
结论:给定平面上的一组共 n 个约束,可以使用线性的空间,在 O(nlogn)时间内计算出其公共的交集。
1.3.1 递增式算法
1.3.2 随机递增式算法
改进的平面扫描算法: 随机平面扫描算法。
1.3.3 无界线性规划问题*
无界线性规划问题。
参考文献:
最优化方法笔记3:约束最优化——线性规划(LP)问题_线性优化约束问题例题-CSDN博客
线性规划(LP)问题求解——单纯形法_lp松弛-CSDN博客
线性规划(LP)问题的更多相关文章
- 【Python代码】混合整数规划MIP/线性规划LP+python(ortool库)实现
目录 相关知识点 LP线性规划问题 MIP混合整数规划 MIP的Python实现(Ortool库) assert MIP的Python实现(docplex库) 相关知识点 LP线性规划问题 Linea ...
- 机器学习-线性规划(LP)
线性规划问题 首先引入如下的问题: 假设食物的各种营养成分.价格如下表: Food Energy(能量) Protein(蛋白质) Calcium(钙) Price Oatmeal(燕麦) 110 4 ...
- yalmip + lpsolve + matlab 求解混合整数线性规划问题(MIP/MILP)
最近建立了一个网络流模型,是一个混合整数线性规划问题(模型中既有连续变量,又有整型变量).当要求解此模型的时候,发现matlab优化工具箱竟没有自带的可以求解这类问题的算法(只有bintprog求解器 ...
- matlab 求解线性规划问题
线性规划 LP(Linear programming,线性规划)是一种优化方法,在优化问题中目标函数和约束函数均为向量变量的线性函数,LP问题可描述为: minf(x):待最小化的目标函数(如果问题本 ...
- Matlab随笔之线性规划
原文:Matlab随笔之线性规划 LP(Linear programming,线性规划)是一种优化方法,在优化问题中目标函数和约束函数均为向量变量的线性函数,LP问题可描述为:min xs.t. ...
- Computer Science Theory for the Information Age-4: 一些机器学习算法的简介
一些机器学习算法的简介 本节开始,介绍<Computer Science Theory for the Information Age>一书中第六章(这里先暂时跳过第三章),主要涉及学习以 ...
- 凸优化(Convex Optimization)浅析
本博客已经迁往http://www.kemaswill.com/, 博客园这边也会继续更新, 欢迎关注~ 在机器学习中, 很多情况下我们都需要求得一个 问题的全局最优值(global optimum) ...
- 多目标跟踪笔记三:Global Data Association for Multi-Object Tracking Using Network Flows
Abstract 针对用于多目标跟踪的数据关联(data association),本文提出了一种基于网络流(network flow)的优化方法.将最大后验概率(maximum-a-posterio ...
- 04-拉格朗日对偶问题和KKT条件
04-拉格朗日对偶问题和KKT条件 目录 一.拉格朗日对偶函数 二.拉格朗日对偶问题 三.强弱对偶的几何解释 四.鞍点解释 4.1 鞍点的基础定义 4.2 极大极小不等式和鞍点性质 五.最优性条件与 ...
- 对偶理论、拉格朗日对偶问题、LP线性规划对偶性质
Lagrange 对偶问题 定义其的对偶问题: Lagrange函数 考虑线性规划问题 若取集合约束D={x|x≥0},则该线性规划问题的Lagrange函数为 线性规划的对偶问题为: 对偶定理原问题 ...
随机推荐
- java模拟并发请求工具类(测试专用)
1.背景 实际生产中,我们开发好接口后可能会简单的压力测试一下,也就是说模拟并发测试,测试工具类如下: 2.工具类 package tentative.normal.other; import cn. ...
- Apache DolphinScheduler数仓任务管理规范
前言: 大数据领域对多种任务都有调度需求,以离线数仓的任务应用最多,许多团队在调研开源产品后,选择Apache DolphinScheduler(以下简称DS)作为调度场景的技术选型.得益于DS优秀的 ...
- git忽略文件夹中除了指定的文件外的其他所有文件
**/test/* !**/test/a.py
- 嵌入式工程师到底要不要学习ARM汇编指令?arm学习文章汇总
嵌入式工程师到底要不要学习ARM汇编指令? 网上搜索这个问题,答案很多,大部分的建议是不要学汇编,只要学C语言. 而一口君作为一个十几年经验的驱动工程师,个人认为,汇编语言还是需要掌握的,想要搞精.搞 ...
- Linux内核 自旋锁spin lock,教你如何用自旋锁让ubuntu死锁
背景 由于在多处理器环境中某些资源的有限性,有时需要互斥访问(mutual exclusion),这时候就需要引入锁的概念,只有获取了锁的任务才能够对资源进行访问,由于多线程的核心是CPU的时间分片, ...
- locale 设置
locale 介绍 在终端中,locale(本地化)设置是指与本地语言.国家和文化偏好有关的环境变量的配置.这些设定决定了程序如何处理和显示字符.时间.日期格式.货币等. 在类 Unix 系统(比如 ...
- vue 根据div id 滚动到指定view到可视视图中
<div id="name" @click="scrollToViewById('name')"> ...... </div> scro ...
- ERROR: Could not determine java version from 'JavaVersion.VERSION_1_8'.
写法原为: compileOptions { sourceCompatibility 'JavaVersion.VERSION_1_8' targetCompatibility 'JavaVersio ...
- SpringBoot 引入 WebSocket
maven 添加websocket ,按照一篇博文引入 websocket https://www.cnblogs.com/likun10579/p/5450209.html 在浏览器控制台测试是否连 ...
- CSS & JS Effect – Section Design Waves
介绍 Section Waves 长这样 左边是没有 waves, 右边是加了 waves. 它的作用就是点缀. 让画面有一点 "Design" 的感觉. 参考 You ...