线性规划与单纯形算法描述


\end{align}" />

在满足(2)、(3)式约束条件时求解(1)式最大值的问题称为线性规划问题

线性规划的形式多样,但都可以转化成上述的形式,上面的形式被称为线性规划的标准型

标准型的矩阵形式:

同样在满足除(1)式之外所有其他式约束条件时求解(1)式最大值(后面相似的式子也是这样理解,不再作说明)

下面引用自算法导论:

考虑下面具有两个变量的线性规划:


x_1+x_2\protect\4x_1-x_2\leq 8\protect\2x_1+x_2\leq 10\protect\5x_1-2x_2\geq -2\protect\x_1,x_2\geq 0
\end{align}" />

几何化如下:

这个灰色的凸形区域称为可行区域,希望最大化的函数称为目标函数 。 概念上,我们可在可行区域内每个点上对目标函数 求值;我们将目标函数在一个特定点上的值称为目标值。我们可以找出一个有最大目标值的点作为最优解。

  在二维中,我们可以通过一个图形化的步骤求最优解。对任意给定的在z, 上点的集合是斜率为-1的一条直线。z作变量,让  在坐标系上的可行区域移动来取得z的最大值,如下图:

得到  。

  虽然不容易用图形表示超过两个变量的线性规划,但是同样的直觉仍然成立。如同在二维空间一样,因为可行区域是凸的(为什么?),取得最优目标值的点集合必然包含可行区域的一个顶点。类似地,如果有n个变量,每个约束定义了n维空间中的一个半空间。我们称这些半空间的交集形成的可行区域为单纯形。目标函数现在是一个超平面,并且因为它的凸性,一个最优解仍在单纯性的一个顶点上取得。

可行区域是凸的证明:


c^Tx\protect\Ax\leq b\protect\x\geq 0
\end{align}" />

设可行区域为S,在S上任取两个点  ,有


& Ax_1\leq b,Ax_2\leq b\protect\& A(ax_1+(1-a)x_2)=a*Ax_1+(1-a)Ax_2\leq a*b+(1-a)*b=b\protect\& A(ax_1+(1-a)x_2)\leq b\protect\& A(ax_1+(1-a)x_2)\in S
\end{align*}" />

又由凸集的定义,可知S为凸集。

PS:一个凸区域的直观解释是,该区域的任意两点之间连一条线段,线段上的点也全在该区域中。

  单纯形算法以一个线性规划作为输入,输出一个最优解。它从单纯形的某个顶点开始,执行顺序迭代。在每次迭代中,它沿着单纯形的一条边从当前顶点移动到一个目标值不小于(通常是大于)当前顶点的相邻顶点。当达到一个局部的最大值,即存在一个顶点,所有相邻顶点的目标值都小于该顶点的目标值,单纯形算法终止。因为可行区域是凸的,且目标函数是线性的,所以该局部最优实际上是全局最优的。

  虽然我们用几何方法很直观地描述了单纯形算法,但实际上是先将给定的线性规划写成松弛形式,即线性等式的集合。然后从代数角度进行运算。

 

  写博客是很花时间的一件事。。。。以后有空的话会补充单纯形算法实际工作过程与实现方法。

时间: 2024-10-10 11:26:29

线性规划与单纯形算法描述的相关文章

单纯形算法详细解析

线性规划(Linear Programming,LP)是非常经典的算法之一,而解决该问题的最常用方法是单纯形法.本博文致力于用最简单.最详细的语言一步步解释单纯形算法的过程并加以详细的解释. 中学课程里,我们都简单地接触过线性规划,那时候一般都是分析每个约束,在二维平面上画出直线,得到可行域,然后以固定斜率作出目标函数直线,在可行域内移动直线,在y轴上的截距就是最优解.而往往最优解的地方是通过(凸)可行域的顶点.就像下面这个例子: \[ \begin{equation} \begin{split

标准的Base64算法描述

作者:zhanhailiang 日期:2014-12-19 算法描述: Base64要求把每三个8Bit的字节转换为四个6Bit的字节(38 = 46 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3. 第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一个目标字符. 然后将第一个字符与0x03(00000011)进行与(&)操作并左移4位,接着第二个字符右移4位与前者相或(|)

鸽巢排序算法描述和代码举例

//鸽巢排序//适用条件:所有取值的范围确定,并且在这个范围内个元素的出现频率较高.//算法描述:为取值范围内的各个可能取到的元素建巢用一维数组表示,巢中//    巢中存放该元素出现的个数(通过遍历待排序数统计存入).按照巢的//    顺序和巢中元素个数列出该有序序列.//算法空间复杂度为:S(1)时间复杂度为:O(n). //例:20个非负数,其中每个数的取值范围为1~9. #include<iostream>#include<time.h>using namespace s

挖掘相关规则的算法描述

Mining Assocaition rule algrothm(挖掘相关规则的算法) 此算法中有两个关键参数,coverage(表示预测正确的案例个数,此参数用来筛选哪些实例个数大于或等于这个值得相关规则) accuracy(表示预测数据的精确度,此参数实际上是满足相关规则的实例的个数/满足规则前部分条件的实例个数) A  找到满足coverage参数的所有项数的规则集合算法描述 把1赋给变量k 找到所有的满足coverage数量的k项规则集合,并且把它们保存到哈希表#1中 while 发现一

十大经典排序算法的算法描述和代码实现

这里详细讲解了十大经典算法的分类,例如交换排序.插入排序.选择排序等比较类排序,以及计数排序.桶排序和基数排序的非比较类排序,分析了各种排序算法的复杂度和稳定性,还有JAVA代码的详细实现.对冒泡排序.插入排序.选择排序和堆排序等十种算法进行了详细的思想总结. 一.算法概述 1.算法分类 十种常见排序算法可以分为两大类:(1)比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn)因此也称为非线性时间比较类排序.(2)非比较类排序:不通过比较元素间的相对次序,它可以突

插入排序的算法描述和分析

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法. 它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上, 通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中, 需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间. 时间复杂度:最佳为o(n):因为如果是已经排序好的序列话,它每次只需和前面已排序好的序列比较一次,总共比较n次,也是可以通过flag实现的,然后最差时

线性规划(Simplex单纯形)与对偶问题

线性规划 首先一般所有的线性规划问题我们都可以转换成如下标准型: 但是我们可以发现上面都是不等式,而我们计算中更希望是等式,所以我们引入这个新的概念:松弛型: 很显然我们最后要求是所有的约束左边的变量都不小于0.而求解这类问题,我们又有一套十分便利的模型算法:单纯形 基变量:松弛型等式左边的所有变量 非基变量:松弛型等式右侧的所有变量 基本解:一组基变量和非基变量蕴含着一组基本解,即所有的非基变量都为0,基变量都为等式右侧的常数项(这里要求常数项为正,为负时我们后面讨论) 算法原理: 可证线性规

算法描述》关于SPFA和Dijkstra算法的两三事

本来我是想把这两个算法分开写描述的,但是SPFA其实就是Dijkstra的稀疏图优化,所以其实代码差不多,所以就放在一起写了. 因为SPFA是Dijkstra的优化,所以我想来讲讲Dijkstra. 什么是Dijkstra Dijkstra是一种求单源最短路的基础算法,时间复杂度在不加堆优化的情况下是o(n^2)的,加了堆优化就能简化到o(nlogn),而且算法稳定性很强(从这点上来说比SPFA好多了,具体怎么好下面再讲),基础思路如下: 首先,把所有点到源的距离设为最大,然后把源加入队列,接着

论文中的算法描述 By 薛磊

在写论文的过程中,我们经常需要描述一些算法,如何描述才能清晰.美观.易读.无歧义? 薛磊从<Writing for computer science>中整理了一份PPT,介绍几种常见的算法描述方法. 下面是下载链接: Algorithms_writing.pdf