算法设计与分析学习笔记

算法设计与分析

记录一下在学习算法设计与分析过程中的一些笔记。

参考

  1. 算法设计与分析第二版,清华大学出版社。
  2. https://www.bilibili.com/video/BV1254y1r71T?share_source=copy_web 这是由屈婉玲教授讲授的前76节,以及其他一些老师讲的后面第77-142节,屈教授讲授的部分主要内容为算法设计与分析第二版的前五章内容,有:
    1. 第一章 基础知识
    2. 第二章 分治策略
    3. 第三章 动态规划
    4. 第四章 贪心法
    5. 第五章 回溯与分支界限
      其他老师的内容为算法设计与分析第二版的剩下的部分内容,因为没有把课全部看完,只是看到了屈教授讲完的部分,所以剩下的不做分析。
  3. https://www.bilibili.com/video/BV1j7411d7Gm?share_source=copy_web 这是单纯形法。
  4. https://www.bilibili.com/video/BV12Z4y1W7aU?share_source=copy_web 这是对偶单纯形法。
  5. 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算法 寻找稳定婚配

线性规划

标准形

线性规划的一般形式转化为标准形

  1. 目标函数如果是max,则把max转化为min,等式右边取反。
  2. 对于约束条件来说,等式右边必须是非负数,如果是负数的话,则两边同时变号, ≤ \leq 变成 ≥ \geq ≥ \geq 变成 ≤ \leq
  3. 对于约束条件来说,符号若是 ≤ \leq ,则将 ≤ \leq 变成 = = =,等式左边加上一个新的变量,称为松弛变量
  4. 对于约束条件来说,符号若是 ≥ \geq ,则将 ≥ \geq 变成 = = =,等式左边减去一个新的变量,称为剩余变量
  5. 对于变量来说,如果有自由变量 x j x_j xj,则将自由变量 x j x_j xj替换为 x j ′ − x j ′ ′ x^{'}_j-x^{''}_j xjxj,且 x j ′ ≥ 0 , x j ′ ′ ≥ 0 x^{'}_j\geq 0,x^{''}_j\geq 0 xj0,xj0

理论说起来总是很抽象,下面有个例子:
写出下述线性规划的标准形:
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=3x12x2+x3s.t.   x1+3x23x3104x1x25x330x10, x20, x3
解:

  1. 首先看上面的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+2x2x3
  2. 再看上面的2发现约束条件的第二个式子右边是负数,所以变为: − 4 x 1 + x 2 + 5 x 3 ≥ 30 -4x_1+x_2+5x_3\geq 30 4x1+x2+5x330
  3. 再把不是=的式子转化一下:第一个式子转化为 x 1 + 3 x 2 − 3 x 3 + x 4 = 10 x_1+3x_2-3x_3+x_4=10 x1+3x23x3+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+5x3x5=30,因为 x x x已经有了 x 4 x_4 x4,所以引入的新变量为 x 5 x_5 x5
  4. 检查是否有自由变量,发现 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+2x2x3+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+3x23x3+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+5x35x3x5=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+2x2x3+x3s.t.   x1+3x23x3+3x3+x4=104x1+x2+5x35x3x5=30x1,x2,x3,x3,x4,x50

单纯形法

一些问题需要用单纯形法来解决线性规划问题,所以需要制作一个单纯形表,但是单纯形表的具体初始化的参数是需要确定的,具体的参数就是将线性规划的一般形式转化为标准形,然后填入其中,先选择表中的列,然后选择表中的行。

对偶单纯形

对偶单纯形法是需要从原始规划变为对偶形规划,原始规划的形式不是标准形,而是这样子的:

  1. 目标函数转化为max
  2. 约束条件的 ≥ \geq 变为 ≤ \leq

然后就很容易的将原始规划变为对偶形规划:

  1. 目标函数的max替换为min
  2. 约束条件的符号都变为 ≥ \geq

最后就很容易写成标准形了,根据标准形就可以画出对偶单纯形法计算表。

网络最大流

FF算法Dinic算法Shusen Wang的视频中讲解的很详细了,可是他的视频里面没有关于Floyd最小费用的负回路算法,于是下面就根据我自己的理解简单的说一下关于这个算法。

辅助网络

辅助网络其实根Shusen Wang视频中的residual图是差不多的,因为在Shusen Wang中的residual图中,一开始的流量 f 0 f_0 f0都是0的,但是在做题的时候初始流量 f 0 f_0 f0并不是0的,于是就需要构建辅助网络。

构造辅助网络很简单,只需要满足一下条件即可:

  1. 如果 f 0 = 0 f_0=0 f0=0,则这条边什么也不需要动。
  2. 如果 f 0 = c f_0=c f0=c c c c是这条边的容量,则需要将权重取反,反方向。
  3. 如果 0 < f 0 < c 0< f_0< c 0<f0<c,则这条边的容量 c = c − f 0 c=c-f_0 c=cf0,权重不变;增加一条逆向边,边的权重取反,流量为 f 0 f_0 f0

Floyd算法

  1. 用邻接矩阵表示点与点之间的距离。
  2. 循环n次,n为点的个数,循环的每次都是以其中的一个点作为中间点,到另外的点的距离,以此更新邻接矩阵。
  3. 得到任何一个点到另外一个点之间的最短距离,如果点到自身的距离是负数,则表示存在负回路。

时间复杂度: n 3 n^3 n3,空间复杂度: n 2 n^2 n2

Floyd最小费用的负回路算法

  1. 构建一个辅助网络 ( c , w ) (c,w) (c,w)
  2. 根据辅助网络,用Floyd算法检验是否存在负回路,如果存在负回路,则记录此负回路中的最小容量 c 0 c_0 c0,然后着此回路的方向的边,流量加上 c 0 c_0 c0着此回路的方向的边,流量减去 c 0 c_0 c0;如果不存在负回路,则结束。
  3. 更新辅助网络
  4. 重复2,3步骤直到不存在负回路。

你可能感兴趣的:(写代码啦,算法,学习)