clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
tic % 保存当前时间
%% 蚁群算法求解VRPTW
%输入:
%City 需求点经纬度
%Distance 距离矩阵
%TravelTime 行驶时间矩阵
%Demand 各需求点需求量
%Travelcon 行程约束
%Capacity 车容量约束
%TimeWindow 各需求点时间窗
%AntNum 种群个数
%Alpha 信息素重要程度因子
%Beta 启发函数重要程度因子
%Rho 信息素挥发因子
%Q 常系数
%Eta 启发函数
%Tau 信息素矩阵
%MaxIter 最大迭代次数
%输出:
%bestroute 最短路径
%mindisever 路径长度
%% 加载数据
load('../test_data/City.mat') %需求点经纬度,用于画实际路径的XY坐标
load('../test_data/Distance.mat') %距离矩阵
load('../test_data/TravelTime.mat') %行驶时间矩阵
load('../test_data/Demand.mat') %需求量
load('../test_data/TimeWindow.mat') %时间窗
load('../test_data/Travelcon.mat') %行程约束
load('../test_data/Capacity.mat') %车容量约束
%% 初始化问题参数
CityNum = size(City,1)-1; %需求点个数
%% 初始化参数
AntNum = 8; % 蚂蚁数量
Alpha = 1; % 信息素重要程度因子
Beta = 5; % 启发函数重要程度因子
Rho = 0.1; % 信息素挥发因子
Q = 1; % 常系数
Eta = 1./Distance; % 启发函数
Tau = ones(CityNum+1); % (CityNum+1)*(CityNum+1)信息素矩阵 初始化全为1
Population = zeros(AntNum,CityNum*2+1); % AntNum行,(CityNum*2+1)列 的路径记录表
MaxIter = 100; % 最大迭代次数
bestind = ones(MaxIter,CityNum*2+1); % 各代最佳路径
MinDis = zeros(MaxIter,1); % 各代最佳路径的长度
%% 迭代寻找最佳路径
Iter = 1; % 迭代次数初值
while Iter <= MaxIter %当未到达最大迭代次数
%% 逐个蚂蚁路径选择
for i = 1:AntNum
TSProute=2:CityNum+1; %生成一条顺序不包括首尾位的升序TSP路线
VRProute=[]; %初始化VRP路径
while ~isempty(TSProute) %开辟新的子路径
subpath=1; %先将配送中心放入子路径起点
DisTraveled=0; %此子路径的距离初始化为零
CurrentTime=0; %车辆已行驶时间置零
delivery=0; %此子路径的车辆可配送量初始化为零
delete=subpath; %delete(end)=1给第一次进入内while的P(k)首项用
while ~isempty(TSProute) %为子路径subpath第二个及以后的位置安排需求点
%% 计在内while中计算城市间转移概率
P = TSProute; % 为轮盘赌选择建立等于剩余需经过城市数量的长度的向量
for k = 1:length(TSProute)
%delete(end)为刚刚经过的城市,TSProute(k)为剩余可能经过的城市
P(k) = Tau(delete(end),TSProute(k))^Alpha * Eta(delete(end),TSProute(k))^Beta; %省略相同分母
end
P = P/sum(P);
% 轮盘赌法选择下一个访问城市
Pc = cumsum(P); %累加概率
TargetIndex = find(Pc >= rand); %寻找左数第一个大于伪随机数的累加概率的索引
target = TSProute(TargetIndex(1)); %此索引对应的城市
%不要强行改变蚂蚁通过轮盘法选到的下一个城市
%它选到就确定了,然后如果超约束,结束此subpath
%判断行程约束
if delivery+Demand(target) > Capacity || DisTraveled+Distance(delete(end),target)+Distance(target,1) > Travelcon
break
else
DisTraveled=DisTraveled+Distance(delete(end),target); %若符合,则经过的距离累加此距离
CurrentTime=max(CurrentTime+TravelTime(delete(end),target),TimeWindow(target,2)); %当前时间累加,并与该需求点早时间窗比较得出开始服务时间
delivery = delivery+Demand(target); %车辆已配送量累加
%此点加入子路径
subpath=[subpath,target];
%此点加入要删除的点序列
delete=[delete,target];
%TSP路径中排除已安排的城市
TSProute=setdiff(TSProute,delete);
end
end %内while结束,此subpath结束
%直接在VRProute后面填充这条子路径
VRProute=[VRProute,subpath];
end %外while结束,此VRProute完整
%在VRProute后未到CityNum*2+1的空位填入1
fillwithones = linspace(1,1,CityNum*2+1-length(VRProute));
VRProute=[VRProute,fillwithones];
%把成型的VRP路径赋给种群矩阵
Population(i,:)=VRProute;
end
%% 计算各个蚂蚁的路径距离
ttlDistance = zeros(AntNum,1); %预分配内存
for i = 1:AntNum
DisTraveled=0; % 蚂蚁子路径已经过的距离
CurrentTime=0; %所有车辆行驶时间置零
delivery=0; % 汽车已经送货量,即已经到达点的需求量之和
Dis=0; %此蚂蚁所有子路径的总距离
route = Population(i,:); %单独取出一只蚂蚁的路线
for j=2:length(route)
DisTraveled = DisTraveled+Distance(route(j-1),route(j)); %每两点间距离累加
if route(j)==1 %若此点是配送中心
if DisTraveled > Travelcon %若超行程约束
Dis = Inf; %对非可行解进行惩罚
break
else
Dis=Dis+DisTraveled; %累加已行驶距离
DisTraveled=0; %已行驶距离置零
CurrentTime=0; %时间置零TimeWindow(1,2)
delivery=0; %可配送量置零
end
else %若此点非配送中心
if DisTraveled > Travelcon %若超行程约束
Dis = Inf; %对非可行解进行惩罚
break
else
delivery = delivery+Demand(route(j)); %累加可配送量
if delivery > Capacity %若超容量约束
Dis = Inf; %对非可行解进行惩罚
break
else
CurrentTime=CurrentTime+TravelTime(route(j-1),route(j)); %计算车辆到达需求点的时刻
if CurrentTime > TimeWindow(route(j),2) %将晚时间窗是否超约束放到route(j)是否=1外判断,防止route(j)=1时TW=0始终超约束的错误判断,这一步也是为什么要将route(j)是否为1分开判断的原因
Dis = Inf; %对非可行解进行惩罚
break
else
CurrentTime=max(CurrentTime,TimeWindow(route(j),2));%若到达时间早于早时间窗,等待至早时间窗
end
end
end
end
end
ttlDistance(i)=Dis; %存储此方案总距离
end
%% 存储历史最优信息
if Iter == 1 %若是第一次迭代 不需要与上次迭代结果对比
[min_Length,min_index] = min(ttlDistance); %取得此次迭代最短距离
MinDis(Iter) = min_Length; %存储此次迭代最优路线的距离
bestind(Iter,:) = Population(min_index,:); %存储此次迭代最优路径
else
[min_Length,min_index] = min(ttlDistance); %取得此次迭代最短距离
mYlEaVeiSmVp
- 粉丝: 2236
- 资源: 19万+
最新资源
- 信捷XC PLC与力士乐VFC-x610变频器通讯程序原创可直接用于生产的程序,程序带注释,并附送触摸屏程序,有接线方式和设置,通讯地址说明等 程序采用轮询,可靠稳定 器件:信捷XC3的PLC,博世
- CMIP6 变量详细表格
- KF2EDGK系列5.08接线端子,带3D封装
- 信捷XC PLC与3台力士乐VFC-x610变频器通讯通讯 原创可直接用于生产的程序,程序带注释,并附送触摸屏程序,有接线方式和设置,通讯地址说明等 程序采用轮询,可靠稳定 器件:信捷XC3的PLC
- org.xmind.ui.mindmap-3.6.1.jar
- 16台搅拌机定时控制程序16台搅拌机定时控制,使用三菱FX系列PLC,威伦通触摸屏,具备完善的控制功能
- 微网双层优化模型matlab 采用yalmip编写三个微网的分层优化模型,考虑电价的负荷响应,综合配电网运营商收益和用户购电成本,程序运行稳定
- rv1126交叉编译工具链gcc-arm-8.3-2019.02-x86-64-arm-linux-gnueabihf.tar.xz和安装步骤
- 1960-2023年世界各国国民总收入数据
- 风储深度调峰模型matlab 考虑风储的调峰模型,采用cplex作为求解器,实现不同主体出力优化控制,程序运行稳定,有参考资料,
- 计算机系统安全性与性能评估:IOMMU在Linux环境下的性能研究及其优化策略
- 电动汽车蒙特卡洛分析matlab 通过matlab程序编写电动汽车蒙特卡洛模型,得到汽车行驶里程的概率分布曲线和充电功率曲线,程序运行可靠,有参考资料
- 考虑交通流量的电动汽车充电站规划matlab 程序采用matlab编制,采用粒子群算法,结合交通网络流量,得到最终充电站规划方案,程序运行可靠
- rustdesk-1.3.6-x86-64.msi
- 电动汽车优化模型matlab 狼群算法
- 你还在为伺服驱动器 FPGA架构苦恼吗,本方案FPGA代码实现电流环 速度环 位置环 SVPWM 坐标变 测速 分频 滤波器等,程序方便移植不同的平台,具有很高的研究价值
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈