优化算法|自适应大邻域搜索算法及MATLAB代码实现

news2024/11/14 13:27:20

回来填坑了,本篇推文将详细讲解ALNS算法求解VRP问题及MATLAB代码实现。

算法介绍

ALNS算法伪代码

节约算法构造初始解

function routes=saving_init(DistMatrix, Demand, Cap)
C_EPS=1e-1;

N=size(DistMatrix,1);
routes=cell(numel(2:N),1);
for i=1:numel(routes)  % 每个节点单独一条路径
    routes{i}=i+1;
end

route_demands=Demand(1:end);
saving=clarke_wright_savings(DistMatrix);  % 计算节约值矩阵

endnode_to_route=[1,1:N-1];

for p=1:size(saving,1)
    i=saving(p,3);
    j=saving(p,4);

    cw_saving = DistMatrix(i,1)+DistMatrix(1,j)-DistMatrix(i,j);
    if cw_saving<0
        break
    end

    left_route = endnode_to_route(i);
    right_route = endnode_to_route(j);

    if isnan(left_route) || isnan(right_route) || left_route==right_route
        continue
    end
    merged_demand = route_demands(left_route)+route_demands(right_route);
    if merged_demand-C_EPS > Cap
        continue
    end
    route_demands(left_route) = merged_demand;

    if routes{left_route}(1)==i
        routes{left_route}=flip(routes{left_route});
    end

    if routes{right_route}(end)==j
        routes{right_route}=flip(routes{right_route});
    end

    if numel(routes{left_route})>1
        endnode_to_route( routes{left_route}(end)) = nan;
    end

    if numel(routes{right_route})>1
        endnode_to_route( routes{right_route}(1)) = nan;
    end

    endnode_to_route( routes{right_route}(end) ) = left_route;
    routes{left_route}=[routes{left_route},routes{right_route}];
    routes{right_route} = nan;
end

routes(cellfun(@(routes) any(isnan(routes)),routes)) = [];

移除算子

1、随机移除算子

function [removed,remove_vc] = RandomRemove(currentSol,dist,toRemove)

%% Remove
cusnum=size(dist,1)-1;
visit=ceil(rand*cusnum);    %随机从所有顾客中随机选出一个顾客
inplan=1:cusnum;            %所有顾客的集合
inplan(inplan==visit)=[];   %将被移出的顾客从原有顾客集合中移出
removed=[visit];            %被移出的顾客集合

while length(removed)<toRemove
    nip=length(inplan);             %原来顾客集合中顾客的数量
    vc=inplan(ceil(rand*nip));      %从inplan数组中选择一个客户
    removed=[removed vc];           %向被移出的顾客集合中添加被移出的顾客
    inplan(inplan==vc)=[];          %将被移出的顾客从原有顾客集合中移出
end
remove_vc=currentSol;               %移出removed中的顾客后的current_vc
nre=length(removed);                %最终被移出顾客的总数量
NV=size(currentSol,1);              %所用车辆数
for i=1:NV
    route=currentSol{i};
    for j=1:nre
        findri=find(route==removed(j),1,'first');
        if ~isempty(findri)
            route(route==removed(j))=[];
        end
    end
    remove_vc{i}=route;
end

[ remove_vc] = deal_vehicles_customer( remove_vc );
end



修复算子

贪婪插入算子

function [newRoutes] = GreedyInsert(removed,removeSol,dist,demands,cap)

while ~isempty(removed)
    %% 将最小插入目标距离增量最小的元素找出来
    [InsertCustomer,InsertVehicle,InsertPosition]=shortestINS(removed,removeSol,dist,demands,cap);
    removed(removed==InsertCustomer)=[];
    %% 根据插入点将元素插回到原始解中
    [removeSol]=insert(InsertCustomer,InsertVehicle,InsertPosition,removeSol);
end
[ newRoutes ] = deal_vehicles_customer(removeSol);
end

输出路径结果

function PlotSolution(model,FinalRoutes)

numRoutes=numel(FinalRoutes);

xCoords=model.x;
yCoords=model.y;
xCoords_depot=xCoords(1);
yCoords_depot=yCoords(1);

Colors=hsv(numRoutes*1);

for j=1:numRoutes
    
    if isempty(FinalRoutes{j})
        continue;
    end
    
    X=[xCoords_depot xCoords(FinalRoutes{j}(2:end-1)) xCoords_depot];
    Y=[yCoords_depot yCoords(FinalRoutes{j}(2:end-1)) yCoords_depot];
    
    Color=1*Colors(j,:);
    
    plot(X,Y,'-o',...
        'Color',Color,...
        'LineWidth',2,...
        'MarkerSize',10,...
        'MarkerFaceColor',Color);
    hold on;
     
end

    plot(xCoords_depot,yCoords_depot,'ks',...
    'LineWidth',2,...
    'MarkerSize',15,...
    'MarkerFaceColor','yellow');
    hold on;

for i=2:numel(xCoords)
    text(xCoords(i)-.5,yCoords(i)+2,num2str(i));
end
end

结果展示

迭代收敛曲线

路径示意图

参考文献

PISINGER D, ROPKE S. A general heuristic for vehicle routing problems [J]. Computers & Operations Research, 2007, 34(8): 2403-2435.

ROPKE S, PISINGER D. An adaptive large neighborhood search heuristic for the pickup and delivery problem with time windows [J]. Transportation Science, 2006, 40(4): 455-472.

若有运筹优化建模及算法定制需求,欢迎联系我们私聊沟通

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1952632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c生万物系列(继承)

上一节笔者用宏和文件模拟了封装&#xff0c;这一节笔者继续使用c语言模拟继承。 简单介绍就是&#xff1a;在结构体里面重新定义需要继承的结构体。 调用时&#xff0c;使用&obvir,可以想象我们定义数组*p&#xff0c;p表示该数组第一个成员&#xff0c;这是因为结构体声…

【教程】vscode添加powershell7终端

win10自带的 powershell 是1.0版本的&#xff0c;太老了&#xff0c;更换为powershell7后&#xff0c;在 vscode 的集成终端中没有显示本篇教程记录在vscode添加powershell7终端的过程 打开vscode终端配置 然后来到这个页面进行设置 查看 powershell7 的安装位置&#xff…

【计算机毕业设计】869渔具在线销售网站

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【调色板软件】免费、开源的调色板软件,焰火十二卷,提供了多种功能来生成一组调和色彩NO.108

本文一共:316 个字,需要阅读:1 分钟,更新时间:2024年7 月27日,部分内容具有时效性,如有失效请留言,阅读量:0 使用平台&#xff1a; Windows/macOS/CentOS/Ubuntu 由于我不是很懂&#xff0c;有需要的人自己摸索吧 资源来源于网络&#xff0c;免费分享仅供学习和测试使用&…

秒懂C++之string类(下)

目录 一.接口说明 1.1 erase 1.2 replace&#xff08;最好别用&#xff09; 1.3 find 1.4 substr 1.5 rfind 1.6 find_first_of 1.7 find_last_of 二.string类的模拟实现 2.1 构造 2.2 无参构造 2.3 析构 2.4.【】运算符 2.5 迭代器 2.6 打印 2.7 reserve扩容 …

Linux嵌入式学习——数据结构——概念和Seqlist

数据结构 相互之间存在一种或多种特定关系的数据元素的集合。 逻辑结构 集合&#xff0c;所有数据在同一个集合中&#xff0c;关系平等。 线性&#xff0c;数据和数据之间是一对一的关系。数组就是线性表的一种。 树&#xff0c; 一对多 图&#xff0c;多对多 …

金螳螂家整装新品GH7隆重发布:引领家居美学新风尚,重塑性价比标杆

近日&#xff0c;家装行业知名品牌金螳螂家隆重发布高端性价比数智整装新品——GH7&#xff0c;一款集设计美学、极致性价比与高度确定性于一身的产品&#xff0c;旨在为中国有改善型需求的家庭带来前所未有的家居生活体验。 以用户需求为核心&#xff0c;重塑家装设计新高度 …

Harmony学习(三)

1.模版字符串 let name:string 模版字符串 let age:number 18 console.log(字符串:,${name}和${age})2.字符串和数字互相转换 //字符串转数字 let str1:string 1.1 console.log(转换,Number(str1)) //output: 1.1 console.log(转换,parseInt(str1)) //output: 1 conso…

线上环境服务器CPU飙升排查

前因 收到线上服务器CPU使用率100%的告警信息。 环境 jdk1.8CentOS Linux &#xff1b;CentOS Linux 排查 查看服务器CPU使用率 果然cpu已经达到了100%了 命令 top 使用arthas工具 使用方式 arthas 执行命令java -jar arthas-boot.jar 然后执行命令 thread 看到有两个…

《如何找到自己想做的事》

Arouse Enthusiasm, Give Scope to Skill, Explore The Essence *摘其两纸 我喜欢打篮球&#xff0c;并不是我真的喜欢这项运动&#xff0c;而是我喜欢团队竞技。我喜欢看书&#xff0c;并不是我真喜欢阅读&#xff0c;而是我想要了解世界运行逻辑。寻找热爱&#xff0c;探寻本…

旅游城市晚高峰延长2小时见证消费新活力 啤酒节滴滴打车需求上涨超300%

进入盛夏&#xff0c;各地夜生活“花式上新”&#xff0c;夜间出行链接夜食、夜游、夜购等多元消费业态&#xff0c;激发经济活力。滴滴出行数据显示&#xff0c;7月以来&#xff0c;哈尔滨、珠海、贵阳、西安等多个城市打车晚高峰延长2小时以上。 22点后打车需求上涨最高 “夜…

使用阿里云云主机通过nginx搭建文件服务器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、准备基础环境二、安装配置nginx三、阿里云安全组配置安全组配置 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4ee96f38312e4771938e40f463987…

【Java Bean 映射器】通过 MapStruct 和 BeanUtils 拷贝对象的区别

目录 &#x1f44b;前言 &#x1f440;一、环境准备 &#x1f331;二、拷贝工具使用 2.1 BeanUtils 使用 2.2 MapStruct 使用 &#x1f49e;️三、对比 &#x1f4eb;四、章末 &#x1f44b;前言 小伙伴们大家好&#xff0c;最近在一些技术文章中看到了开发时经常接触的对…

小论文写不出来?一文告别没思路!SCI级新算法闪耀登场,完整代码及应用直接获取

最近稍微有点忙&#xff0c;事情比较多&#xff0c;构思灵感花费了不少时间。这次发布的算法和前几个基于数学基本思想开发的算法不一样&#xff0c;是一种基于动物的一种算法&#xff0c;从动物的本能和行为中汲取灵感。本算法的开发&#xff0c;灵感撰写以及完整的算法已经全…

【“微软蓝屏”事件暴露了网络安全哪些问题?】建设安全稳固的网络基础设施

目录 前言一、软件更新流程中的风险管理和质量控制机制&#xff08;一&#xff09;测试流程及风险识别&#xff08;二&#xff09;风险管理策略&#xff08;三&#xff09;质量控制措施 二、预防类似大规模故障的最佳方案或应急响应对策&#xff08;一&#xff09;冗余系统设计…

0722_驱动1 字符设备驱动框架

一、字符设备驱动框架 字符设备驱动按照字节流进行访问&#xff0c;并且只能顺序访问 设备号一共有32位&#xff0c;主设备号&#xff08;高12位&#xff09;次设备号&#xff08;低20位&#xff09; 二、注册/注销字符设备驱动API接口 2.1、注册字符设备驱动(入口) #include &…

小白学习webgis的详细路线

推荐打开boss直聘搜索相关岗位&#xff0c;查看岗位要求&#xff0c;对症下药是最快的。 第一阶段&#xff1a;基础知识准备 计算机基础 操作系统&#xff1a;理解Windows、Linux或macOS等操作系统的基本操作&#xff0c;学会使用命令行界面。网络基础&#xff1a;掌握TCP/I…

【netty系列-05】深入理解直接内存与零拷贝

Netty系列整体栏目 内容链接地址【一】深入理解网络通信基本原理和tcp/ip协议https://zhenghuisheng.blog.csdn.net/article/details/136359640【二】深入理解Socket本质和BIOhttps://zhenghuisheng.blog.csdn.net/article/details/136549478【三】深入理解NIO的基本原理和底层…

谷歌再被OpenAI截胡?训练数学AI拿下IMO银牌,不及SearchGPT放了空响..

昨夜谷歌振臂高呼&#xff1a;我们新的数学AI&#xff0c;能在IMO数学竞赛达到银牌水平&#xff01; 但就在谷歌发文的几个小时后&#xff0c;OpenAI就偷了谷歌的家&#xff1a; 发布新的搜索方式SearchGPT &#xff0c;剑指挑战谷歌的搜索引擎。 谷歌双模型并用攻克数学难题…

如何利用业余时间做副业,在家里赚钱,来增加收入

人一生每个阶段都会有压力和烦恼&#xff0c;中年人更是如此。 上有老下有小&#xff0c;生活的重担都在一个人身上&#xff0c;压得人喘不过气&#xff0c;这些都需要钱&#xff0c;仅靠工资已经很难维持一家人的开支了。 所以很多人打算利用业余时间做副业&#xff0c;来增加…