ALNS自适应大规模邻域搜索算法核心

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后悔插入算子

  1. 目的:后悔插入算子的目标是选择那些如果未在当前迭代中插入而会导致最大后悔的客户,以优化插入操作的顺序。

  2. 后悔值排序:基本后悔插入算子根据每个客户的后悔值对删除的客户进行排序。后悔值是通过比较客户的最佳插入位置(插入成本最低)与第二好的插入位置(次低插入成本)的差异来计算的。

  3. 计算后悔值:对于某个客户,其后悔值可以表示为其最佳插入位置和第二好的插入位置的插入成本值之差。换句话说,后悔值衡量了如果该客户未在当前迭代中插入会导致的潜在损失或后悔程度。

  4. 选择插入位置:基本后悔插入算子会选择具有当前未插入将会产生最大后悔值的插入位置。通过优先考虑具有最大后悔值的客户进行插入,算法旨在最小化整体后悔,即减少因错误插入顺序而导致的潜在损失。

通过这种基本后悔插入算子的选择策略,算法可以在插入操作中优先处理那些可能导致最大后悔的客户,从而提高解决方案的质量和效率。这种方法有助于优化插入顺序,减少潜在的错误决策带来的影响,提高算法的性能和收敛速度。

3.3 随机插入算子

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这段引用提到了ALNS算法的使用方法和一些相关的操作符,但并没有直接回答您的问题。不过,我可以为您提供一些关于ALNS算法的基本介绍和使用方法。 ALNS(Adaptive Large Neighborhood Search)算法是一种启发式算法,用于解决组合优化问题。它通过在每次迭代中随机选择一组邻域操作来搜索解空间,并根据当前问题实例的特征自适应地调整邻域操作的选择概率。ALNS算法已经在许多领域得到了广泛的应用,例如路线规划、生产调度、旅行商问题等。 要使用ALNS算法,您需要安装ALNS库。您可以使用以下命令在终端中安装ALNS库: ``` pip install alns ``` 安装完成后,您可以使用以下代码导入ALNS库: ```python from alns import ALNS ``` 接下来,您可以根据您的问题实例化ALNS对象,并添加适当的操作符。例如,您可以使用以下代码创建一个ALNS对象,并添加一些操作符: ```python from alns import ALNS from alns.operators import random_removal, path_removal, worst_removal, greedy_repair alns = ALNS(random_state) alns.add_destroy_operator(random_removal) alns.add_destroy_operator(path_removal) alns.add_destroy_operator(worst_removal) alns.add_repair_operator(greedy_repair) ``` 这里,我们使用了random_removal、path_removal和worst_removal三个销毁操作符,以及greedy_repair一个修复操作符。这些操作符将在每次迭代中随机选择,并用于搜索解空间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森屿~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值