1.完整项目描述和程序获取
>面包多安全交易平台:https://mbd.pub/o/bread/Y52WlJxw
>如果链接失效,可以直接打开本站店铺搜索相关店铺:
>如果链接失效,程序调试报错或者项目合作也可以加微信或者QQ联系。
2.部分仿真图预览
3.算法概述
蚁群算法是通过对自然界中真实蚂蚁的集体行为的观察,模拟而得到一种仿生优化算法,它具有很好的并行性,分布性.根据蚂蚁群体不同的集体行为特征,蚁群算法可分为受蚂蚁觅食行为启发的模型和受孵化分类启发的模型,受劳动分工和协作运输启发的模型.本文重点研究了前两种蚁群算法模型. 受蚂蚁觅食行为启发的模型又称为蚁群优化算法(ACO),是继模拟退火算法,遗传算法,禁忌搜索等之后又一启发式智能优化算法.目前它已成功应用于求解TSP问题,地图着色,路径车辆调度等优化问题.本文针对蚁群算法收敛时间长,易陷入局部最优的缺点,通过对路径上信息素的更新方式作出动态调整,建立信息素平滑机制,进而使得不同路径上的信息素的更新速度有所不同,从而使改进后算法能够有效地缩短搜索的时间,并能对最终解进行优化,避免过早的陷入局部最优. 聚类是数据挖掘的重要技术之一,它可按照某种规则将数据对象划分为多个类或簇,使同一类的数据对象有较高的相似度,而不同类的数据对象差异较大.
4.部分源码
%——判断抵达情况(终点,节点1,不是终点也不是节点1)
for i = 1:Ynum
if RL{i}(end)==package2(i,5)%终点
Info2{i}{8} = 1;%抵达情况
elseif RL{i}(end)==package2(i,4)%节点1
Info2{i}{8} = 0;%抵达情况
else
Info2{i}{8} = 2;%不是终点也不是节点1
end
end
%——①如果是终点则将所有邮件从车上卸载(删去当前运输车辆中的属性),
%将已抵达的邮件(当前所在地与目的地相同)状态设置为已抵达,记录抵达时间,然后使用终点返程功能
%——②如果如果到达的节点不是终点但是是节点1,先将目的地与当前所在地一致的邮件卸车,
for ii = 1:Ynum
if Info2{ii}{8}==1%终点
Info2{ii}{2}=0;%卸载,变为0.
Info2{ii}{9}=1;%已抵达Info2{i}{6}为抵达时间
%终点返程
%如果行驶路径中没有节点了,将车辆目的地设为车辆归属地,
%判断当前节点是否有目的地与改车辆路径相符的邮件,
%如果有则将这些邮件装车直至这些邮件装完或者到达载重最大值,将车辆驶向车辆归属地节点。
for i = 1:LEN-Ynum%——将未装车邮件目的地
ends = package2(Ynum+i,5); %未装车邮件目的地的节点
MASSother = MASS(Ynum+i);
for j = 1:Ynum%未满载车辆路径进行比对
Paths = RL{j};%如果未满载车辆
%判断当前节点是否有目的地与改车辆路径相符的邮件
idx = find(Paths(end)==ends);
if isempty(idx) == 1%没有经过,不做处理
end
if isempty(idx) == 0%有经过
Info2{j}{1} = ['在车牌为',num2str(CARD(NM{j},:)),'的某辆车上'];
if Info2{j}{2} < MASS(j); %如果没装满
if MASS(j)-Info2{j}{2}>=MASSother
Info2{j}{2} = Info2{j}{2}+MASSother;
MASS(Ynum+i)=0;
else
Info2{j}{2} = MASS(j);
end
end
end
end
end
end
if Info2{ii}{8}==0%节点1
Info2{ii}{2}=Info2{ii}{2}-Info0{ii}{1};%卸载,变为0.先将目的地与当前所在地一致的邮件卸车,即中间临时存放的
Info2{ii}{9}=1;%抵达Info2{i}{6}为抵达时间
%中途发车功能
%如果行驶路径中仍有节点,判断当前节点是否有目的地与改车辆路径相符的邮件,
%如果有则将这些邮件装车直至邮件装完或者到达载重最大值,
%依行驶路径继续发车,车辆状态改为驶向节点Z。
for i = 1:LEN-Ynum%——将未装车邮件目的地
ends = package2(Ynum+i,5); %未装车邮件目的地的节点
MASSother = MASS(Ynum+i);
for j = 1:Ynum%未满载车辆路径进行比对
Paths = RL{j};%如果未满载车辆
%如果行驶路径中仍有节点,判断当前节点
idx = find(Paths(2)==ends);
if isempty(idx) == 1%没有经过,不做处理
end
if isempty(idx) == 0%有经过
Info2{j}{1} = ['在车牌为',num2str(CARD(NM{j},:)),'的某辆车上'];
if Info2{j}{2} < MASS(j); %如果没装满
if MASS(j)-Info2{j}{2}>=MASSother
Info2{j}{2} = Info2{j}{2}+MASSother;
MASS(Ynum+i)=0;
else
Info2{j}{2} = MASS(j);
end
end
end
end
end
end
if Info2{ii}{8}==2%不是终点也不是节点1
Info2{ii}{2}=Info2{ii}{2};%将这些邮件卸车
Info2{ii}{9}=1;%抵达Info2{i}{6}为抵达时间
end
end
%更新价格和时间
for i = 1:Ynum
tmps1 = Info2{i}{1};%车牌信息
tmps2 = Info2{i}{2};%重量
%根据路段计算长度
dist = func_RL2d(RL{i},dist2);
Info2{i}{3} = tmps2*dist*MONEY;%记录行驶成本按照车辆载重*节点间公里数*收费标准)
Info2{i}{4} = RL{i};%行驶路径段
%计算时间
times = func_RL2T(RL{i},TME2);
Info2{i}{5} = times;
end
02_075m