首页 > 其他分享 >线性规划学习

线性规划学习

时间:2023-09-25 23:47:30浏览次数:44  
标签:limits 变量 bullet 线性规划 sum 学习 对偶

线性规划学习笔记

\(1\) 线性规划

定义

定义 \(1.1\)

\(\bullet\) 已知一组实数 \(a_1,a_2,\cdots,a_n\) ,以及一组变量 \(x_1,x_2,\cdots,x_n\) ,在这些变量的一个线性函数定义为 \(f(x_1,x_2,\cdots,x_n) = \sum_{i=1}\limits^n a_i x_i\) 。

\(\bullet\) 等式 \(f(x_1,x_2,\cdots,x_n)=b\) ,不等式 \(f(x_1,x_2,\cdots,x_n) \leq b\) ,\(f(x_1,x_2,\cdots,x_n) \geq b\) 统称为线性约束。

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

线性规划的性质

定义 \(1.2\) 标准型

标准型线性规划要求满足如下形式:

\(\bullet\) 最大化 \(\sum\limits_{j=1}^n c_jx_j\)

\(\bullet\) 满足约束 \(\sum\limits_{j=1}^n a_{i,j}x_j \leq\) , \(x_j \geq 0\) 。

所有线性规划问题都可以用标准型描述。

对于无限制的变量 \(x\) ,可以拆成两个变量 \(x_0,x_1\) ,使得 \(x=x_0-x_1\) 。

标准型可以用矩阵表示。

为了方便地求解线性规划,需要所有约束都是等式。

定义 \(1.3\) 松弛型

松弛型线性规划要求满足如下形式

\(\bullet\) 最大化 \(\sum\limits_{j=1}^n c_jx_j\)

\(\bullet\) 满足约束 \(x_{i+n} = b_i - \sum\limits_{j=1}^n a_{i,j}x_j\) , \(x_j \geq 0\) 。

标准型转化为松弛型是容易的。

由于每一个线性不等式的解空间都是一个凸型区域,所以整个解空间也是一个凸型区域。

所以只有一个局部最优解,因此使用一个类似爬山的算法就不用担心停滞在局部最优解。

所以就引出了单纯形法。

\(2\) 单纯形

算法描述

其核心是转轴操作,即变量的代换。

首先有一些定义:

\(\bullet\) 基变量: 在松弛型等式左侧的所有变量。

\(\bullet\) 非基变量: 在松弛型等式右侧的所有变量。

单纯形算法有两个主要的操作:转轴操作以及 \(simplex\) 操作。

而转轴操作的作用是选择一个基变量 \(x_B\) 以及一个非基变量 \(x_N\) ,将其互换(称这个非基变量为 换入变量,基变量为 换出变量)。

具体地,一开始有 \(x_B = b_i - \sum\limits_{j=1}^n a_{i,j}x_j\) ,那么 \(x_N = (b_i - \sum\limits_{j\not=N} a_{i,j}x_j -x_B) / a_{i,N}\) 。

当然,在选择 \(x_N\) 的时候要保证 \(a_{i,N} \not = 0\) 。

\(simplex\) 操作是单纯形法的主过程,从一个基本解出发,经过一系列转轴操作达到最优解。通过选择特定的换入变量以及换出变量,可以使得每次转移操作都能使目标函数增大,直到达到最优解。

即进行一次转轴后,我们也同步的将新的等式带入其他等式,然后带入我们最大化的式子,常数项显然就是我们当前维护的松弛型线性规划基本解对应的答案。

如目标函数有正的系数,那么就意味着目标函数有可能可以被进一步增大,所以我们就持续进行转轴操作直到所有系数为负。

而 转轴 操作对换入和换出变量的选取,每次选择一个在目标函数中系数为正的增大,令其为换入变量,然后考虑增大他,但增大往往有限制,我们在这些限制中选一个最紧的限制,令其基变量为换出变量,然后进行代换。

如果我们无法找到约束条件,说明这个线性规划是无界的。

关于初始化,有时候我们可能无法通过将所有非基变量赋为 \(0\) 达到寻找初始解的目的。

我们可以通过引入一个辅助线性规划:

\(\bullet\) 最大化 \(-x_0\)

\(\bullet\) 满足约束 \(x_{i+n} = b_i - \sum\limits_{j=1}^n a_{i,j}x_j+x_0\) 。

容易发现,这个线性规划的最优解中 \(x_0 = 0\) ,而达到之后,这一定构成原线性规划的可行解。

我们不能通过全部赋为 \(0\) 得到可行解,说明 \(b\) 中存在负数。我们找到最小的一个 \(b_l\) ,对第 \(l\) 个约束做转轴。

之后,第 \(l\) 个约束变为 \(x_0 = -b_l + \sum\limits_{j=1}^n a_{i,j}x_j+x_{l+n}\) ,显然满足 \(-b_l > 0\) 。

其余约束变为 \(b_{i+n} = -b_l + b_i + \sum\limits_{j=1}^n (a_{l,j} - a_{i,j})x_j+x_{l+n}\) 。显然 \(b_i - b_l \geq 0\) 。

操作之后,辅助线性规划就有一个将非基变量赋为 \(0\) 的基本解,然后对其 \(simplex\) 即可。

单纯形法的时间复杂度

不是多项式算法,但很快,不说了。

但一般线性规划问题可以在多项式复杂度解决。

\(3\) 对偶问题

论文的引入中给出了一个有意思的现象,我们尝试去用我们限制中的不等式去拟合我们的目标式子,然后可以将最小化转化为最大化的线性规划问题。

举个论文中的例子:

考虑下面的线性规划:

\(\bullet\) 最小化

\[> 7x_1+x_2+5x_3 > \]

\(\bullet\) 满足约束:

\[>x_1-x_2+3x_3\geq 10 \]

\[>5x_1+2x_2-x_3\geq 6 \]

\[>x_i\geq 0> \]

这个可以变换成如下样子:

\[7x_1 + x_2+5x_3 \geq (y_1 + 5y_2)x_1+(-y_1+2y_2)x_2+(3y_1-y_2)x_3 = f(y_1,y_2) \geq 10y_1 + 6y_2 \]

然后我们的目标就是在满足相关限制的情况下最大化 \(10y_1+6y_2\) ,惊喜地发现这也是个线性规划问题:

\(\bullet\) 最大化:

\[> 10y_1+6y_2 > \]

\(\bullet\) 满足约束

\[> y_1 + 5y_2 \leq 7 \]

\[> -y_1 + 2y_2 \leq 1 \]

\[> 3y_1 - y_2 \leq 5 \]

\[> y_i \geq 0 > \]

我们称初始的线性规划为 原问题,新得到的线性规划为 对偶问题。我们对对偶问题再对偶一次其实就是原问题。也就是说一个最大问题可以对偶成最小问题,最小问题也可以对偶成最大问题。

下面给出形式化定义:

定义6.1 对偶问题

给定一个原始线性规划:

\(\bullet\) 最小化 \(\sum\limits_{j=1}^n c_jx_j\)

\(\bullet\) 满足约束 \(\sum\limits_{j=1}^n a_{i,j}x_j \geq b_i\) , \(x_j \geq 0\) 。

定义它的对偶线性规划为:

\(\bullet\) 最大化 \(\sum\limits_{i=1}^m b_iy_i\)

\(\bullet\) 满足约束 \(\sum\limits_{i=1}^m a_{i,j}y_i \leq c_j\) 。

结合引子中的例子,这是容易理解的。

线性规划对偶性

哦,这一段论文阐述了这个对偶过程正确性。我知道它很正确啦!

互松弛定理: 若 \(x,y\) 分别是原问题及对偶问题的可行解,那么 \(x,y\) 都是最优解 当且仅当 下列两个条件被同时满足:

\(\bullet\) 对于所有 \(1 \leq j \leq n\) 满足 \(x_j = 0\) 或 \(\sum\limits_{i=1}^m a_{i,j}y_i = c_j\) 。

对于所有 \(1 \leq i \leq m\) 满足 \(y_i = 0\) 或 \(\sum\limits_{j=1}^n a_{i,j}x_j = b_i\) 。

一些经典问题的对偶

网络流最大流

这个可以由线性规划对偶直接得到。

定理:网络流最大流等于最小割。

二分图最大权匹配问题

我确实会推导力!

定理 在一张带权二分图中,最大权匹配等于最小顶标和。

定理 二分图中,最大匹配数等于最小点覆盖数。

一般来说,我们倾向于将最小顶标和转化为最大权匹配。

例题

「SHOI2004」最小生成树

一条非树边的权值必须大于与其形成圈的树边的权值,以此形成做限制形成对偶。

这实际上就是一个二分图最小顶标和问题,可以转化成二分图最大权匹配。

\(Orz the MST\)

这个与上道题很像,可以直接一样列出线性规划,然后就可以写出对偶式子,根据对偶式子可以直接建出最大费用可行流的模型了。

数据范围有点大,大概要使用势能 \(dij\) 。

「ZJOI2013」防守战线

容易发现,这个题目直接就是一个线性规划的形式,对偶完之后好看了一些,直接可以拆点费用流处理。

「BZOJ1283」序列

感觉会是一个典题。

先写出一个线性规划的形式,然后就可以直接扫一遍贪心力!

为什么不对捏。哦,原始线性规划少条件了。

对偶完其实就和志愿者招募是一样的,你说的对,但我网络流建图不太会了。

去复习了一轮!

「ZJOI2020」序列

条件是恰好变成 \(0\) 。

先直接构造线性规划。首先会有 \(O(n^2)\) 个变量。形成 \(O(n)\) 个等于的限制,最小化变量和。

线性规划感觉还是用笔做着舒服。

对偶完只剩下 \(n\) 个变量,但这些变量的取值很抽象。

也不是那么抽象,因为一些特殊区间的限制,每个位置的取值变成了 \(\{-1,0,1\}\) ,因为不能更大,更小也没有意义。

考虑 \(dp\) 套 \(dp\) ,维护三个最大后缀和,显然取值范围是 \(\{0,1\}\) 。于是就可以计算最大贡献。

线性规划是强大的。

「雅礼集训 2018 Day8」B

安装时间其实是这个有向无环图的一条最长路。这意味着所需时间其实很难描述。

这个最长路大概也可以用线性规划描述。就是按照边和每个软件包的结束时间描述,建立超源超汇即可表示答案。

于是我们就得到了一个有 \(2n\) 个变量的线性规划。不妨将其对偶一下。对偶完有 \(m + n + 1\) 个变量。

考虑二分那个单独存在的不等式的系数,那是不是可以构造费用流?

特别扭曲的形式。换个办法,我们二分最小的时间,计算最小的代价。

然后给线性规划对偶一下就可以容易地进行费用流的构建。

标签:limits,变量,bullet,线性规划,sum,学习,对偶
From: https://www.cnblogs.com/xuantianhao/p/17729150.html

相关文章

  • 学习C语言的第十一天
    写一个函数,实现一个整形有序数组的二分查找#include<stdio.h>intBinary(intarr[],intk)//这里的arr本质上是个指针{ intsz=sizeof(arr)/sizeof(arr[0]);//由于上面的是指针,所以这里sz计算的是指针的大小,在win32系统下是4,而arr[0]是一个整形的大小,也是4,所以sz=4/4......
  • 数据结构学习记录(四)
    排序一、知识要点1、选择排序简单选择排序思想:在未排序的数组中选出一个最大值或最小值与序列首位元素交换,然后在剩下未排序序列再选出最大值或最小值与第二位元素交换,依次类推,直到排序完成typedefintElementType;//太简单了我就不写注释了voidSSSort(ElementType......
  • 基于Vgg16和Vgg19深度学习网络的步态识别系统matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本MATLAB2022A 3.算法理论概述       步态识别作为生物特征识别领域的一个重要分支,在人体运动分析、身份验证、健康监测等方面具有广泛的应用前景。步态能量图(GaitEnergyImage,简称GEI)是一种有效的步态表示方法,通过......
  • 综合概念映射和网络问题解决方法对学生学习成绩、感知和认知负荷的影响
    (Effectsofanintegratedconceptmappingandweb-basedproblem-solvingapproachonstudents’learningachievements,perceptionsandcognitiveloads) Computers&Education71(2014)77–86一、摘要研究目的:虽然学生可以通过适当的关键词有效地搜索到网络数据,并......
  • express的学习
    在学习了node.js两天之后终于也算是快入门了在node.js环境上陆续学习了fs模块,http快速搭建一个服务,path路径模块,以及npm包管理工具今天主要学习的内容是express框架这个框架的主要作用是简化http的书写只需要constexpress=require("express") constapp=express()即可......
  • Markdowm学习day01
    Markdowm学习标题一级到六级标题用Ctrl1~6字体前加#为一级标题,加两个#为二级标题,以此类推字体Helloworld两边加一个星变斜体/crtl+iHelloworld加两个变粗体/crtl+bHelloworld加三个变斜粗体/crtl+i+bHelloworld加两个波浪号删除/alt+shift+5引用狂神说Java......
  • 【学习笔记】(29) 笛卡尔树
    定义与性质笛卡尔树是一种二叉树,每一个结点由一个键值二元组\((k,w)\)构成。要求\(k\)满足二叉搜索树的性质,而\(w\)满足堆的性质。,也就是说,对于一个节点\(i\)的左儿子\(l_i\)和右儿子\(r_i\),一定满足\(l_i<i<r_i\)(下标\(k\)满足二叉搜索树的性质)且\(v_{l_i}\)与......
  • 组合数学学习笔记
    这是一位数学小萌新看oi-wiki的一点点收获。二项式定理二项式定理是组合数学中很基础且很重要的定理,它的式子为:\((a+b)^n=\sum_{i=0}^n\binom{n}{i}a^ib^{n-i}\)可以通过归纳法剖析\((a+b)^n\)的过程证明其正确性。范德蒙德卷积:\(\large\sum_{i=0}^k\binom{n}{i}......
  • 【笔记】机器学习基础 - Ch6.5-6 Kernel Methods
    6.5Sequencekernels考虑拓展\(K:\calX\timesX\to\mathbb{R}\)到\(\calX\)不是向量空间的情况,例如序列、图像等等。现在令\(\calX\)为字符串的集合,对应的核称为序列核sequencekernels;一种序列核的框架,称为rationalkernels,建立在称为加权转换器weightedtransduce......
  • Python学习笔记1
    a="好的,测试字符tester"b=17c=3print(a[1:5])#从第1(包含)个字符取到第5(不包含)个字符print(a[:3])#取到第3个字符(不含3)print(a[-5:-1])#取倒数第5个到倒数第1个print(a[-1:])#取最后一个字符print(len(a))#字符长度#exit()#退出与quit()一样,里面......