1.LNS算法核心
LNS(Large Neighborhood Search)是一种启发式算法,用于解决组合优化问题。它是基于局部搜索的思想,但与传统的局部搜索算法不同,LNS通过在搜索过程中采用大规模变动来跳出局部最优解,并在此基础上进行小规模搜索以逐步改进当前解。
其核心是破坏算子和修复算子,如何选择和构建破坏算子和修复算子是较为关键的一部分,文献中大部分学者的做法是通过设计多个算子,通过不同得分进而用轮盘赌的选择方法选择适合的算子,以此文献为例。
1. 初始权重与得分:在每个迭代段开始时,所有算子的权重相等,所有算子的初始得分都等于 1。
2. 得分增加规则:
- 当找到新的全局最优解时,破坏和修复算子的得分将增加 4σ。
- 当出现比当前解更好且之前没有出现过的新解时,该算子的得分将增加 3σ。
- 如果新解改进了当前解,但该解之前出现过,则该方法的得分将增加 2σ。
- 如果新解满足以下三个条件:比当前解差,但被接受准则接受,并且以前从未遇到过,则该算子的得分将增加 1σ。
3. 轮盘赌机制:根据这些算子的最终得分,将轮盘赌机制应用于选取相应的破坏和修复算子。轮盘赌机制会根据算子的得分比例来确定下一步选择哪个算子进行操作。
通过这种得分管理策略,优化算法可以根据算子在迭代过程中的表现,动态调整其得分并优先选择具有更高得分的算子,以促进全局搜索和优化过程的有效性。这种策略可以帮助算法更快地收敛到更优的解决方案,并提高算法的搜索效率和质量。
2.移除算子
2.1 最差移除算子
(伪代码写的不是很清楚就不展示了)
在解决VRPTW问题时,在算法前期可以通过找到违反约束最大的顾客点,将其移除;
这与最差移除算子有异曲同工之妙
2.2 基本相关移除算子
在处理完违反约束的顾客后,就要开始选择高效的移除算子,下面代码计算了两个客户之间的相关性,但是并没有选择相关性最高的算子去移除,反而是随机选择的客户( vc=lst(ceil(rand^D*nip)); %从lst数组中选择一个客户),对一点可能可以进行一系列改进。
%% Remove操作,先从原有顾客集合中随机选出一个顾客,然后根据相关性再依次移出需要数量的顾客
%输入cusnum 顾客数量
%输入toRemove 将要移出顾客的数量
%输入D 随机元素
%输入dist 距离矩阵
%VC 每辆车所经过的顾客
%removed 被移出的顾客集合
%rfvc 移出removed中的顾客后的VC
function [removed,rfvc]=Remove(cusnum,toRemove,D,dist,VC)
%% Remove
inplan=1:cusnum; %所有顾客的集合
visit=ceil(rand*cusnum); %随机从所有顾客中随机选出一个顾客
inplan(inplan==visit)=[]; %将被移出的顾客从原有顾客集合中移出
removed=[visit]; %被移出的顾客集合
while length(removed)<toRemove
nr=length(removed); %当前被移出的顾客数量
vr=ceil(rand*nr); %从被移出的顾客集合中随机选择一个顾客
nip=length(inplan); %原来顾客集合中顾客的数量
R=zeros(1,nip); %存储removed(vr)与inplan中每个元素的相关性的数组
for i=1:nip
R(i)=Relatedness(removed(vr),inplan(i),dist,VC); %计算removed(vr)与inplan中每个元素的相关性
end
[SRV,SRI]=sort(R,'descend');
lst=inplan(SRI); %将inplan中的数组按removed(vr)与其的相关性从高到低排序
vc=lst(ceil(rand^D*nip)); %从lst数组中选择一个客户
removed=[removed vc]; %向被移出的顾客集合中添加被移出的顾客
inplan(inplan==vc)=[]; %将被移出的顾客从原有顾客集合中移出
end
rfvc=VC; %移出removed中的顾客后的VC
nre=length(removed); %最终被移出顾客的总数量
NV=size(VC,1); %所用车辆数
for i=1:NV
route=VC{i};
for j=1:nre
findri=find(route==removed(j),1,'first');
if ~isempty(findri)
route(route==removed(j))=[];
end
end
rfvc{i}=route;
end
rfvc=deal_VC(rfvc);
end
3.修复算子
3.1 贪婪插入算子
在这篇博客中提到了相关的算子,函数名为farthestINS,内部有个函数是 cheapestIP,有兴趣额可以看看 LNS 大领域搜索解决VRPTW问题-CSDN博客
3.2后悔插入算子
-
目的:后悔插入算子的目标是选择那些如果未在当前迭代中插入而会导致最大后悔的客户,以优化插入操作的顺序。
-
后悔值排序:基本后悔插入算子根据每个客户的后悔值对删除的客户进行排序。后悔值是通过比较客户的最佳插入位置(插入成本最低)与第二好的插入位置(次低插入成本)的差异来计算的。
-
计算后悔值:对于某个客户,其后悔值可以表示为其最佳插入位置和第二好的插入位置的插入成本值之差。换句话说,后悔值衡量了如果该客户未在当前迭代中插入会导致的潜在损失或后悔程度。
-
选择插入位置:基本后悔插入算子会选择具有当前未插入将会产生最大后悔值的插入位置。通过优先考虑具有最大后悔值的客户进行插入,算法旨在最小化整体后悔,即减少因错误插入顺序而导致的潜在损失。
通过这种基本后悔插入算子的选择策略,算法可以在插入操作中优先处理那些可能导致最大后悔的客户,从而提高解决方案的质量和效率。这种方法有助于优化插入顺序,减少潜在的错误决策带来的影响,提高算法的性能和收敛速度。