局部搜索算法从一个初始解或当前解出发,按照一定的邻域结构对当前解进行改造,得到当前解的邻域解集,并根据一定的评价函数对邻域解集中的邻域解进行合理评价,按照一定的移动选择机制,选择某个邻域解(通常是比当前解更好的邻域解)作为新的初始解,重复执行以上过程,直到满足某种终止条件,则输出当前找到的最优解或近似最优解作为待优化问题的最终解。
常见的局部搜索算法有基本局部搜索算法、模拟退火算法、禁忌搜索算法。
局部搜索算法简单通用、性能优越,是求解复杂组合优化问题的重要方法,同时也是求解JSP问题最有效的方法之一。然而局部搜索算法依赖于问题模型,邻域结构能够影响局部搜索算法的性能。
邻域结构是一种产生邻域解的机制,即通过特定方式对一个当前可行解进行微小的扰动,以产生一定数量的邻域解,从而构成当前解的邻域解集。选择一个邻域解更新当前解的过程即为邻域移动,也可简称为移动。
邻域结构决定了局部搜索算法求解JSP问题时,通过一个可行解获得另一个可行解的搜索过程。因而邻域结构的优劣会直接影响局部搜索算法的求解质量和求解效率。可以说几乎所有依赖邻域结构的搜索算法,其算法性能都要受到邻域结构的影响。因此在求解JSP问题时,需要在保证求解质量的情况下,对邻域结构进行优化,以有效缩小邻域搜索的范围,减少不必要和不可行的邻域移动,从而提高局部搜索算法的执行效率。求解JSP问题的邻域结构设计需要兼顾邻域解的可行性检查、邻域规模、连通性三个重要问题。
邻域解的可行性检查是指设计一种机制,检查通过邻域结构的一步邻域移动产生的邻域解是否具有可行性,若存在不具有可行性的邻域解(不可行解),则该邻域结构的设计存在缺陷。
邻域规模是指对于一个当前可行解s,采用某一邻域结构可以获得的邻域解的數量,即设计邻域结构时,通常应使其邻域规模适中为宜。若邻域规模过大,则局部搜索算法的搜索时间过长;若邻域规模过小,则算法极易陷入局部最优,影响算法的求解质量。
连通性是指从任意当前解出发,通过邻域结构的有限次邻域移动,能够达到全局最优解的能力。邻域结构的连通性在一定程度上可以作为局部搜索算法寻优能力的保证。
经典的N1-N7邻域结构
- N1邻域结构
将移动定义为交换在同一台机器上加工的两道相邻关键工序的加工顺序。且证明了N1邻域结构渐进收敛,即具有连通性。但由于N1邻域结构包含大量非改进解,邻域规模过大,仅搜索过程便耗费了大量的运行时间,影响局部搜索算法的求解效率。
- N2邻域结构
N2邻域结构将移动定义为改变在同一台机器上加工的两道相邻关键工序u和v的加工顺序,且要求工序u的机器前继工序和工序v的机器后续工序不都是关键工序。
- N3邻域结构
提出了允许改变三道相邻工序加工顺序的N3邻域结构,虽然缩小了邻域规模,但却是以牺牲连通性为代价。
- N4邻域结构
基于块的概念提出了N4邻域结构,将移动定义为:在保证得到可行邻域解的前提下,尽可能地将块内工序插入块首工序之前或块尾工序之后。由于该邻域结构的一次移动可以改变多道工序的加工顺序,因而该结构的邻域规模更大。
- N5邻域结构
改变块首或块尾的两道相邻关键工序的加工顺序,具体来说,若第一个块包含的工序总数多于3时,则移动不包含第一个块的块首两道工序的交换;若最后一个块包含的工序总数多于3时,移动不包含最后一个块的块尾两道工序的交换;对于仅包含一道工序的块,则不进行移动。
- N6邻域结构
将块内工序插入到块首工序之前,即后向插入移动;或将块内工序插入到块尾工序之后,即前向插入移动。
- N7邻域结构
将前向插入移动重新定义为块内工序插入到块首工序之前,或将块尾工序插入到块内部。