算法设计与分析
记录一下在学习算法设计与分析
过程中的一些笔记。
参考
- 算法设计与分析第二版,清华大学出版社。
- https://www.bilibili.com/video/BV1254y1r71T?share_source=copy_web 这是由
屈婉玲
教授讲授的前76节
,以及其他一些老师讲的后面第77-142节
,屈教授讲授的部分主要内容为算法设计与分析第二版
的前五章内容,有:- 第一章 基础知识
- 第二章 分治策略
- 第三章 动态规划
- 第四章 贪心法
- 第五章 回溯与分支界限
其他老师的内容为算法设计与分析第二版
的剩下的部分内容,因为没有把课全部看完,只是看到了屈教授讲完的部分,所以剩下的不做分析。
- https://www.bilibili.com/video/BV1j7411d7Gm?share_source=copy_web 这是单纯形法。
- https://www.bilibili.com/video/BV12Z4y1W7aU?share_source=copy_web 这是对偶单纯形法。
- https://youtu.be/JS9MB8tp0eY 这是在
YouTube上
一个叫做Shusen Wang
的一个博主讲的关于图
和网络流
的内容,因为说的详细简单以及是中文,所以很推荐,主要内容如下:
10-1 图的基本概念和数据结构
11-1 图中的路径和最短路
11-2 无权图的最短路径算法
11-3 Dijkstra算法 寻找有权图中最短路
12-1 最小生成树
12-2 Prim算法 寻找最小生成树
12-3 Kruskal算法 寻找最小生成树
13-1 网络流问题基础
13-2 Ford-Fulkerson算法(FF算法) 寻找网络最大流
13-3 Edmonds-Karp算法 寻找网络最大流
13-4 Dinic’s算法 寻找网络最大流
13-5 最小割
14-1 二部图及其判定算法
14-2 无权二部图中的最大匹配
14-3 有权二部图中的最大匹配
14-4 匈牙利算法
14-5 稳定婚配问题
14-6 Gale-Shapley算法 寻找稳定婚配
线性规划
标准形
将线性规划的一般形式
转化为标准形
:
- 目标函数如果是
max
,则把max
转化为min
,等式右边取反。 - 对于约束条件来说,等式右边必须是
非负数
,如果是负数的话,则两边同时变号, ≤ \leq ≤变成 ≥ \geq ≥, ≥ \geq ≥变成 ≤ \leq ≤。 - 对于约束条件来说,符号若是
≤
\leq
≤,则将
≤
\leq
≤变成
=
=
=,等式左边加上一个新的变量,称为
松弛变量
。 - 对于约束条件来说,符号若是
≥
\geq
≥,则将
≥
\geq
≥变成
=
=
=,等式左边减去一个新的变量,称为
剩余变量
。 - 对于变量来说,如果有自由变量 x j x_j xj,则将自由变量 x j x_j xj替换为 x j ′ − x j ′ ′ x^{'}_j-x^{''}_j xj′−xj′′,且 x j ′ ≥ 0 , x j ′ ′ ≥ 0 x^{'}_j\geq 0,x^{''}_j\geq 0 xj′≥0,xj′′≥0。
理论说起来总是很抽象,下面有个例子:
写出下述线性规划的标准形:
m
a
x
z
=
3
x
1
−
2
x
2
+
x
3
s
.
t
.
x
1
+
3
x
2
−
3
x
3
≤
10
4
x
1
−
x
2
−
5
x
3
≤
−
30
x
1
≥
0
,
x
2
≥
0
,
x
3
任
意
max\ \ \ z=3x_1-2x_2+x_3 \\ s.t.\ \ \ x_1+3x_2-3x_3 \leq 10 \\ 4x_1-x_2-5x_3 \leq -30 \\ x_1\geq 0,\ x_2\geq 0,\ x_3任意
max z=3x1−2x2+x3s.t. x1+3x2−3x3≤104x1−x2−5x3≤−30x1≥0, x2≥0, x3任意
解:
- 首先看上面的
1
发现目标函数是max
,于是将max
转化为min
,然后等式取反为: m i n z ′ = − 3 x 1 + 2 x 2 − x 3 min\ z^{'}=-3x_1+2x_2-x_3 min z′=−3x1+2x2−x3。 - 再看上面的
2
发现约束条件的第二个式子右边是负数
,所以变为: − 4 x 1 + x 2 + 5 x 3 ≥ 30 -4x_1+x_2+5x_3\geq 30 −4x1+x2+5x3≥30。 - 再把不是
=
的式子转化一下:第一个式子转化为 x 1 + 3 x 2 − 3 x 3 + x 4 = 10 x_1+3x_2-3x_3+x_4=10 x1+3x2−3x3+x4=10,因为 x x x有1,2,3的下标,所以引入的新变量命名为 x 4 x_4 x4;第二个式子在第二步
的基础上转化为 − 4 x 1 + x 2 + 5 x 3 − x 5 = 30 -4x_1+x_2+5x_3-x_5=30 −4x1+x2+5x3−x5=30,因为 x x x已经有了 x 4 x_4 x4,所以引入的新变量为 x 5 x_5 x5。 - 检查是否有自由变量,发现 x 3 x_3 x3是自由变量,因为上述的三个式子都有 x 3 x_3 x3,所以都得需要改:目标函数改为 z ′ = − 3 x 1 + 2 x 2 − x 3 ′ + x 3 ′ ′ z^{'}=-3x_1+2x_2-x^{'}_3+x^{''}_3 z′=−3x1+2x2−x3′+x3′′;约束条件的第一个式子改为 x 1 + 3 x 2 − 3 x 3 ′ + 3 x 3 ′ ′ + x 4 = 10 x_1+3x_2-3x^{'}_3+3x^{''}_3+x_4=10 x1+3x2−3x3′+3x3′′+x4=10;约束条件的第二个式子改为 − 4 x 1 + x 2 + 5 x 3 ′ − 5 x 3 ′ ′ − x 5 = 30 -4x_1+x_2+5x^{'}_3-5x^{''}_3-x_5=30 −4x1+x2+5x3′−5x3′′−x5=30
宗上,答案为:
m
i
n
z
′
=
−
3
x
1
+
2
x
2
−
x
3
′
+
x
3
′
′
s
.
t
.
x
1
+
3
x
2
−
3
x
3
′
+
3
x
3
′
′
+
x
4
=
10
−
4
x
1
+
x
2
+
5
x
3
′
−
5
x
3
′
′
−
x
5
=
30
x
1
,
x
2
,
x
3
′
,
x
3
′
′
,
x
4
,
x
5
≥
0
min\ \ \ z^{'}=-3x_1+2x_2-x^{'}_3+x^{''}_3\\ s.t.\ \ \ x_1+3x_2-3x^{'}_3+3x^{''}_3+x_4=10\\ -4x_1+x_2+5x^{'}_3-5x^{''}_3-x_5=30\\ x_1,x_2,x^{'}_3,x^{''}_3,x_4,x_5\geq 0
min z′=−3x1+2x2−x3′+x3′′s.t. x1+3x2−3x3′+3x3′′+x4=10−4x1+x2+5x3′−5x3′′−x5=30x1,x2,x3′,x3′′,x4,x5≥0
单纯形法
一些问题需要用单纯形法来解决线性规划问题,所以需要制作一个单纯形表,但是单纯形表的具体初始化的参数是需要确定的,具体的参数就是将线性规划的一般形式转化为标准形,然后填入其中,先选择表中的列,然后选择表中的行。
对偶单纯形
对偶单纯形法是需要从原始规划变为对偶形规划,原始规划的形式不是标准形,而是这样子的:
- 目标函数转化为
max
。 - 约束条件的 ≥ \geq ≥变为 ≤ \leq ≤。
然后就很容易的将原始规划变为对偶形规划:
- 目标函数的
max
替换为min
。 - 约束条件的符号都变为 ≥ \geq ≥。
最后就很容易写成标准形了,根据标准形就可以画出对偶单纯形法计算表。
网络最大流
FF算法
和Dinic算法
在Shusen Wang
的视频中讲解的很详细了,可是他的视频里面没有关于Floyd最小费用的负回路算法
,于是下面就根据我自己的理解简单的说一下关于这个算法。
辅助网络
辅助网络其实根Shusen Wang
视频中的residual图
是差不多的,因为在Shusen Wang
中的residual图
中,一开始的流量
f
0
f_0
f0都是0的,但是在做题的时候初始流量
f
0
f_0
f0并不是0的,于是就需要构建辅助网络。
构造辅助网络很简单,只需要满足一下条件即可:
- 如果 f 0 = 0 f_0=0 f0=0,则这条边什么也不需要动。
- 如果
f
0
=
c
f_0=c
f0=c,
c
c
c是这条边的容量,则需要将
权重
取反,边
反方向。 - 如果 0 < f 0 < c 0< f_0< c 0<f0<c,则这条边的容量 c = c − f 0 c=c-f_0 c=c−f0,权重不变;增加一条逆向边,边的权重取反,流量为 f 0 f_0 f0。
Floyd算法
- 用邻接矩阵表示点与点之间的距离。
- 循环
n
次,n
为点的个数,循环的每次都是以其中的一个点作为中间点,到另外的点的距离,以此更新邻接矩阵。 - 得到任何一个点到另外一个点之间的最短距离,如果点到自身的距离是负数,则表示存在负回路。
时间复杂度: n 3 n^3 n3,空间复杂度: n 2 n^2 n2。
Floyd最小费用的负回路算法
- 构建一个辅助网络 ( c , w ) (c,w) (c,w)。
- 根据辅助网络,用
Floyd算法
检验是否存在负回路,如果存在负回路,则记录此负回路中的最小容量
c 0 c_0 c0,然后顺
着此回路的方向的边,流量
加上 c 0 c_0 c0,逆
着此回路的方向的边,流量
减去 c 0 c_0 c0;如果不存在负回路,则结束。 - 更新辅助网络
- 重复2,3步骤直到不存在负回路。