m基于ACO蚁群算法的考虑装载率的循环送货的最短线路规划MATLAB仿真

简介: m基于ACO蚁群算法的考虑装载率的循环送货的最短线路规划MATLAB仿真

1.算法概述

    根据这些装载率再结合路径最短来设计几个循环送货的线路。最理想状态是一条循环路径出去把所有的货都能遍历,并且装载率也很高。但是显然理想状态不可能,所以我们要做的就是尽量往理想状态靠,通过这些数据,用最少的循环路径条数(或者说最经济的)和最高的装载率以及最少的每条路径遍历次数(这些加起来基本就能看做是最低成本),来把那些货运完。

根据你所提供的参数资料,目前,我们所需要考虑的影响成本的几个因素为:

·每辆卡车的装货量;

·每个地点的坐标值;

·每个地点的频数,货物种类以及数量,体积;

·卡车的耗油量;

这里由于原先考虑出现点问题,这里考虑每辆卡车的优化方案分别进行仿真分析。

这里所设计的环路方案,必须满足如下的几个条件:

第一:每个点通过次数必须满足规定的频次;

第二:从原点出发,在装载率最大化的情况下尽可能多的历遍点,然后返回节点;

第三:在完成所有节点的频次需求和货物需求所需要的路线最短即油耗最小。

    通过上面的分析,整个问题即,卡车每次装多少种类的多少数目的货物出发送货(装载量),且完成送货任务总路径最短,中间可能回来取货(油耗),每个点通过次数在规定次数之内,此时的成本最低。并且,每次送货的装载量又决定了最终的路线长度即油耗,这里省略掉时间成本。这里单独考虑每辆卡车的优化任务。

   通过上面的分析可知,这里的优化问题,本质上是一个VRP和VFP的联合问题,即车辆调度循环发送和装载的联合问题。

这里,我们的优化目标函数为:

1.png

这里的函数含义是:

成本最低;

路径综合最短;

每条线路的装载率最大;

2.png
3.png

2.仿真效果预览
matlab2022a仿真结果如下:

4.png
5.png

3.核心MATLAB程序

 
%映射表
B = func_maps(C_f);
 
 
%计算规模和权值的初始值
[SCALEs,Wsd]=func_w(C); 
 
%中心和每个供货点之间连接能节省的距离
Save_d = func_save_d(SCALEs,Wsd); 
 
LOADs                = 0;
Eer                  = 1./Wsd;                  %启发常系数
Tau                  = ones(SCALEs,SCALEs); 
Save_roads           = zeros(Num_ann,SCALEs+20);%生成路的径 
Iteration            = 1;                     
Best_roads           = [Iter,SCALEs+20];        %各代最佳路线 
Best_roads_Lens      = inf.*ones(Iter,1);       %各代最佳路线的长度 
Best_roads_Lens_avgs = zeros(Iter,1);           %各代路线的平均长度
flag                 = 0;
%进行蚁群+PSO算法
while (Iteration <= Iter)
       disp('当前迭代次数')
       Iteration
       %产生随机变量作为初始化粒子
       Save_roads(:,1) = randint(Num_ann,1,[1,1]);
       flag            = zeros(SCALEs,1);
       %按如下的规则进行循环历遍
       pp              = 0;
       for i=1:Num_ann
            pp              = 0;
           %指定随机性
%             RandStream.setDefaultStream(RandStream('mt19937ar','seed',Iteration*i));
           
            Will_walks   = Save_roads(i,:);
            Will_walks   = Will_walks(Will_walks>0);
            Will_walks2  = setdiff(1:SCALEs,Will_walks);
            c_temp       = length(Will_walks2);
            Jer=1;
            while Jer <= SCALEs
                  pp = pp +1;
                  if isempty(Will_walks2) == 0
                  %按照规则选下一个供货点或者是回到中心
                     for k=1:length(Will_walks2)
                         x(k) = (Tau(Will_walks(end),Will_walks2(k))) *...
                                (Eer(Will_walks(end),Will_walks2(k))) *...
                                (Save_d(Will_walks(end),Will_walks2(k))^2);
                     end   
                     Pers = rand(1,1);
                     if Pers < 0.1
                        choices = find(max(x));
                     else
                        x       = x/(sum(x)); 
                        xcum    = cumsum(x); 
                        choices = find(xcum>=rand(1,1));
                     end
                     %以下是对每个供货点进行供货的装载情况的计算
                     if isempty(choices) == 1
                        choices = 1;
                        %计算当前供货点的物件数量和体积
                        INDs  = choices;
                        INDs2 = INDs;
                        LOADs = LOADs + V1{INDs2}(choices);
                     else
                        INDs  = Will_walks2(choices(1)); 
                        %对当前点下的情况进行装货
                        INDs2 = B(INDs,2);
                        %计算当前点种的货物的种类
                        ZL    = length(V1{INDs2});
                        %%产生一组概率进行选择货物,如果装载满足需求,则继续装,否则不装
                        %NNS   = floor(ZL*rand(1,1)) + 1; 
                        NNS = 1;
                        for NNS = 1:ZL
                            CC    = Nums{INDs2}(NNS);
                            while  CC > 0 & LOADs <= lemda*Qv
                               Vtmp  = V1{INDs2}(NNS);%选择的货物的体积大小
                               %然后进行装载 
                               LOADs = LOADs + Vtmp;
                               %存货数量减1
                               CC = CC-1;
                               Nums{INDs2}(NNS) = CC;
                            end
                        end
                     end
                     %计算装载率
                     if LOADs <= lemda*Qv
                        WW(i,pp) = LOADs/(lemda*Qv);
                     end
 
                     if LOADs > lemda*Qv%装满则返回
                        choices                            = 1;
                        Jer                                = Jer-1;
                        LOADs                              = 0;
                        Save_roads(i,length(Will_walks)+1) = choices(1);
                     else
                        Save_roads(i,length(Will_walks)+1) = Will_walks2(choices(1)); 
                     end
                  end
                  Will_walks  = Save_roads(i,:);
                  Will_walks  = Will_walks(Will_walks>0);
                  Will_walks2 = setdiff(1:SCALEs,Will_walks);
                  x           = [];
                  if Will_walks(end) > 1 | Will_walks(end) < 1
                     Save_roads(i,1:(length(Will_walks)+1))=[Will_walks,1];
                  end
                 if sum(Nums{INDs2}) == 0
                    flag(Jer) = INDs;
                 else
                    flag(Jer) = 0; 
                 end                   
                 Jer=Jer+1;
                 
                  
            end
            LOADs=0;
       end
 
       L = zeros(Num_ann,1); 
       for i=1:Num_ann 
           tmpsss = Save_roads(i,:); 
           R      = tmpsss(tmpsss>0);
           for j=1:(length(R)-1)
               L(i) = L(i) + Wsd(R(j),R(j+1)); 
           end 
       end 
     
       Best_roads_Lens(Iteration)                           = min(L); 
       pos                                                  = find(L==Best_roads_Lens(Iteration)); 
       Best_roads(Iteration,1:length(Save_roads(pos(1),:))) = Save_roads(pos(1),:);
       SELS                                                 = find(Best_roads(Iteration,:)==1);
       Best_save                                            = [];
       Best_save2                                           = 0;
       for Si=1:(length(SELS)-1)
           YBEST = Best_roads(Iteration,SELS(Si):SELS(Si+1));
           al    = length(YBEST);
           T     = zeros((length(SELS)-1),1);
           for Sj=1:(al-1)
               T(Si)=T(Si)+Wsd(YBEST(Sj),YBEST(Sj+1));
           end
           for Sp=2:(al-1)
               for Sq=(Sp+1):(al-1)
                   DD     = YBEST;
                   temp1  = DD(Sp);
                   temp2  = DD(Sq);
                   DD(Sp) = temp2;
                   DD(Sq) = temp1;
                   TT     = zeros(1);
                   for Sj=1:(al-1)
                       TT = TT + Wsd(DD(Sj),DD(Sj+1));
                   end
                   if TT<T(Si)
                      T(Si) = TT;
                      YBEST = DD;
                   end
               end
           end
           if Si>=2
               YBEST = YBEST(2:al);
           end
           Best_save = [Best_save,YBEST];
           Best_save2= Best_save2+T(Si);
       end
       Best_roads_Lens(Iteration)                = Best_save2;
       Best_roads(Iteration,1:length(Best_save)) = Best_save;
       
       Best_save                          = [];
       Best_save2                         = 0;
       Best_roads_Lens_avgs(Iteration)    = mean(L); 
       LOADs                              = 0;
       Iteration                          = Iteration+1;
       Delta_Tau=zeros(SCALEs,SCALEs); 
       for i=1:Num_ann 
           MM = Save_roads(i,:); 
           R  = MM(MM>0);
           for j=1:(length(R)-1) 
               Delta_Tau(R(j),R(j+1))=Delta_Tau(R(j),R(j+1))+Importance/L(i); 
           end 
       end 
       Tau        = (1-Rr).*Tau+Delta_Tau;
       %清零 
       Save_roads = zeros(Num_ann,SCALEs); 
       
end
 
%优化结果 
Pos        = find(Best_roads_Lens==min(Best_roads_Lens)); 
best_route = Best_roads(Pos(1),:);
best_route = best_route(best_route>0);
for i = 1:SCALEs
    Load_rate(i)  = mean(WW(:,i));
end
%装载率的变化
%装载率的变化
disp('装载率:');
max(Load_rate)
 
.................................
02-008m
相关文章
|
1天前
|
算法 数据可视化 数据安全/隐私保护
一级倒立摆平衡控制系统MATLAB仿真,可显示倒立摆平衡动画,对比极点配置,线性二次型,PID,PI及PD五种算法
本课题基于MATLAB对一级倒立摆控制系统进行升级仿真,增加了PI、PD控制器,并对比了极点配置、线性二次型、PID、PI及PD五种算法的控制效果。通过GUI界面显示倒立摆动画和控制输出曲线,展示了不同控制器在偏转角和小车位移变化上的性能差异。理论部分介绍了倒立摆系统的力学模型,包括小车和杆的动力学方程。核心程序实现了不同控制算法的选择与仿真结果的可视化。
28 15
|
18小时前
|
算法
基于小波变换和峰值搜索的光谱检测matlab仿真,带GUI界面
本程序基于小波变换和峰值搜索技术,实现光谱检测的MATLAB仿真,带有GUI界面。它能够对CO2、SO2、CO和CH4四种成分的比例进行分析和提取。程序在MATLAB 2022A版本下运行,通过小波分解、特征提取和峰值检测等步骤,有效识别光谱中的关键特征点。核心代码展示了光谱数据的处理流程,包括绘制原始光谱、导数光谱及标注峰值位置,并保存结果。该方法结合了小波变换的时频分析能力和峰值检测的敏锐性,适用于复杂信号的非平稳特性分析。
|
18小时前
|
机器学习/深度学习 算法 安全
基于深度学习的路面裂缝检测算法matlab仿真
本项目基于YOLOv2算法实现高效的路面裂缝检测,使用Matlab 2022a开发。完整程序运行效果无水印,核心代码配有详细中文注释及操作视频。通过深度学习技术,将目标检测转化为回归问题,直接预测裂缝位置和类别,大幅提升检测效率与准确性。适用于实时检测任务,确保道路安全维护。 简介涵盖了算法理论、数据集准备、网络训练及检测过程,采用Darknet-19卷积神经网络结构,结合随机梯度下降算法进行训练。
|
2天前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
1月前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
1月前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
147 68
|
1月前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
1天前
|
算法
基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真
本程序基于海鸥优化算法(SOA)进行三维曲面最高点搜索的MATLAB仿真,输出收敛曲线和搜索结果。使用MATLAB2022A版本运行,核心代码实现种群初始化、适应度计算、交叉变异等操作。SOA模拟海鸥觅食行为,通过搜索飞行、跟随飞行和掠食飞行三种策略高效探索解空间,找到全局最优解。
|
3天前
|
传感器 算法 物联网
基于粒子群算法的网络最优节点部署优化matlab仿真
本项目基于粒子群优化(PSO)算法,实现WSN网络节点的最优部署,以最大化节点覆盖范围。使用MATLAB2022A进行开发与测试,展示了优化后的节点分布及其覆盖范围。核心代码通过定义目标函数和约束条件,利用PSO算法迭代搜索最佳节点位置,并绘制优化结果图。PSO算法灵感源于鸟群觅食行为,适用于连续和离散空间的优化问题,在通信网络、物联网等领域有广泛应用。该算法通过模拟粒子群体智慧,高效逼近最优解,提升网络性能。
|
3天前
|
机器学习/深度学习 数据采集 算法
基于GWO灰狼优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a,展示了时间序列预测算法的运行效果(无水印)。核心程序包含详细中文注释和操作视频。算法采用CNN-GRU-SAM网络,结合灰狼优化(GWO),通过卷积层提取局部特征、GRU处理长期依赖、自注意力机制捕捉全局特征,最终实现复杂非线性时间序列的高效预测。