首页 > 其他分享 >线性规划与对偶

线性规划与对偶

时间:2024-02-26 15:35:52浏览次数:27  
标签:mathbf 线性规划 cdots && forall aligned 对偶

感谢 lcw 学长的 blog,讲的很清晰,受益匪浅。

本文使用大量非正式语言,如有需要可以去看原论文。

定义

称形如 \(f(x_1,\cdots,x_n)=\sum\limits_{i=1}^n a_ix_i\) 的函数为线性函数。

称 \(f(x_1,\cdots,x_n)\ge b,f(x_1,\cdots,x_n)= b,f(x_1,\cdots,x_n)\le b\) 为线性约束。

称满足所有限制的解 \((x_1,\cdots,x_n)\) 为可行解,使目标函数达到最优的可行解称为最优解,所有可行解构成的区域为解空间。

标准型线性规划

形如

\[\begin{aligned} \max&&\sum_{j=1}^nc_{j}x_j\\ \text{s.t.}&&\sum_{j=1}^na_{i,j}x_j&\leq b_i&&\forall i\in[1,m]\\ &&x_j&\geq 0&&\forall j\in[1,n] \end{aligned}\]

的问题为标准型线性规划。

可用矩阵表示为

\[\begin{aligned} \max&&\mathbf c^T\mathbf x&\\ \text{s.t.}&&\mathbf A\mathbf x&\leq \mathbf b\\ &&\mathbf x&\geq 0 \end{aligned}\]

松弛型线性规划

形如

\[\begin{aligned} \max&&&\sum_{j=1}^nc_jx_j\\ \text{s.t.}&&x_{i+n}&=b_i-\sum_{j=1}^na_{i,j}x_j&&\forall i\in[1,m]\\ &&x_j&\geq 0&&\forall j\in[1,n+m] \end{aligned}\]

的问题为松弛型线性规划。

容易将标准型线性规划转化为松弛型线性规划

单纯形

单纯形算法是一种解决松弛型线性规划的算法。

\[\begin{aligned} \max&&&\sum_{j=1}^nc_jx_j\\ \text{s.t.}&&x_{i+n}&=b_i-\sum_{j=1}^na_{i,j}x_j&&\forall i\in[1,m]\\ &&x_j&\geq 0&&\forall j\in[1,n+m] \end{aligned}\]

称 \(x_1,\cdots,x_n\) 为基变量,称 \(x_{n+1},\cdots,x_{n+m}\) 为非基变量。

定义转轴操作 \(\text{pivot}(i,j)\),以实现一个交换基变量和非基变量的效果。具体地,将 \(x_{i+n}=b_i-\sum\limits_{j=1}^n a_{i,j} x_j\) 改写为 \(x_j=\dfrac{b_i}{a_{i,j}}-\sum\limits_{k\ne j} \dfrac{a_{i,k}}{a_{i,j}}x_k-\dfrac{1}{a_{i,j}}x_{i+n}\),将其他式子中的 \(x_j\) 如是替换即可。

算法流程如下。先假设 \(b_i\) 均非负。

初始显然有一可行解 \(\forall i\in[1,n+m],x_i=0\)。此时答案为 \(0\)。

不断执行如下操作,找到一个 \(j\) 满足 \(c_j>0\),然后:

  • 若 \(\forall i\in[1,m],a_{i,j}\le 0\),此时可令 \(x_j=-\infty\),可使答案为正无穷且符合所有约束,故答案无界。
  • 若 \(\exists i\in[1,m],a_{i,j}>0\),找出所有 \(a_{i,j}>0\) 中 \(\dfrac{b_i}{a_{i,j}}\) 最小的 \(i\),执行 \(\text{pivot}(i,j)\),考虑 \(b\) 的非负性是否仍然满足。考虑 \(k\ne i\),若 \(b'_k< 0\) 即 \(b_k-a_{k,j}\dfrac{b_i}{a_{i,j}}<0\),显然 \(a_{k,j}>0\),于是 \(\dfrac{b_k}{a_{k,j}}<\dfrac{b_i}{a_{i,j}}\),这与 \(\dfrac{b_i}{a_{i,j}}\) 最小矛盾。这次转轴操作会使答案增加 \(c_j\frac{b_j}{a_{i,j}}\)。

若 \(\forall j\in[1,n],c_j\le 0\),则解 \(\forall i\in[1,n+m],x_i=0\) 为最优解,原线性规划问题的答案即为所有转轴操作累加的答案。

算法理论复杂度上界是指数级的,期望时间复杂度 \(O(nm^2)\)。

关于算法的正确性,引用 lcw 博客的一段:

考察一个线性规划的解空间,这个解空间是多个线性不等式解空间的交。可以证明每个线性不等式的解空间都是一个凸形区域(凸形区域的一个直观定义是,区域内任意两点连线上的点都属于这个区域),那么它们的交也是一个凸形区域。

因为解空间是凸形的,所以考虑在解空间内从一个初始解开始,进行爬山算法,这样所找到的局部最优解一定是全局最优解,因为 “山顶” 只有一个。

我们还没解决存在 \(b_i\) 为负数的情况,考虑辅助线性规划

\[\begin{aligned} \max&&&-x_0\\ \text{s.t.}&&x_{i+n}&=b_i-\sum_{j=1}^na_{i,j}x_j+x_0&&\forall i\in[1,m]\\ &&x_j&\geq 0&&\forall j\in[0,n+m] \end{aligned}\]

我这里也完全没看懂,直接把 lcw 的解释贺上来。

显然,若 \((x_1,\cdots,x_{n+m})\) 是原线性规划的一组可行解,那么辅助线性规划的最优解 \((x_0,\cdots,x_{n+m})\)
应当使 \(x_0=0\)
。另一方面,若辅助线性规划的最优解 \((x_0,\cdots,x_{n+m})\)
满足 \(x_0=0\)
,那么 \((x_1,\cdots,x_{n+m})\) 就是一组原线性规划的可行解。

从而我们只需求出辅助线性规划的最优解即可。

而对于辅助线性规划,找到 \(i\in[1,m],b_i\) 最小的那个。然后执行转轴操作 \(\text{pivot}(i,0)\)
。此时对于任意 \(k\ne i\)

\(b'_k=b_k-b_i\ge 0\),从而转换成 \(b_k\) 均非负的线性规划问题。

namespace Simplex {
	double a[N][N], b[N], c[N];
	double ans;
	int n, m;
	void pivot(int l, int e) {
		b[l] /= a[l][e];
		for(int j = 1; j <= n; j++)
			if(j != e) a[l][j] /= a[l][e];
		a[l][e] = 1 / a[l][e];
		for(int i = 1; i <= m; i++)
			if(i != l && fabs(a[i][e]) > 0) {
				b[i] -= a[i][e] * b[l];
				for(int j = 1; j <= n; j++)
					if(j != e) a[i][j] -= a[i][e] * a[l][j];
				a[i][e] = -a[i][e] * a[l][e];
			}
		ans += c[e] * b[l];
		for(int j = 1; j <= n; j++)
			if(j != e) c[j] -= c[e] * a[l][j];
		c[e] = -c[e] * a[l][e];
	}
	double simplex() {
		while(1) {
			int e = n, l = 0;
			for(; e; e--)
				if(c[e] >(double)0) break;
			if(!e) return ans;
			double mn = 1e18;
			for(int i = 1; i <= m; i++)
				if(a[i][e] > (double)0 && mn > b[i] / a[i][e])
					mn = b[i] / a[i][e], l = i;
			if(mn == 1e18) return 1e18;
			pivot(l, e);
		}
	}
} using namespace Simplex;

对偶

标准型线性规划形如

\[\begin{aligned} \max&&\mathbf c^T\mathbf x&\\ \text{s.t.}&&\mathbf A\mathbf x&\leq \mathbf b\\ &&\mathbf x&\geq 0 \end{aligned}\]

规定其对偶形式为

\[\begin{aligned} \min&&\mathbf b^T\mathbf y&\\ \text{s.t.}&&\mathbf A^T\mathbf y&\geq \mathbf c\\ &&\mathbf y&\geq 0 \end{aligned}\]

规定以上两种线性规划互为对偶。

弱对偶定理

在上面的定义下,有 \(\max\mathbf c^T\mathbf x\le \min\mathbf b^T\mathbf y\)。

证明较显然。

强对偶定理

在上面的定义下,有 \(\max\mathbf c^T\mathbf x= \min\mathbf b^T\mathbf y\)。

证明极为复杂。

标签:mathbf,线性规划,cdots,&&,forall,aligned,对偶
From: https://www.cnblogs.com/Terac/p/18034428

相关文章

  • 线性规划和网络流的单纯形法
    线性规划线性规划问题求\[\max\sum_{i=1}^nc_jx_j\\\text{s.t.:}\\\sum_{t=1}^na_{it}x_t\leb_i,i\in\Z\cap[1,m_1]\\\sum_{t=1}^na_{it}x_t=b_i,i\in\Z\cap(m_1,m_1+m_2]\\\sum_{t=1}^na_{it}x_t\geb_i,i\in(m_1+m_2,m_1+m_2+m_3]\\x_......
  • 数学建模入门笔记(1)——Python pulp库解线性规划问题
    参考:Python求解线性规划——PuLP使用教程-Only(AR)-博客园(cnblogs.com)1.Definethemodelmodel=pl.LpProblem(name="",sense=pl.LpMaximize)name模型的名字sense模型的类型(pl.LpMaximize/pl.LpMinimize)2.Definethedecisionvariables用x[i]存储变量,命名为xi......
  • 非线性规划——Pyhton库的实现
    非线性规划(NonlinearProgramming,简称NLP)是一种优化问题的数学形式,其中目标函数或约束条件中至少有一个是非线性的。优化问题的目标是找到一组变量的取值,使得目标函数在满足一系列约束条件的情况下达到最小值或最大值。在非线性规划中,目标函数和约束条件可以包含平方项、绝对值、......
  • 【物理】再谈U(1)不变理论——瞬子,对偶,自发对称性破缺,拓扑与简并
    这篇笔记是上一篇笔记的扩写,主要添加了限于篇幅和水平在上一篇中没有完整阐述的禁闭相自发对称性破缺和物质场耦合的部分,这部分的讨论基本遵循陈静远老师《场论与凝聚态选题》的内容,部分思路和叙述有所改动以便于行文和补充文章内容。 由于这段时间看了一些有关anomalyinfl......
  • 【物理】U(1)不变理论,对偶,纤维丛和玻色子、费米子与光的起源
    这段时间又经历了一场生化危机,作为超级细菌养殖场的大学宿舍直接让人卧床不起。在床上躺了几天以后发现自己留下了一堆ddl。ddl太多就会让人放弃,放弃就会让人学物理。这段时间伴随着JY.Chen的《场论与凝聚态选题》课程的进行学习了一系列有关于U(1)理论的物理,并且在他的课上学到了......
  • 线性规划——Pyhton线性规划求解库PULP的使用
    PuLP是一个用于线性规划(LP)、整数线性规划(ILP)和混合整数线性规划(MILP)问题的Python库。PuLP的全称是"PythonforMathematicalProgramming",它提供了一个简单而强大的工具,使得用户能够定义优化问题、构建数学模型并使用不同的求解器进行求解。PuLP的主要特点之一是其易用性。它允许......
  • MATLAB热传导方程模型最小二乘法模型、线性规划对集成电路板炉温优化
    原文链接:https://tecdat.cn/?p=34230原文出处:拓端数据部落公众号分析师:LuoyanZhang集成电路板等电子产品生产中,控制回焊炉各部分保持工艺要求的温度对产品质量至关重要。通过分析炉温曲线,可以检查和改善产品生产质量,提高产量和解决生产问题。高效温度曲线测试系统的必要组件包......
  • Primal-Dual 原始对偶算法
    想把spfa换成dij,用Johnson里面的技巧,给予每个点一个势能\(h_u\),边\((u,v,w)\)的新边权为\(w+h_u-h_v\),为了保证其\(\geq0\)以源点为最短路跑最短路后赋值\(h_u\getsd_u\)即可。增广之后会加入反向边,考虑怎么更新势能。首先一条边的反向边被加入,其满足什么条件,然后......
  • 凸优化 | Lagrange 对偶:极大极小不等式的证明
    背景:Lagrange对偶:对于优化问题\[\begin{aligned}&\mathrm{minimize}~~&f_0(x)\\&\mathrm{subject~to}~~&f_i(x)\le0,~~h_j(x)=0\end{aligned}\]可以建立其Lagrange对偶函数\(L(x,λ,\nu)=f_0(x)+\sumλ_if_i(x)+\sum\nu_jh_j(x)\),\......
  • 数学建模__线性规划Python实现
    我使用到的是python库中scipy。'''线性规划'''#目标函数的系数#minz=2x1+3x2-5x3c=np.array([-2,-3,5])#不等式限制条件的系数,转化为小于等于#2x1-5x2+x3<=10,x1+3x2+x3<=12Aup=np.array([[-2,5,-1],[-1,-3,-1]])#必须是二维#右侧系数bup=np.array([-1......