【运筹优化】元启发式算法详解:禁忌搜索算法(Tabu Search,TS)+ 案例讲解&代码实战
在过去的30年中,运筹学文献中出现了数百篇介绍禁忌搜索(TS)应用的论文,禁忌搜索是Glover在1986年提出的一种启发式方法。在一些情况下,所描述的方法提供了非常接近最优的解,即使不是最好的,也是最有效的,来解决眼前的难题。这些成功使得TS在那些对在许多实际环境中遇到的大型组合问题寻找好的解决方案感兴趣的人中非常受欢迎。尽管有如此丰富的文献,似乎仍有许多研究者,虽然他们渴望将TS应用于新的问题
文章目录
一、介绍
在过去的30年中,运筹学文献中出现了数百篇介绍禁忌搜索(TS)应用的论文,禁忌搜索是Glover在1986年提出的一种启发式方法。
在一些情况下,所描述的方法提供了非常接近最优的解,即使不是最好的,也是最有效的,来解决眼前的难题。
这些成功使得TS在那些对在许多实际环境中遇到的大型组合问题寻找好的解决方案感兴趣的人中非常受欢迎。
尽管有如此丰富的文献,似乎仍有许多研究者,虽然他们渴望将TS应用于新的问题环境,但发现很难正确地掌握该方法的基本概念,其优势和局限性,并提出有效的实施方案。
在本博客中,一个相对简单,但具有挑战性和相关性的问题将被用来解释这些概念:经典的车辆路径问题(Classical Vehicle Routing Problem,CVRP)。
二、The Classical Vehicle Routing Problem 经典的车辆路径问题
车辆路径问题在配送管理领域有着非常重要的应用。因此,它们已经成为组合优化文献中研究最多的一些问题,并且大量的论文和书籍涉及已经提出的解决它们的许多程序。
其中包括目前最有效的几种TS实现。经典的车辆路径问题(CVRP)是这类问题的基本变体。它可以正式定义如下:
设 G = ( V , A ) G = (V,A) G=(V,A) 是一个图,其中 V V V 是顶点集, A A A 是弧集。其中一个顶点表示由容量为 Q Q Q 的 m m m 辆相同车辆组成的车队所基于的仓库,其他顶点表示需要服务的客户。需求 q i q_i qi 和服务时间 t i t_i ti 与每个客户顶点 v i v_i vi 相关联。 A A A 的每个弧 ( v i , v j ) (v_i,v_j) (vi,vj) 与成本 c i j c_{ij} cij 和行程时间 t i j t_{ij} tij 相关联。
CVRP的目标在于找到一组路线,使得:
- 每条路线的起点和终点都在仓库
- 每个客户只能通过一条路线访问一次
- 分配给每条路线的客户的总需求不超过 Q Q Q
- 每条路线的总持续时间(包括行驶和服务时间)不超过指定值 L L L
- 路线的总成本被最小化
因此,该问题的可行解决方案包括将客户划分为 m m m 个组,每个组的总需求不大于 Q Q Q ,对这些组进行排序,以产生持续时间不大于l的路线(起点和终点都在仓库)。
下面将使用该问题来说明如何在实践中应用各种TS概念。
三、基本概念
在介绍TS的基本概念之前,下一小节首先回顾过去,试图更好地理解该方法的起源以及它与以前的工作的关系。
3.1 历史背景
自运筹学开始以来,启发式方法,即近似求解技术,一直被用来解决困难的组合问题。
随着70年代初复杂性理论的发展,很明显,由于这些问题大多是NP难的,几乎没有希望找到有效的精确解程序。
这种认识强调了启发式算法在解决组合问题中的作用,这些组合问题在现实生活中遇到并且需要解决,无论它们是否是NP困难的。
虽然提出并试验了许多不同的方法,但最流行的方法是基于局部搜索(LS)改进技术。LS可以粗略地概括为一个迭代搜索过程,从初始可行解开始,通过应用一系列局部修改(或移动)来逐步改进它。
在每次迭代中,搜索移动到一个改进的可行解,该可行解仅与当前解略有不同(事实上,先前解和新解之间的差异相当于上面提到的局部修改之一)。
当搜索遇到关于它所考虑的变换的局部最优时,搜索终止,这是该方法的一个重要限制:除非非常幸运,否则这个局部最优通常是一个相当一般的解。
在最小二乘法中,获得的解的质量和计算时间通常高度依赖于每次启发式迭代中考虑的变换(移动)集的丰富性。
1983年,一篇论文的出现打破了组合优化的世界,该论文表明,一种称为模拟退火(SA)的新的启发式方法可以收敛到组合问题的最优解,尽管计算时间是无限的。
基于与统计力学的类比,SA可以解释为可行解空间中的一种受控随机行走。
模拟退火算法的出现表明人们可以寻找其他方法来解决组合优化问题,并激发了研究界的兴趣。
在接下来的几年中,提出了许多其他新方法,主要是基于与自然现象的类比(如TS、蚁群优化、粒子群优化、人工免疫系统),加上一些旧方法,如遗传算法,越来越受欢迎。
现在统称为元启发式(一个最初由Glover在中创造的术语),这些方法在过去20年中已经成为解决组合优化问题的启发式方法的前沿。
3.2 禁忌搜索
基于他之前的一些工作,Fred Glover提出了一种新的方法,他称之为禁忌搜索,允许局部搜索方法克服局部最优。
事实上,第一个TS提案的许多元素,以及后来TS阐述的一些元素,包括防止近期走势逆转的短期记忆,以及加强有吸引力成分的长期频率记忆。
TS的基本原则是通过允许非改进移动,每当遇到局部最优时就追求LS;通过使用被称为禁忌列表的记忆,可以防止循环回到以前访问过的解决方案,禁忌列表记录了最近的搜索历史,这是一个可以与人工智能概念联系起来的关键想法。
同样重要的是,Glover 并没有把TS看作是一种恰当的启发式方法,而是一种元启发式方法,即一种指导和控制内部启发式方法的一般策略,这种内部启发式方法是专门为手头的问题量身定做的。
3.3 搜索空间和邻域结构
正如我们刚才提到的,TS是经典LS方法的扩展。
事实上,一个基本的TS可以简单地看作是LS与短期记忆的结合。由此可见,任何TS启发式算法的两个基本要素是其搜索空间和邻域结构的定义。
LS或TS试探法的搜索空间就是在搜索过程中可以考虑(访问)的所有可能解决方案的空间。
举例来说,在CVRP的例子中,搜索空间可以简单地是问题的可行解的集合,其中搜索空间中的每个点对应于满足所有指定约束的一组车辆路线。
虽然在这种情况下,搜索空间的定义似乎很自然,但它并不总是如此。例如,在有能力限制的工厂选址问题(CPLP)中,客户必须从位于潜在地点子集中的工厂得到服务。在这种情况下,可以使用由二进制位置变量(站点是开放的还是关闭的)和连续的流量变量构成的完全可行的搜索空间。
然而,通过将搜索空间限制到二进制位置变量,可以获得更有吸引力的搜索空间,从该搜索空间,可以通过求解相关联的运输问题来获得最优流变量,从而获得完整的解决方案。
人们也可以决定搜索可行流量变量向量集的极值点,通过注意到无论何时某个流量被分配给某个工厂时该工厂必须是开放的来检索相关的位置变量。
同样重要的是要注意,将搜索空间限制在可行的解决方案并不总是一个好主意;在许多情况下,允许搜索移动到不可行的解决方案是可取的,有时是必要的。
与搜索空间的定义紧密相关的是邻域结构的定义。在LS或TS的每次迭代中,可以应用于当前解的局部变换,表示为 S S S ,定义了搜索空间中的一组相邻解,表示为 N ( S ) N(S) N(S) ( S S S 的邻域)。
在形式上, N ( S ) N(S) N(S) 是由通过对 S S S 应用单个局部变换而获得的所有解构成的搜索空间的子集。通常,对于手头的任何特定问题,存在比搜索空间定义更多的可能(甚至更有吸引力的)邻域结构。
这是因为对于给定的搜索空间定义,可能有几个似是而非的邻域结构。这在我们的CVRP例子中很容易说明,这个例子是几个TS实现的对象。为了简化讨论,我们在下面假设搜索空间是可行空间。CVRP的简单邻域结构包括在每次迭代中从其当前路线移动单个客户;所选客户被插入同一路线或具有足够剩余容量的另一路线。
这些邻域结构的一个重要特征是执行插入的方式:可以使用随机插入或在目标路径的最佳位置插入;或者,可以使用更复杂的插入方案,包括目标路线的部分再优化,如GENI插入。在继续下一步之前,重要的是要强调,虽然我们说这些邻域结构涉及移动单个客户,但是它们定义的邻域包含所有可行的路线配置,这些配置可以通过移动任何客户并以规定的方式插入它而从当前解决方案中获得。因此,检查邻居可能相当困难。
CVRP的更复杂的邻域结构,如λ-交换,通过同时允许顾客移动到不同的路线和在路线之间交换顾客来获得。其他邻域结构包括在路由之间交换几个客户的序列,如交叉交换。这些类型的邻域很少用于CVRP,但在时间窗口扩展的TS启发式算法中很常见,在这种情况下,必须在预先指定的时间间隔内访问客户。
当对于一个给定的问题考虑搜索空间的不同定义时,邻域结构将不可避免地在相当大的程度上不同。在上面提到的CPLP的情况下,如果搜索空间仅对应于位置变量,则可以使用操作符来改变这些变量的状态(从打开到关闭,反之亦然)。
然而,如果搜索空间由一组可行的流动变量向量的极值点组成,则可以考虑通过将枢轴应用于运输问题的线性规划公式来定义移动,以将当前解移动到相邻的极值点。
因此,选择搜索空间和邻域结构是任何TS启发式算法设计中最关键的一步。正是在这一步,一个人必须充分利用他/她对手头问题的理解和知识。
3.4 Tabus 禁忌
Tabus(禁忌)是ts与LS相比的独特元素之一。
正如我们已经提到的,禁忌是用来防止在通过非改进的移动离开局部最优时出现循环。这里的关键认识是,当这种情况发生时,需要做一些事情来防止搜索追溯到它的来源。这是通过声明禁忌(不允许)移动来实现的,它可以逆转最近移动的效果。
Tabus也有助于搜索从搜索空间中以前访问过的部分移开,从而执行更广泛的探索。
禁忌存储在搜索的短期记忆中(禁忌列表),通常只记录固定且相当有限的信息量。在任何给定的上下文中,关于记录的特定信息有几种可能性。
人们可以记录完整的解决方案,但这需要大量的存储空间,并使检查潜在的移动是否是禁忌的成本很高;因此很少使用。最常用的禁忌涉及记录对当前解决方案执行的最后几次转换,并禁止反向转换(如上例所示);其他的是基于解决方案本身或移动的关键特征。
为了更好地理解 tabus 是如何工作的,让我们回到我们的参考问题。在CVRP,人们可以用几种方式来定义禁忌。继续我们的示例,其中客户v1刚刚从R1路线移动到R2路线,可以明确地声明禁忌,禁止将v1从R2移动回R1,并在短期记忆中将其记录为三元组(v1,R2,R1)。
请注意,这种类型的禁忌不会对搜索造成太大限制,如果v1随后被移动到另一条路由R3,然后从R3移动到R1,则可能会发生循环。更强的禁忌应该是禁止将v1移回R1,而不考虑其当前路线,并被记录为(v1,R1)。
甚至,更强的禁忌还可以不允许将v1移动到任何其它路由,并简单地记为(v1)。
有时多个禁忌列表同时使用也是可取的。例如,当使用不同类型的移动生成邻域时,为每种类型保留一个单独的禁忌列表可能是个好主意。标准的禁忌表通常被实现为固定长度的循环表。然而,已经证明固定长度的禁忌不能总是防止循环,一些作者已经提出在搜索期间改变禁忌列表长度。
另一个解决方案是在某个指定的时间间隔内随机生成每次移动的禁忌任期;使用这种方法需要一种稍微不同的方案来记录禁忌,然后通常将禁忌作为标签存储在一个数组中(该数组中的条目通常将记录迭代次数,直到一个移动成为禁忌。
3.5 解禁准则
虽然禁忌是TS的核心,但有时过于强大:它们可能禁止有吸引力的动作,即使没有循环的危险,或者它们可能导致搜索过程的整体停滞。因此,有必要允许撤销(取消)禁忌,这些被称为解禁准则。
在几乎所有TS实现中发现的最简单和最常用的接近准则在于,如果移动产生的解决方案的目标值优于当前最佳已知解决方案的目标值,则允许移动,即使它是禁忌的(因为新的解决方案显然以前没有被访问过)。
3.6 简单禁忌搜索的模板
我们现在可以为TS提供一个通用的模板,整合了我们到目前为止看到的元素。我们假设我们试图在某个域上最小化函数 f ( S ) f(S) f(S) ,并且我们应用所谓的TS的最佳改进版本,即,在每次迭代中选择最佳可用移动的版本(这是TS的最常用版本)。
符号:
- S S S:当前的解决方案
- S ∗ S^* S∗:最佳解决方案
- f ∗ f^* f∗: S ∗ S^* S∗的目标值
- N ( S ) N(S) N(S): S S S的邻域
- N ~ ( S ) \tilde{N}(S) N~(S): N ( S ) N(S) N(S) 的容许子集(即,非禁忌或解禁的)
- T T T:禁忌表
初始化:
- 选择(构建)一个初始解 S 0 S_0 S0
- 令 S ← S 0 , f ∗ ← f ( S 0 ) , S ∗ ← S 0 , T ← ∅ S \leftarrow S_0, f^* \leftarrow f\left(S_0\right), S^* \leftarrow S_0, T \leftarrow \emptyset S←S0,f∗←f(S0),S∗←S0,T←∅
搜索:
- 不满足终止标准时,执行以下操作:
- 从 argmin S ′ ∈ N ~ ( S ) [ f ( S ′ ) ] \operatorname{argmin}_{S^{\prime} \in \tilde{N}(S)}\left[f\left(S^{\prime}\right)\right] argminS′∈N~(S)[f(S′)] 中选择 S S S
- if f ( S ) < f ∗ , then set f ∗ ← f ( S ) , S ∗ ← S \text { if } f(S)<f^* \text {, then set } f^* \leftarrow f(S), S^* \leftarrow S if f(S)<f∗, then set f∗←f(S),S∗←S
- 在 T T T 中记录当前移动的tabu(如有必要,删除最旧的禁忌项)
3.7 终止标准
有人可能已经注意到,我们没有在模板中指定终止标准。理论上,这种探索可能会永远继续下去,除非事先知道手头问题的最佳价值。实际上,很明显,搜索必须在某个时候停止。TS中最常用的停止标准是:
- 在固定数量的迭代(或固定数量的CPU时间)之后
- 在一定次数的迭代之后,目标函数值没有改善(大多数实现中使用的标准)
- 当目标达到预先指定的阈值时
在复杂的禁忌方案中,搜索通常在完成一系列阶段后停止,每个阶段的持续时间由上述标准之一决定。
3.8 概率TS和候选列表
在常规TS中,必须评估当前解的邻域 N ( S ) N(S) N(S) 的每个元素的目标。从计算的角度来看,这被证明是极其昂贵的。
一种替代方案是改为仅考虑 N ( S ) N(S) N(S) 中的随机样本 N ′ ( S ) N'(S ) N′(S),从而显著降低计算负担。
另一个吸引人的特点是增加的随机性可以作为反循环机制;这允许使用比如果执行邻域的完全探索所必需的更短的禁忌列表。
在消极的一面,必须注意到,在这种情况下,人们可能会错过优秀的解决方案。概率也可以应用于激活禁忌标准。
控制被检查的移动数量的另一种方式是通过候选列表策略,其提供了生成 N ( S ) N(S) N(S) 的有用子集 N ′ ( S ) N'(S) N′(S) 的更具战略性的方式(概率方法可以被认为是候选列表策略的一个实例,并且也可以用于修改这样的策略)。
未能充分解决创建有效候选列表所涉及的问题是一个更明显的缺点,它将幼稚的ts实现与更坚实的TS实现区分开来。
四、中级概念
如上所述,简单的TS有时可以成功地解决困难的问题,但在大多数情况下,搜索策略中必须包括额外的元素,以使其完全有效。我们现在简要回顾其中最重要的。
4.1 搜索强化
搜索强化概念背后的思想是,正如一个聪明的人可能会做的那样,一个人应该更彻底地探索搜索空间中似乎有希望确保在这些领域中确实找到最佳解决方案的部分。因此,人们会不时地停止正常的搜索过程,以执行强化阶段。
一般来说,强化是基于某种中期记忆,例如新近记忆,其中记录了各种解决方案成分在当前解决方案中不间断出现的连续迭代次数。例如,在CVRP应用程序中,可以记录一个弧使用了多长时间。
强化的典型方法是从目前已知的最佳解决方案重新开始搜索,并修复看起来更有吸引力的组件。继续CVRP的例子,可以修复已经使用了最大迭代次数的弧,并对剩余的弧执行受限搜索。另一种经常使用的技术是改变邻域结构。
在CVRP的例子中,人们因此可以允许更复杂的插入移动或切换到弹出链邻域结构。在概率TS中,可以增加样本大小或切换到不采样的搜索。
许多TS实现中都使用了强化,但并不总是必要的。这是因为在许多情况下,正常流程执行的搜索已经足够彻底。因此,没有必要花费时间来更仔细地探索搜索空间中已经被访问过的部分,并且正如我们现在将看到的,可以更有效地利用这些时间。
4.2 多样化
基于局部搜索方法的所有方法的一个主要问题是,它们倾向于过于局部化(正如它们的名字所暗示的),即,它们倾向于在搜索空间的有限部分花费大部分时间。
这一事实的负面结果是,尽管可以获得好的解决方案,但是人们可能无法探索搜索空间中最有趣的部分,因此最终得到的解决方案仍然离最优解很远。
多样化是一种算法机制,试图通过迫使搜索进入搜索空间中以前未探索的区域来缓解这个问题。它通常基于搜索的某种形式的长期记忆,例如频率记忆,其中记录各种解决方案成分已经出现在当前解决方案中或者已经涉及所选移动的迭代总数(从搜索开始)。
例如,在CVRP应用程序中,可以记录每个客户从当前路线移动了多少次。在有可能识别搜索空间的有用区域的情况下,可以改进频率存储器来跟踪在这些不同区域中花费的迭代次数。
有两种主要的多样化技术。第一种称为重新开始多样化,包括在当前解决方案(或最佳已知解决方案)中强制使用一些很少使用的组件,并从这一点重新开始搜索。根据CVRP的启发,还没有被频繁转移的顾客可能会被迫选择新的路线。
第二种多样化方法称为连续多样化,将多样化考虑直接整合到常规搜索过程中。这是通过在目标中增加一个与分量频率相关的小项来偏置可能移动的评估来实现的。
实现多样化的第三种方式是战略振荡,我们将在下一小节中看到。
在结束这一小节之前,我们想强调的是,确保适当的搜索多样化可能是TS启发式设计中最关键的问题。在设计阶段的早期就应该非常小心地解决这个问题,如果获得的结果没有达到预期,就应该重新考虑。
4.3 允许不可行解
在搜索空间的定义中考虑所有的问题约束通常会过多地限制搜索过程,并可能导致平庸的解决方案。例如,这发生在CVRP的情况下,其中路线容量或持续时间限制太紧,不允许在路线之间有效地运送顾客。
在这种情况下,约束松弛是一个有吸引力的策略,因为它创建了一个更大的搜索空间,可以用更简单的邻域结构来探索。通过从搜索空间定义中删除选定的约束并增加对违反约束的客观加权惩罚,可以容易地实现约束放松。
然而,这提出了为违反约束找到正确权重的问题。
绕过这个问题的一个有趣的方法是使用自调整惩罚,即根据最近的搜索历史动态调整权重:如果在最近几次迭代中只遇到不可行解,则增加权重,如果所有最近的解都是可行的,则减少权重。
惩罚权重也可以被系统地修改,以驱动搜索跨越搜索空间的可行性边界,从而引起多样化。这种技术被称为战略振荡,一个重要的早期变量在不同类型的移动中振荡,因此是邻域结构,而另一个变量在关键函数的选定值附近振荡。
4.4 替代和辅助目标(代理模型)
有许多问题的真实目标函数是相当昂贵的评估。当这种情况发生时,即使使用采样,对移动的评估也可能变得禁止。
处理这一问题的有效方法是使用替代目标(即,与真实目标相关但计算要求较低的函数)来评估邻居,以便识别一组(小的)有希望的候选对象(实现替代对象的最佳值的潜在解决方案)。然后为这一小组候选移动计算真实目标,并选择最佳移动成为新的当前解决方案。
另一个经常遇到的困难是目标函数可能没有提供足够的信息来有效地将搜索驱动到搜索空间中更感兴趣的区域。
这种情况的一个典型例子是CVRP的变体,其中车队规模不是固定的,而是主要目标(即,寻找允许可行解决方案的最小车队规模)。在这个问题中,除了一条路径只有一个或几个分配给它的客户的解决方案之外,大多数邻域结构将导致邻域中的所有元素相对于主要目标得分相等的情况(即,所有允许的移动产生具有相同数量车辆的解决方案)。
在这种情况下,绝对有必要定义一个辅助目标函数来确定搜索方向。
这种功能必须以某种方式衡量解决方案的期望属性。例如,在我们的例子中,我们可以使用一个函数来支持只有少数几个顾客的路线的解决方案,从而增加了一个路线在随后的迭代中被完全清空的可能性。
应该注意的是,提出一个有效的辅助目标并不总是容易的,可能需要一个漫长的试错过程。在其他一些情况下,幸运的是,辅助目标对于任何熟悉手头问题的人来说都是显而易见的。
五、高级概念
略
六、关键参考
略
七、秘诀
尝试将该方法应用于他们希望解决的问题的TS新手通常会对他们需要做什么来实现成功感到困惑。本节旨在提供这方面的一些帮助。
7.1 入门指南
下面的一步一步的过程应该为开始提供一个有用的框架。
循序渐进的程序:
- 阅读一两篇好的介绍性文章,获得一些概念和词汇的知识。
- 阅读几篇详细描述不同领域应用的论文,看看这些概念是如何被其他研究人员实际实现的。
- 多想想手头的问题,集中在搜索空间的定义和邻域结构上。
- 基于这个搜索空间定义和这个邻域结构实现一个简单的版本。
- 收集关于这个简单启发式算法性能的统计数据。在这一点上,引入各种各样的记忆通常是有用的,比如频率记忆和新近记忆,以真正追踪启发式方法做了什么。
- 分析结果并相应调整程序。正是在这一点上,我们应该最终引入搜索强化和多样化的机制或其他中间特征。应特别注意多样化,因为这通常是简单的TS程序失败的地方。
7.2 更多 Tips
尽管仔细遵循了前面的步骤,但最终得到的启发却产生了平庸的结果,这种情况并不罕见。如果发生这种情况,以下提示可能会有用:
- 如果有约束,考虑处罚。在高度约束的问题中,让搜索移动到不可行的解决方案通常是必要的,以允许对搜索空间进行有意义的探索
- 重新考虑邻域结构,必要时进行更改。很多TS实现失败是因为邻域结构太简单。具体而言,应该确保所选择的邻域结构允许对可能的移动进行有目的的评估(即,看起来直观地将搜索移动到正确方向的移动应该是可能被选择的移动);引入一个替代目标来实现这一点可能也是一个好主意
- 收集更多统计数据
- 在一些合理大小的实例上一步一步地跟踪算法的执行
- 重新考虑多样化。如前所述,这是大多数TS实现中的一个关键特性
- 尝试参数设置。许多TS程序对参数设置极其敏感;在更改一两个关键参数的值后,过程的性能会显著提高,这并不罕见(不幸的是,在给定的过程中,确定哪些参数是关键参数并不总是显而易见的)
7.3 概率TS的附加 Tips
虽然概率TS是解决许多问题的有效方法,但它也产生了自己的问题,需要小心处理。其中最重要的是这样一个事实,即由概率TS返回的最佳解通常不会是关于所使用的邻域结构的局部最优解。
这尤其令人讨厌,因为在这种情况下,更好的解决方案很容易获得,有时甚至是手动获得。
解决这个问题的一个简单方法是在TS本身的末尾从最佳找到的解决方案简单地执行局部改进阶段(使用相同的邻域算子)。在完成算法之前,可以在短时间内切换到TS而不进行采样(也是从最佳找到的解决方案)。
一种可能更有效的技术是在整个搜索过程中增加一个强化步骤,而不进行采样;在这种方式下,通过该方法探索的搜索空间的各个区域中可用的最佳解决方案将被发现和记录。
7.4 参数校准和计算测试
参数校准和计算实验是开发任何算法的关键步骤。在TS的情况下尤其如此,因为大多数实现所需的参数数量相当大,并且因为当参数值被修改时,给定过程的性能可能变化相当大。
任何严肃的计算实验的第一步都是选择一组好的基准实例(通过从其他研究人员那里获得或者通过构造它们),最好对它们的难度进行一些合理的度量,并且具有大范围的大小和难度。该集合应分为两个子集,第一个子集用于算法设计和参数校准步骤,第二个子集用于执行最终的计算测试,这些测试将在描述开发中的启发式算法的论文中报告。
这样做的原因很简单:当校准参数时,人们总是冒过度拟合的风险,即,找到对于手边的实例来说是极好的参数值,但是通常是差的,因为这些值对这些实例提供了太好的拟合(从算法的观点来看)。
因此,具有几个参数的方法应该在比具有几个参数的方法多得多的实例集上进行校准,以确保合理程度的稳健性。校准过程本身应分几个阶段进行:
- 执行探索性测试以找到良好的参数范围。这可以通过使用各种参数设置运行启发式算法来完成
- 修正看起来稳健的参数值,即,似乎对程序的性能没有显著影响的参数值
- 对其他参数进行系统测试。通常,一次只测试一个参数的值会更有效,其他的都固定在合理的值上。然而,必须小心参数之间的交叉效应。在存在这种影响的情况下,联合测试成对或三元组的参数可能很重要,当然,这可能是一项极其耗时的任务
7.5 总结
禁忌搜索是一种强大的算法方法,已经成功地应用于许多困难的组合问题。
TS的一个特别好的特性是,像所有基于本地搜索的方法一样,它可以非常容易地处理现实应用程序中常见的复杂约束。因此,这是一个真正实用的方法。
然而,它不是万灵药:每一个科学杂志的评论者或编辑都见过太多失败的TS试探法。这些失败源于两个主要原因:对该方法的基本概念理解不足(我们希望本教程将有助于减少这一缺点),而且,更多的时候,是对手头问题的严重缺乏理解。
一个人不可能为他/她不了解的问题开发出好的TS启发式算法!这是因为执行任何TS过程的开发的最基本步骤,即选择搜索空间和有效的邻域结构,绝对需要重要的问题知识。如果搜索空间和/或邻域结构不充分,再多的TS专家也不足以扭转局面。
最后一句警告:为了成功,所有的元启发式算法都需要在搜索过程中达到深度和广度;深度通常对TS来说不是问题,在这方面TS是非常积极的(TS启发式算法通常在搜索的早期就找到非常好的解决方案),但是广度可能是一个关键问题。为了解决这个问题,制定一个有效的多样化计划是非常重要的。
八、流程图
九、案例讲解&代码实战
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)