卜算法学习笔记-lecture1-绪论

2022/9/11 14:31:34

本文主要是介绍卜算法学习笔记-lecture1-绪论,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

算法的概念

算法是指给出解决问题的操作步骤之后,无论是人还是机器都可以按照步骤机械性的执行得到问题的结果。
我们在日常生活中回遇到各种的实际问题遇到之后的解决流程如下:

首先在一系列世纪问题中找到一个特定的topic,得到一个实际问题,在这个实际问题的基础之上我们可以抽象出数学问题,之后通过对该数学问题的观察,特别是对输入输出结构的观察,得到解决问题的算法。
面对一个数学问题,我们首先问自己以下几个问题。

  • 这个问题的最简单版本是否可以解决,假如不可以,我们可以降低问题的难度直到简单版本可以解决;
  • 问题是否可以拆分为小问题,假如可以拆分,那么采用devide and
    conquer方法,如果有最优子结构,可以尝试动态规划,还有短视的策略贪心可以使用;
  • 可行解的形式是什么,是否采用枚举办法,枚举时需要注意剪枝;
  • 问题的解是否可以通过微小扰动变为另一种形式,这种可以采用逐步改进的办法解决问题,包括线性规划、局部搜索和半退火、网络流等;

基于旅行商问题介绍三种算法设计过程

traveling salesman problem, TSP

  • 输入:结点集合\(V=\{v_1,...,v_n\}\),以及结点之间的距离矩阵\(D = (d_{i,j}) \in R^{n\times n}\),其中\(d_{i,j}\)表示节点\(i\)与节点\(j\)之间的距离;
  • 输出:最短的环游路线,即从任意节点作为出发点,经过每个节点一次且仅一次,最终返回出发点的里程最短的环游;

分而治之算法设计过程简介

我们需要观察这个问题是否可以分解成简单实例,并且简单实例的解是否可以组合出复杂实例的解。

  • 第一种尝试,我们尝试减少结点数,可以看到,我们可以很容易的将五个结点的实例变为四个结点的实例,但是简单实例不太容易组合成复杂实例;
  • 第二种尝试,求解一个辅助问题,计算从起始结点\(s\)出发,经过中间结点集合\(S\),最终达到目的节点\(x\)的最短路径,其长度计为\(M(s,S, x)\);

可以看到在第二种尝试之下可以将这个问题分解为简单实例并可以合起来组成复杂实例。
以5个结点的实例为例,包含结点\(a,b,c,d,e\),以\(a\)为起始节点,那么可以从\(b,c,e\)返回起点,最短里程可以表示为\(min\{d_{b,a} + M(a,\{c,d\},b), d_{c,a} + M(a,\{b,d\},c), d_{e,a} + M(a,\{c,b\},e)\}\)
这个算法可以表示为以下伪代码
在这里插入图片描述
计算\(M(s,S,x)\)的伪代码
在这里插入图片描述
算法的复杂度计算如下,我们需要枚举所有的结点子集\(S\),所以总共有\(2^n\)个子集,路线起点确定,但是终点\(x\)有\(n\)种可能,所以总共要\(O(2^nn)\)才能计算出\(M(s,S,x)\)表格的值,计算出来之后还要经过\(n\)次比较的到最终的结果,Bellman-held-karp的复杂度为\(O(2^n n^2)\).

逐步改进的算法设计流程

基本过程是从问题的一个粗糙的,质量不太高的完整可行解开始,不断改进,直到获得满意的解为止,一般性框架为。
在这里插入图片描述
求解过程中需要关注三个方面:

  • 初始粗糙可行解的选择;
  • 可行解的改进办法,也即扰动办法;
  • 算法的终止条件,常见的终止条件包括当前的可行解无法进一步改进;迭代次数超过预先定义的值;当前可行解的质量超过预先定义的阈值;

智能枚举算法设计流程

通过观察解的形式来枚举

  • 枚举边的各种情况,最终的解的形式是边的集合,枚举各种边是否存在的情况,在这个过程中可以进行剪枝
  • 枚举点的各种情况,也就是将环游表示成\(X=x_1,x_2,...,x_{n-2},x_i \in V (1\leq i \leq n - 2)\).


这篇关于卜算法学习笔记-lecture1-绪论的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程