导航:首页 > 源码编译 > VNS算法中局部搜索用什么方式

VNS算法中局部搜索用什么方式

发布时间:2024-05-26 19:36:57

1. 什么是局部搜索算法

局部搜索算法是从爬山法改进而来的。
简单来说,局部搜索算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。
在计算机科学中,局部搜索是解决最优化问题的一种元启发式算法。局部搜索从一个初始解出发,然后搜索解的邻域,如有更优的解则移动至该解并继续执行搜索,否则返回当前解。
1、局部搜索算法的基本思想:
在搜索过程中,始终选择当前点的邻居中与离目标最近者的方向搜索。
2、局部搜索的优点:
简单、灵活及易于实现,缺点是容易陷入局部最优且解的质量与初始解和邻域的结构密切相关。常见的改进方法有模拟退火、禁忌搜索等。
3、局部搜索广泛应用:
计算机科学(主要是人工智能)、数学、运筹学、工程学、生物信息学中各种很难找到全局最优解的计算问题。

2. 局部搜索与经典搜索有什么不同

局部搜索与经典搜索的不同分别是:

1、局部搜索:局部搜索不关心路径代价,但是关注解状态。比如八皇后问题,不关心是怎么到目的状态的,只关心最终布局对不对,许多重要应用都有这样的性质,如作业空间调度,自动程序设计等。

局部搜索有两个关键优点:1、通常只用常数级的内存;2、通常能在系逗缓首统化算法不适用的很大或无限的(连续的)状态山数空间中找到合理的解。

此外,局部搜索算法对于解决纯粹的最优化问题十分有用,其目标是根据目标函数找到最佳状态。

2、经典搜索:通过形式化的定义搜索问题,则搜索问题的解描述为一组让初始状态转变为目标状态的行动序列,而搜索问题的最优解描述为使得路径代价最小的一组让初始状态转变为目标状态的行动序列。

经典搜索的种类主要是:

1、树搜索:例如在罗马尼亚问题中,从父结点In(Arad)出发得到三个子节点:In(Sibiu),In(Timisoara)和In(Zerind),接下来需要继续从这三种子结点中选择其一继续考虑,假设我们选择In(Sibiu),则检查它是否是目标状态。

如果不是目标状态,则继续扩展它得到四个状态:In(Arad),In(Fagaras),In(Oradea),In(Rimnicu Vikea)。继续按此方式拓展In(Timisoara)和In(Zerind)。如果未找到目标状态,则继续对叶子结点作同样的操作。

2、图搜索算法:在图搜索算法中,在扩展的时候如果遇到已经在 explored 集合中的结点或已经在 frontier 集合中的结点,则不将该结点哪局拓展进 frontier 集合,这也是其与树搜索算法的主要区别。

3. 启发式搜索全局择优搜索和局部择优搜索的区别是什么

根据问题的实际情况不断寻找可利用的知识,从而构造成一条代价较少的推理路线,使问题得到圆满解决的过程称为搜索。

寻找问题的解的一种可靠的方法是首先列出所有候选解,然后依次检查每一个解,即可以找到所需要的问题的答案。这是一种“万能”的方法,理论上,当候选解的数量可以穷尽并且通过检查所有或部分候选解能够得到所需解时,问题就能得到解决。

但是,在实际应用中,因为候选解的数量通常都非常大(比如指数级),并且计算机的速度和内存都有限制,因此对问题不加分析的穷尽算法通常只能解决规模很小的问题。

在实际运用中常采用回溯和分枝定界法对问题进行求解。按照这两种方法对候选解进行系统检查通常会使问题的求解时间大大减少(无论对于最坏情形还是对于一般情形)。这二种方法由于都是按规定的路线进行,基本没有使用与问题有关的启发性信息,属于盲目搜索策略。在涉及人工职能的有些问题如博弈问题时,还会用到启发是搜索策略,如A*算法等。

一、回溯法和分枝限界法

问题的表示

状态空间表示法是表示问题及其搜索过程的一种形式表示方法。可以用解空间树来表示问题的结构。 对于一棵树,树中的每一个结点确定所求问题的一个问题状态,由根结点到其它结点的所有路径确定了这个问题的状态空间。解状态是一些问题状态S,对于这些问题状态,由根到S的那条路径确定了这解空间的一个元组。答案状态则是由解状态到根的路径。

对于一种状态空间树,可以先系统地生成问题的状态,接着确定问题状态的解状态,最后确定那些解状态是答案状态从而将这些问题解出。

从根结点开始解问题,如果已经生成一个结点而它的所有儿子结点还没有全部生成,则这个结点叫做活结点。当前正在生成其儿子的活结点叫E结点,不再进一步扩展或者其儿子结点已经全部生成的生成结点就是死结点。

回溯算法使用深度优先方法搜索树结构,而分枝定界一般用宽度优先方法来搜索这些树。

回溯方法的步骤如下:

1) 定义一个解空间,它包含问题的解。

2) 用适于搜索的方式组织该空间。

3) 用深度优先法搜索该空间,利用限界函数避免移动到不可能产生解的子空间。

回溯算法的特性是在搜索执行的同时产生解空间。在搜索期间的任何时刻,仅保留从开始节点到当前E -节点的路径。因此,回溯算法的空间需求为O(从开始节点起最长路径的长度)。

分枝限界法的步骤和回溯的唯一区别是采用了宽度优先的方法来搜索树,因此分枝法消耗的空间比回溯法要多。

这二种搜索策略从本质上来讲都是属于穷尽法的搜索,由于在搜索路径上的不同也造成这二种方法各自都有其优缺点、适用的求解问题也就不同。

宽度优先占有优势的问题:

九宫重排问题

九宫重排问题是一个可以回溯法和分枝法都能解决的问题。但是,对于这个问题运用分枝法是有利的。

九宫重排问题,在3*3的方格棋盘上放置标由数字1、2、3、4、5、6、7、8共8个棋子,初始状态为S 0 ,目标状态为Sg ,当找到一个解时结束搜索。

从根结点到叶子结点的路径即为解,算法为空格左移,空格上移,空格右移,空格下移。

S0

Sg

2
8
3

1
2
3

1

4

8

4

7
6
5

7
6
5

用宽度优先搜索,如下图:

f'(x) = g(x) + h(x)

2 8 3

14

7 6 5

2 8 3

1 4

7 6 5

23

1 8 4

7 6 5

3 8 2

1 6 4

75

3 8 2

1 4

7 6 5

8 3

2 1 4

7 6 5

3 8 2

14

7 6 5

82

2 1 4

7 6 5

2 3 4

1 8

7 6 5

1 2 3

8 4

7 6 5

2 3

1 8 4

7 6 5

2 3

1 8 4

7 6 5

2 8 3

1 6 4

7 5

2 8 3

1 6 4

7 5

3 8 2

14

7 6 5

2 8 3

1 6

7 5 4

2 8 3

6 4

1 7 5

2 8 3

1 4 5

76

28

1 4 3

7 6 5

2 8 3

1 4 5

7 6

28

1 4 3

7 6 5

2 8 3

7 1 4

6 5

2 8 3

74

6 1 5

8 1 3

24

7 6 5

8 3 2

2 1 4

7 6 5

1 2 3

84

7 6 5

16

26

9

8

7

6

2

1

S0

4

3

5

Sg

图示解的路径是 S0-3-8-16-26(Sg)

宽度优先搜索的盲目性较大,当目标结点距离初始结点较远时将会产生许多无用结点,空间浪费较大,搜索效率低,但是只要问题有解,用宽度优先搜索总可以得到解,而且得到的路径最短的解。

用深度优先策略搜索,如下图:

2 8 3

14

7 6 5

2 8 3

1 4

7 6 5

23

1 8 4

7 6 5

3 8 2

1 6 4

7 5

3 8 2

1 4

7 6 5

2 8 3

1 6 4

7 5

2 8 3

1 6 4

7 5

2 8 3

1 6

7 5 4

1

S0

2

2 8

1 6 3

7 5 4

2 8 1 6 3

7 5 4

2 8

1 6 3

7 5 4

3

4

5

6

在深度优先搜索中,搜索一旦进入某个分枝,就将沿着该分枝一直向下搜索,如果该节点恰好在此分支上,则可较快地得到解。但是,如果目标节电不在此分支上,而该分支又是一个无穷分支,则就不可能得到解。

显然该问题用宽度优先搜索的策略是较好的。

经典的N皇后问题

N皇后问题要求求出N个皇后在棋盘上的所有摆法,(该问题很多书籍上都有详细介绍,这儿图表省略),该问题是适合用回溯法来描述和解决的问题,通过深度优先搜索至多需要检索N!个元组,而如果用分枝法,因为要生成所有问题的解,则必须储存检索过程中的E结点,造成储存空间的极度膨胀,这类问题明显是用回溯法占优势的。

回溯法和分枝法是基本的搜索策略,大多数情况下如果找不到更好的解决方案,总是可以用这二种方法尝试。

但是它们有一个很大的缺陷就是都是在一个给定的状态空间中穷举。这在状态空间不大的情况下是很合适的算法,可是当状态空间十分大,且不预测的情况下就不可取了。它的效率实在太低,甚至不可完成。



二、启发式搜索算法
通常在搜索中能直接运用回溯、分枝法的问题并不多,回溯和分枝的过程中,施加一定的条件,对搜索过程中出现的结点进行判断,可以提高效率。

启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无畏的搜索路径,提到了效率。在启发式搜索中,对位置的估价是关键。采用了不同的估价可以有不同的效果。

启发式搜索有很多的算法,如:局部择优搜索法、最好优先搜索法等等。A*也是。这些算法都使用了启发函数,但在具体的选取最佳搜索节点时的策略不同。

局部择优搜索法,就是在搜索的过程中选取“最佳节点”后舍弃其他的兄弟节点,父亲节点,而一直得搜索下去。这种搜索的结果很明显,由于舍弃了其他的节点,可能也把最好的节点都舍弃了,因为求解的最佳节点只是在该阶段的最佳并不一定是全局的最佳。

局部择优搜索法它是对深度优先搜索方法的一种改进。

全局择优搜索是 局部择优搜索的一种改进,试图克服局部择优搜索的的局限性。再搜索时,每次总是从全体的活结点中选取一个估价值最小的节点,

在搜索过程中,启发式搜索的关键是要确定下一个要考察的节点,用于估价节点重要性的函数称为估价函数

f'(x) = g(x) + h(x)

其中g(x)为从初始节点So到节点X已经实际付出的代价;h(x)是从节点X到节点Sg的最优路径的估计代价。h(x)称为启发函数。

九宫重排

当用全局择优搜索求解该问题时,可以设估价函数为 f'(x) = d(x) + h(x)

d(x)表示节点x的深度,h(x)表示节点x的棋局与目标节点棋局位置不相同的棋子数。

2 8 3

14

7 6 5

2 8 3

1 4

7 6 5

23

1 8 4

7 6 5

3 8 2

1 6 4

75

3 8 2

1 4

7 6 5

8 3

2 1 4

7 6 5

3 8 2

14

7 6 5

1 2 3

8 4

7 6 5

2 3

1 8 4

7 6 5

2 3

1 8 4

7 6 5

1 2 3

84

7 6 5

4

6

4

6

6

4

1

S0

4

4

5

Sg

1 2 3

7 8 4

6 5

5

5

S3

S2

S1

图中节点旁标明的数字是该节点的估价函数值。

该问题的解路径为: So-S1-S2-S3-Sg

以上论述一些树型问题基本的搜索的策略,当问题的状态空间是有向图时,节点的重复将导致大量冗余的搜索,甚至时搜索过程陷入无效的循环而无法找到解,这时就需要对估价函数进行限制,A*算法就是针对图的有序搜索的算法。



问题的求解可以有很多方法,而如何建立数学模型,选择问题的求解方式是十分重要的,方法的好坏是面向一个具体的问题的,需要具体问题具体分析

4. 局部搜索到底是什么

简单地说,就是根据已有的条件减小搜索范围的搜索思想,不再全局搜索了。。。比如你想知道你班里有多少有钱人,但由于你班上人太多了不可能一一调查,所以你可以根据“物以类聚”的假设减小搜索范围,有钱人和有钱人走得更近些,就从某个有钱人的圈子进行排查。。。

5. A*算法现实应用的实际意义

A*算法在人工智能中是一种典型的启发式搜索算法,为了说清楚A*算法,我看还是先说说何谓启发式算法。

一、何谓启发式搜索算法

在说它之前先提提状态空间搜索。状态空间搜索,如果按专业点的说法就是将问题求解过程表现为从初始状态到目标状态寻找这个路径的过程。通俗点说,就是在解一个问题时,找到一条解题的过程可以从求解的开始到问题的结果(好象并不通俗哦)。由于求解问题的过程中分枝有很多,主要是求解过程中求解条件的不确定性,不完备性造成的,使得求解的路径很多这就构成了一个图,我们说这个图就是状态空间。问题的求解实际上就是在这个图中找到一条路径可以从开始到结果。这个寻找的过程就是状态空间搜索。

常用的状态空间搜索有深度优先和广度优先。广度优先是从初始状态一层一层向下找,直到找到目标为止。深度优先是按照一定的顺序前查找完一个分支,再查找另一个分支,以至找到目标为止。这两种算法在数据结构书中都有描述,可以参看这些书得到更详细的解释。

前面说的广度和深度优先搜索有一个很大的缺陷就是他们都是在一个给定的状态空间中穷举。这在状态空间不大的情况下是很合适的算法,可是当状态空间十分大,且不预测的情况下就不可取了。他的效率实在太低,甚至不可完成。在这里就要用到启发式搜索了。

启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无畏的搜索路径,提到了效率。在启发式搜索中,对位置的估价是十分重要的。采用了不同的估价可以有不同的效果。我们先看看估价是如何表示的。

启发中的估价是用估价函数表示的,如:

f(n) = g(n) + h(n)

其中f(n)是节点n的估价函数,g(n)实在状态空间中从初始节点到n节点的实际代价,h(n)是从n到目标节点最佳路径的估计代价。在这里主要是h(n)体现了搜索的启发信息,因为g(n)是已知的。如果说详细点,g(n)代表了搜索的广度的优先趋势。但是当h(n)>>g(n)时,可以省略g(n),而提高效率。这些就深了,不懂也不影响啦!我们继续看看何谓A*算法。

二、初识A*算法

启发式搜索其实有很多的算法,比如:局部择优搜索法、最好优先搜索法等等。当然A*也是。这些算法都使用了启发函数,但在具体的选取最佳搜索节点时的策略不同。象局部择优搜索法,就是在搜索的过程中选取“最佳节点”后舍弃其他的兄弟节点,父亲节点,而一直得搜索下去。这种搜索的结果很明显,由于舍弃了其他的节点,可能也把最好的节点都舍弃了,因为求解的最佳节点只是在该阶段的最佳并不一定是全局的最佳。最好优先就聪明多了,他在搜索时,便没有舍弃节点(除非该节点是死节点),在每一步的估价中都把当前的节点和以前的节点的估价值比较得到一个“最佳的节点”。这样可以有效的防止“最佳节点”的丢失。那么A*算法又是一种什么样的算法呢?其实A*算法也是一种最好优先的算法。只不过要加上一些约束条件罢了。由于在一些问题求解时,我们希望能够求解出状态空间搜索的最短路径,也就是用最快的方法求解问题,A*就是干这种事情的!我们先下个定义,如果一个估价函数可以找出最短的路径,我们称之为可采纳性。A*算法是一个可采纳的最好优先算法。A*算法的估价函数可表示为:

f'(n) = g'(n) + h'(n)

这里,f'(n)是估价函数,g'(n)是起点到终点的最短路径值,h'(n)是n到目标的最断路经的启发值。由于这个f'(n)其实是无法预先知道的,所以我们用前面的估价函数f(n)做近似。g(n)代替g'(n),但g(n)>=g'(n)才可(大多数情况下都是满足的,可以不用考虑),h(n)代替h'(n),但h(n)<=h'(n)才可(这一点特别的重要)。可以证明应用这样的估价函数是可以找到最短路径的,也就是可采纳的。我们说应用这种估价函数的最好优先算法就是A*算法。哈!你懂了吗?肯定没懂!接着看!

举一个例子,其实广度优先算法就是A*算法的特例。其中g(n)是节点所在的层数,h(n)=0,这种h(n)肯定小于h'(n),所以由前述可知广度优先算法是一种可采纳的。实际也是。当然它是一种最臭的A*算法。

再说一个问题,就是有关h(n)启发函数的信息性。h(n)的信息性通俗点说其实就是在估计一个节点的值时的约束条件,如果信息越多或约束条件越多则排除的节点就越多,估价函数越好或说这个算法越好。这就是为什么广度优先算法的那么臭的原因了,谁叫它的h(n)=0,一点启发信息都没有。但在游戏开发中由于实时性的问题,h(n)的信息越多,它的计算量就越大,耗费的时间就越多。就应该适当的减小h(n)的信息,即减小约束条件。但算法的准确性就差了,这里就有一个平衡的问题。

6. 二分搜索算法是利用什么实现的算法

根据分治策略来实现

阅读全文

与VNS算法中局部搜索用什么方式相关的资料

热点内容
程序员那么可爱姜逸城初恋 浏览:495
modbustcp编程 浏览:490
实况为什么安卓看不了 浏览:129
Java多线程Queue 浏览:94
云服务器499元三年 浏览:980
nbd源码 浏览:846
x86在arm上编译 浏览:7
linux怎么配置网络 浏览:307
程序员想要的小礼物 浏览:186
java获取网页url 浏览:624
怎么做解压神器泡泡版 浏览:966
自己动手做一个c编译器 浏览:929
手机如何链接谷歌服务器地址 浏览:137
废掉一个程序员的武功 浏览:249
java树形算法 浏览:641
通达信加锁指标源码怎么看 浏览:754
将同名文件移动到部分同名文件夹 浏览:403
摆荡指标加压力线源码 浏览:915
新一代单片机特征 浏览:770
王者的服务器什么时候才修好 浏览:281