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

回来填坑了,本篇推文将详细讲解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;
endroute_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<0breakendleft_route = endnode_to_route(i);right_route = endnode_to_route(j);if isnan(left_route) || isnan(right_route) || left_route==right_routecontinueendmerged_demand = route_demands(left_route)+route_demands(right_route);if merged_demand-C_EPS > Capcontinueendroute_demands(left_route) = merged_demand;if routes{left_route}(1)==iroutes{left_route}=flip(routes{left_route});endif routes{right_route}(end)==jroutes{right_route}=flip(routes{right_route});endif numel(routes{left_route})>1endnode_to_route( routes{left_route}(end)) = nan;endif numel(routes{right_route})>1endnode_to_route( routes{right_route}(1)) = nan;endendnode_to_route( routes{right_route}(end) ) = left_route;routes{left_route}=[routes{left_route},routes{right_route}];routes{right_route} = nan;
endroutes(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)<toRemovenip=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:NVroute=currentSol{i};for j=1:nrefindri=find(route==removed(j),1,'first');if ~isempty(findri)route(route==removed(j))=[];endendremove_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:numRoutesif isempty(FinalRoutes{j})continue;endX=[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;endplot(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.mzph.cn/web/49553.shtml

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

相关文章

【Django】前端技术HTML常用标签(开发环境vscode)

文章目录 安装两个常用插件HTML常用标签定义文档类型DOCTYPE网页的结构html/head//title/body/div标题h1/h2/h3/h4/h5分割线hr段落 p列表ul/li&#xff0c;ol/li超链接a文本span图片img按钮button表格table&#xff08;table、tr、th、td&#xff09;表单form 安装两个常用插件…

目标检测 YOLOv5-7.0 详细调试自制数据集实战

目标检测 YOLOv5-7.0 详细调试&自制数据集实战 一、项目介绍及环境配置&#xff08;一&#xff09;项目解读&#xff08;二&#xff09;版本选择&#xff08;三&#xff09;环境配置 二、如何利用YOLOv5进行预测&#xff08;detect.py&#xff09;&#xff08;一&#xff0…

Windows 实用小工具:窗口钉子/文件管理 2024/7/27

一: wintop 窗口置顶工具 二:WinDirStat 这是一个免费的、开源的磁盘使用分析工具&#xff0c;适用于Windows系统。它会扫描你的硬盘&#xff0c;列出所有文件和文件夹的大小&#xff0c;并以图形化的方式展示&#xff0c;便于理解。 可以用来检测硬盘文件夹占用从而,酌情处…

JAVA.抽象、接口、内部类

1.抽象 共性&#xff0c;父类定义抽象方法&#xff0c;子类必须重写&#xff0c;或者子类也是抽象类 示例代码 animal package animalabstract;//定义抽象类animal public abstract class animal {String name;int age;//定义抽象方法eat&#xff0c;子类必须重写public abs…

Java给定一些元素随机从中选择一个

文章目录 代码实现java.util.Random类实现随机取数(推荐)java.util.Collections实现(推荐)Java 8 Stream流实现(不推荐) 完整代码参考&#xff08;含测试数据&#xff09; 在Java中&#xff0c;要从给定的数据集合中随机选择一个元素&#xff0c;我们很容易想到可以使用 java.…

【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件

目录 ​编辑 前言 系统调用 open 参数flags 参数mode write 追加方式 read close 文件描述符 打开多个文件并观察其文件描述符 C语言文件操作 理解一切皆文件 理解open操作 前言 各类语言的文件操作其实是对系统调用的封装 我们经常说&#xff0c;创建一个文件&a…

力扣第三十七题——解数独

内容介绍 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; 数独…

CVE-2024-39700 (CVSS 9.9):JupyterLab 模板中存在严重漏洞

在广泛使用的 JupyterLab 扩展模板中发现了一个严重漏洞&#xff0c;编号为CVE-2024-39700 。此漏洞可能使攻击者能够在受影响的系统上远程执行代码&#xff0c;从而可能导致大范围入侵和数据泄露。 该漏洞源于在扩展创建过程中选择“测试”选项时自动生成“update-integratio…

VIM基础配置

1. CTAGS配置 下载 上传虚拟机&#xff0c;解压&#xff0c;进入目录 tar -xzvf ctags-5.8.tar.gz cd ctags-5.8/编译 ./configure sudo make sudo make install查看是否安装成功 ctags --version打印如下 2. 使用Vundle 下载 git clone https://github.com/VundleVim/Vund…

Linux并发程序设计(3):守护进程

目录 前言 一、介绍 1.1 概念 1.2 特点 1.3 举例 二、系统编程 2.1 setsid函数 2.2 getpid函数 2.3 getsid函数 2.4 getpgid函数 2.5 chdir函数 三、代码例程 3.1 使子进程在后台运行 3.2 使子进程脱离原终端 3.3 更换目录&#xff0c;并设定权限&#xff08;非…

基于STM32通过云平台实现智慧大棚【手机远程查看温湿度】【报警】

文章目录 一、成果演示二、所用到的模块三、实现的功能四、接线说明五、WIFI模块配置步骤5.1云平台介绍5.2云平台使用5.3使用USB转TTL测试联通云平台 六、STM32代码编写七、手机上查看数据6.1下载软件&#xff08;仅限安卓手机&#xff09;6.2操作 一、成果演示 STM32通过物联网…

String、StringBuffer和StringBuilder

一、String类 1. String类的理解 2. String类结构 1. String类实现了Serializable接口,说明String对象可以串行化,即可以在网络上传输 2. String类实现了Comparable接口,说明String对象可以比较 String底层是一个字符数组,这个数组里存的是字符串的内容 例如:…

005 仿muduo实现高性能服务器组件_通信连接管理

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;仿muduo &#x1f4d2;代码仓库&#xff1a; 项目代码 &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多知识 文章目录 前言Channel模块设计原因整体设计代码如下 Connection模块设计原…

Florence2:Advancing a unified representation for a variety of vision tasks

Florence-2模型:开启统一视觉基础模型的新篇章_florence -2-CSDN博客文章浏览阅读1.1k次,点赞108次,收藏109次。Florence-2是由微软Azure AI团队开发的一款多功能、统一的视觉模型。它通过统一的提示处理不同的视觉任务,表现出色且优于许多大型模型。Florence-2的设计理念是…

用Postman Flows打造你的专属API:外部公开,轻松上手!

引言 Postman Flows 是一个使用 GUI 进行无代码 API 调用流程创建的服务。这篇文章我尝试使用 Flows 来构建将 Momento Topic 中的数据保存到 TiDB 的保存 API&#xff0c;因此想分享一些使用过程中的技巧等。 实现内容 将从 Momento Topics 配发的 JSON 数据保存到 TiDB 中。…

C++ 栈( stack )学习

目录 1.栈 2.模拟栈 1.1.入栈( push ) 1.2.出栈( pop ) 1.3.获取栈顶元素( top ) 3.直接使用栈( stack ) 3.1.导入头文件并创建栈 3.2.栈的操作 3.2.1.入栈( push ) 3.2.2.出栈( pop ) 3.2.3.获取栈顶元素( top ) 3.2.4.获取栈中元素个数( size ) 3.2.5.判断栈是否…

代码随想录算法训练营day8 | 344.反转字符串、541.反转字符串 II、卡码网:54.替换数字

文章目录 344.反转字符串思路 541.反转字符串 II思路 卡码网&#xff1a;54.替换数字思路复习&#xff1a;字符串 vs 数组 总结 今天是字符串专题的第一天&#xff0c;主要是一些基础的题目 344.反转字符串 建议&#xff1a; 本题是字符串基础题目&#xff0c;就是考察 revers…

docker挂载部署reids6.2.1

1.拉取镜像 docker pull redis:6.2.12.创建挂在目录&#xff08;根据自己要求修改具体目录&#xff09; mkdir -p /home/admin/redis/{data,conf}3.在/home/admin/redis/conf目录下创建redis.conf文件 cd /home/admin/redis/conf touch redis.conf4.复制下面文本到redis.conf…

浅析JWT原理及牛客出现过的相关面试题

原文链接&#xff1a;https://kixuan.github.io/posts/f568/ 对jwt总是一知半解&#xff0c;而且项目打算写个关于JWT登录的点&#xff0c;所以总结关于JWT的知识及网上面试考察过的点 参考资料&#xff1a; Cookie、Session、Token、JWT_通俗地讲就是验证当前用户的身份,证明-…