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

线性规划

首先一般所有的线性规划问题我们都可以转换成如下标准型

但是我们可以发现上面都是不等式,而我们计算中更希望是等式,所以我们引入这个新的概念:松弛型

很显然我们最后要求是所有的约束左边的变量都不小于0。而求解这类问题,我们又有一套十分便利的模型算法:单纯形

基变量:松弛型等式左边的所有变量

非基变量:松弛型等式右侧的所有变量

基本解:一组基变量和非基变量蕴含着一组基本解,即所有的非基变量都为0,基变量都为等式右侧的常数项(这里要求常数项为正,为负时我们后面讨论)

算法原理:

可证线性规划的解空间是一个凸形区域,也就是说全局最优解只有一个,或者同时有多个平行的最优解。由上性质我们可以知道,局部最优解一定时全局最优解,这就是单纯形的算法思想。

算法过程:

转轴操作:选择一个基变量和非基变量,将其互换

simplex操作:主过程,从一个基本解出发,经过一系列的转轴操作,找到最优解

举例:

求解如下问题:

第一步:互换x1与x6

第二步:互换x3与x5

第三步:互换x2与x3

此时我们得到的基本解:(x1, x2, x3, x4, x5, x6) = (8, 4, 0, 18, 0, 0),易验证就是最后的最优解

算法伪代码:

1 def Simplex(A, b, c):
2     initialization(A, b, c)
3     while there is e that Ce > 0 do:
4         find the index l that Ale > 0 and minimizes bi/Ale
5         if all l, Ale <= 0 then:
6             return Unbounded
7         else:
8             pivot(A, b, c, l, e)

其中我们发现有一个“initialization”函数就是用于处理我们的bi<0的情况,它的做法是引入一个辅助的线性规划:

这样经过一次转轴操作以后,第l个约束变为:

其余的变为:

易知此时对于新的bi满足都不小于0

对偶问题

定义:

用矩阵表示更形象,而且也更利于我们后期的计算与理解:

因此我们在面对这类问题时可以考虑它们之间的相互转化。这里不加证明给出一下定理:

互为对偶问题的两组最优解相等

后续更新Simplex算法的python实现……

时间: 2024-10-17 01:58:57

线性规划(Simplex单纯形)与对偶问题的相关文章

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

\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\

[线性规划 对偶原理 单纯形] BZOJ 3265 志愿者招募加强版

就是个裸题了 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #define cl(x) memset(x,0,sizeof(x)) using namespace std; typedef long long ll; inline char nc() { static char buf[100000],*p1=buf,*p2=buf; if (p1==p2)

UOJ#179. 线性规划[模板]

传送门 http://uoj.ac/problem/179 震惊,博主竟然还不会线性规划! 单纯形实在学不会啊……背个板子当黑盒用…… 学(chao)了NanoApe dalao的板子 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 using namespace std; 7 const d

带约束优化问题 拉格朗日 对偶问题 KKT条件

转自:七月算法社区http://ask.julyedu.com/question/276 咨询:带约束优化问题 拉格朗日 对偶问题 KKT条件 关注 | 22 ... 咨询下各位,在机器学习相关内容中,每次看到带约束优化问题,总是看到先用拉格朗日函数变成无约束问题,然后转成求拉格朗日对偶问题,然后有凸函数假设,满足KKT条件时原问题最优解和对偶问题最优解等价. 每次看到这个,总不是很理解为什么要这么做?为什么首先转为无约束问题(这个相对好理解一点,因为容易处理)为什么拉格朗日函数无约束问题要转变

BZOJ3112 [ZJOI2013]防守战线

Description 战线可以看作一个长度为 n 的序列,现在需要在这个序列上建塔来防守敌兵,在序列第 i号位置上建一座塔有 Ci 的花费,且一个位置可以建任意多的塔费用累加计算.有 m个区间[L1, R1], [L2, R2], -, [Lm, Rm],在第 i 个区间的范围内要建至少 Di座塔.求最少花费. Input 第一行为两个数n,m. 接下来一行,有 n个数,描述 C数组. 接下来 m行,每行三个数 Li,Ri,Di,描述一个区间. Output 仅包含一行,一个数,为最少花费.

GJK(Gilbert–Johnson–Keerthi) 判断任意凸图形是否重叠

参考:http://www.dyn4j.org/2010/04/gjk-gilbert-johnson-keerthi/ 和SAT(分离轴)法一样, GJK可以判断两个凸图形是否重叠. 比起SAT, GJK优在用同一套办法可以处理所有的图形, 而SAT判断某两种不同图形(多边形-多边形/多边形-圆形/圆形-圆形等)都要区别处理. GJK原理: 如果两个凸图形的闵可夫斯基差包含原点, 那么这两个图形重叠. 所以问题转变成判断一个闵可夫斯基差图形是否包含原点. 闵可夫斯基和就是把两个图形里的点都当作

想从事数据科学相关岗位,这些数学基础“必备”

很多同学想从事数据科学岗位,对于这个岗位而言,数学知识的储备重要吗? 答案显而易见,掌握好数学对于从事该岗位而言是很重要的.数学一直是任何当代科学学科的基础,几乎所有的现代数据科学技术(包括所有的机器学习)都有一些深刻的数学知识.在本文中,我们将讨论想成为一名优秀的数据科学家应该掌握的基本数学知识,以便在各个方面都能很好地适应. 介绍 有时候,作为一名数据科学家(甚至是团队的初级分析师),你必须全心全意地学习那些基础的数学知识,或者正确地应用这些技术,有时候你可以通过使用一些API或者拿来即用的

大数据科学相关岗位,需要具备哪些数学基础?

在不久的将来,大智时代一定会彻底走入我们的生活,多智时代专注于人工智能.大数据.云计算和物联网的入门学习和科谱资讯,让我们一起携手,引领人工智能的未来 数据科学相关岗位要具备哪些数学基础?想成为一名顶级的数据科学家还需要掌握其他领域的知识,比如编程能力.具有一定的商业头脑,以及对数据的独特分析和好奇心态. 有时候,作为一名数据科学家(甚至是团队的初级分析师),你必须全心全意地学习那些基础的数学知识,或者正确地应用这些技术,有时候你可以通过使用一些API或者拿来即用的算法完成相关任务.大数据科学相

干货 | 自适应大邻域搜索(Adaptive Large Neighborhood Search)入

01 首先来区分几个概念 关于neighborhood serach,这里有好多种衍生和变种出来的胡里花俏的算法.大家在上网搜索的过程中可能看到什么Large Neighborhood Serach,也可能看到Very Large Scale Neighborhood Search或者今天介绍的Adaptive Large Neighborhood Search. 对于这种名字相近,实则大有不同的概念,很是让小编这样的新手头疼.不过,小编喜欢凡事都要弄得清清楚楚明明白白的.为了防止大家混淆这些相