惩罚函数外点matlab,禁忌搜索算法求解带时间窗的车辆路径问题(惩罚函数版 附MATLAB代码)...
本周应小伙伴要求继续学习TS求VRPTW,不过这次通过使用惩罚约束的形式允许解违反时间窗约束和容量约束,不过要给违反约束的解加以惩罚。
这次我们的目标函数就不单单只有车辆总行驶距离了,还要包括当前解中各条路径违反的容量约束之和,还包括所有顾客违反的时间窗约束之和,具体计算公式如下:
表示车辆总行驶距离,
表示各条路径违反的容量约束之和,
表示所有顾客违反的时间窗约束之和。
表示车辆到达顾客i的时间,
表示顾客i的右时间窗。
邻域的设计与禁忌搜索算法求解带时间窗的车辆路径问题(下 附MATLAB代码)这篇推文中的设计相类似,不过去掉了时间窗约束和容量约束,并且只能将某一条路径上的某个顾客插入到使
增加最少的另一条路径上,比如说当前解中共有10条路径,100个顾客,那么当前解邻域的数目为100*(10-1),因为每个顾客都必须插到其他路径上,并且不能插回原来路径中。
论文中初始解的构造方式为:
但小编在实际编写程序的过程中,用这种方式构造初始解所求得的结果实在是太差了,所以小编还是用原来的CW法构造初始解(具体可参考CW节约算法构造VRPTW初始解(附MATLAB代码))。
然后论文中提到为了使邻域中的解保持多样性,提到了如下的惩罚措施:
论文中的主程序的伪代码为:
但小编看了post-optimization方法,觉得有点费事就把这步省略了。
小编在代码中将邻域结构这样设计
1%% 当前解S的邻域,用[i,j,k,p,TD]表示可行邻域,表示将顾客i从路径j移动到路径k的第p个位置,TD表示该邻域解的车辆行驶总距离
2%输入curr_vc 当前解
3%输入L 仓库时间窗
4%输入a,b 顾客时间窗
5%输入s 对顾客的服务时间
6%输入dist 距离矩阵
7%输入demands:表示由集配中心运送到顾客的配送量
8%输入cap 车辆负荷
9%输入权重alpha,belta,lamda
10%输出NS
11function [NS] = neighborhood(curr_vc,cusnum,a,b,s,L,dist,demands,cap,alpha,belta,lamda)
12NS=[];
13NV=size(curr_vc,1); %车辆数
14fcurr=costFuction(curr_vc,a,b,s,L,dist,demands,cap,alpha,belta);
15vc_copy=curr_vc;
16%思路是遍历所有顾客,将顾客从当前路径移除,然后依次插入到其他路径可行位置
17for i=1:cusnum
18 for j=1:NV
19 route=vc_copy{j};
20 pos=find(route==i,1,'first'); %顾客i在当前路径位置
21 %如果pos非空,则顾客i在路径j上
22 if ~isempty(pos)
23 break
24 end
25 end
26 for k=1:NV
27 vc_copy=curr_vc;
28 if (k~=j)&&(~isempty(curr_vc{k}))
29 route=vc_copy{k}; %当前路径所经过的顾客
30 route_copy=route;
31 lr=length(route); %当前路径所经过的顾客的数目,如果不考虑约束,就意味着有lr+1个插入位置
32 for p=1:lr+1
33 %先不考虑约束,将顾客i插入到路径k的任意可能插入位置
34 if p==1
35 route=[i route_copy];
36 elseif p==lr+1
37 route=[route_copy i];
38 else
39 route=[route_copy(1:p-1) i route_copy(p:end)];
40 end
41 route_before=vc_copy{j};
42 route_before(route_before==i)=[]; %将顾客i从路径j中移除
43 vc_copy{j}=route_before;
44 route_k=vc_copy{k};
45 vc_copy{k}=route;
46 vc_c=deal_vehicles_customer(vc_copy);
47 f=costFuction(vc_c,a,b,s,L,dist,demands,cap,alpha,belta);
48 % 如果f>=fcurr,则给当前解加惩罚
49 if f>=fcurr
50 c=travel_distance(vc_c,dist);
51 ps=lamda*c*(cusnum*size(vc_c,1))^0.5;
52 f=f+ps;
53 end
54 NS=[NS;i,j,k,p,f];
55 vc_copy{k}=route_k;
56 end
57 end
58 end
59 vc_copy=curr_vc;
60 nr=NV+1; %如果新建一条路径,把该顾客插到新建路径中
61 route=i;
62 vc_copy{nr}=route;
63 vc_c=deal_vehicles_customer(vc_copy);
64 f=costFuction(vc_c,a,b,s,L,dist,demands,cap,alpha,belta);
65 % 如果f>=fcurr,则给当前解加惩罚
66 if f>=fcurr
67 c=travel_distance(vc_c,dist);
68 ps=lamda*c*(cusnum*size(vc_c,1))^0.5;
69 f=f+ps;
70 end
71 NS=[NS;i,j,nr,1,f];
72 vc_copy=curr_vc;
73end
74end
相比于禁忌搜索算法求解带时间窗的车辆路径问题(下 附MATLAB代码)这篇推文中设计的邻域结构,这篇推文设计的邻域结构其实就是去掉时间窗约束和容量约束,然后给违反约束的解加以惩罚,这是小编对惩罚的理解,当然可能不太对,请各位小伙伴后台与小编交流讨论。
最后用matlab跑了几个solomn测试算例,发现求解的质量比上一篇推文求解的质量差好一些,但是求解时间有点长。
惩罚函数外点matlab,禁忌搜索算法求解带时间窗的车辆路径问题(惩罚函数版 附MATLAB代码)...相关推荐
- 禁忌搜索算法求解带时间窗的车辆路径问题原理讲解
前言 今天为大家带来用禁忌搜索算法(下文简称TS)求解带时间窗的VRP问题(下文简称VRPTW). 下面带大家体会TS的思想.以VRPTW为例,VRPTW的解的形式为每辆车所经过的顾客,比如说有15个 ...
- 【TWVRP】基于matlab模拟退火算法求解带时间窗的车辆路径规划问题【含Matlab源码 160期】
⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...
- 【TWVRP】基于matlab鲸鱼算法求解带时间窗开放式车辆路径问题【含Matlab源码 1986期】
⛄一.鲸鱼算法简介 鲸鱼优化算法(Whale Optimization Algorithm,WOA)是澳大利亚学者Mirjalili等根据座头鲸的狩猎方式提出的一种新的群智能优化算法.鲸鱼在大海中随机 ...
- 0x80070035找不到网络路径_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题...
蚁群算法求解VRPTW问题https://www.zhihu.com/video/1235315908018298880 今天为大家讲解使用蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题. ...
- 转 | 禁忌搜索算法(Tabu Search)求解带时间窗的车辆路径规划问题详解(附Java代码)
以下文章来源于数据魔术师 ,作者周航 欲下载本文相关的代码及算例,请关注公众号[程序猿声],后台回复[TSVRPJAVA]不包括[]即可 前言 大家好呀! 眼看这9102年都快要过去了,小编也是越来越 ...
- MATLAB实战系列(二十四)-大规模邻域搜索(LNS)求解带时间窗的车辆路径问题(VRPTW)(附matlab源代码)
前言 大规模邻域搜索算法(后文统一称为LNS)用MATLAB编写文中的提出的LNS求解带时间窗的车辆路径问题(后文统一称为VRPTW问题)的代码. 本文会带大家详细梳理LNS的基本流程,其实说白了LN ...
- java随机数时间窗_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题
今天为大家讲解使用蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题.在讲解蚁群算法求解VRPTW问题之前,不知道各位是否观察过现实生活中蚂蚁是怎么觅食的,说得形象一点的话就是成群的蚂蚁前赴后 ...
- 【TWVRP】基于matlab模拟退火算法结合狼群算法求解带时间窗的车辆路径规划问题【含Matlab源码 1075期】
⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...
- 【TWVRP】基于matlab粒子群算法求解带时间窗的车辆路径规划问题(总成本最低)【含Matlab源码 2590期】
⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...
最新文章
- java 数据反射_基本操作--反射填充数据
- 百度前端技术学院2017学习总结
- ux设计中的各种地图_UX设计中的空白
- Java如何加载类的呢?
- 前端学习(1262):fetch请求参数
- mfc让图片与按钮一起_对许多张图片进行批量裁剪,看看我是如何快速做到的
- 20条.net编码习惯
- Hadoop环境的配置搭建和基本概念
- Objective-C 2.0 with Cocoa Foundation---对象的初始化以及实例变量的作用域(1)
- linux常用命令备忘(不断更新中...)
- FCKeditor使用
- python创建一个txt文件
- MicroStation软件与Terrasolid插件合集的安装方法
- 【阿里云生活物联网架构师专题 ⑥】ESP8266接入阿里生活飞燕平台国际版,实现亚马逊Alexa Echo音响语音控制;
- C语言RGB转Lab色域
- 银行账号正则_求一个能验证银行卡号的正则表达式
- 第114课:SparkStreaming+Kafka+Spark SQL+TopN+Mysql+KafkaOffsetMonitor电商广告点击综合案例实战(详细内幕版本)
- 用户分类以及用户活跃度的衡量方法
- python进阶之web前端(01—HTML超文本标记语言)
- 数据库存储过程怎么写
热门文章
- linux服务器 缓存,Linux服务器内存使用分析及内存缓存
- SQL 窗口函数的优化和执行
- console连接h3c s5500_h3c console连接方法
- VUE页面实现加载外部HTML方法
- SpringBoot--实战开发--整合SSL
- How to proof Pi
- Zookeeper ZAB 协议分析
- HDU 2503 a/b + c/d(最大公约数与最小公倍数,板子题)
- C#中List〈string〉和string[]数组之间的相互转换
- 【iOS开发】如何用 Swift 语言进行LBS应用的开发?