m基于ACO蚁群优化的货车运输路线规划matlab仿真,考虑车辆载重,单位运输成本等因素

news2024/10/5 4:01:45

目录

1.算法描述

2.仿真效果预览

3.MATLAB核心程序

4.完整MATLAB


1.算法描述

      蚁群算法是通过对自然界中真实蚂蚁的集体行为的观察,模拟而得到一种仿生优化算法,它具有很好的并行性,分布性.根据蚂蚁群体不同的集体行为特征,蚁群算法可分为受蚂蚁觅食行为启发的模型和受孵化分类启发的模型,受劳动分工和协作运输启发的模型.本文重点研究了前两种蚁群算法模型. 受蚂蚁觅食行为启发的模型又称为蚁群优化算法(ACO),是继模拟退火算法,遗传算法,禁忌搜索等之后又一启发式智能优化算法.目前它已成功应用于求解TSP问题,地图着色,路径车辆调度等优化问题.本文针对蚁群算法收敛时间长,易陷入局部最优的缺点,通过对路径上信息素的更新方式作出动态调整,建立信息素平滑机制,进而使得不同路径上的信息素的更新速度有所不同,从而使改进后算法能够有效地缩短搜索的时间,并能对最终解进行优化,避免过早的陷入局部最优. 聚类是数据挖掘的重要技术之一,它可按照某种规则将数据对象划分为多个类或簇,使同一类的数据对象有较高的相似度,而不同类的数据对象差异较大.       

      算法基本思想:

(1)根据具体问题设置多只蚂蚁,分头并行搜索。

(2)每只蚂蚁完成一次周游后,在行进的路上释放信息素,信息素量与解的质量成正比。

(3)蚂蚁路径的选择根据信息素强度大小(初始信息素量设为相等),同时考虑两点之间的距离,采用随机的局部搜索策略。这使得距离较短的边,其上的信息素量较大,后来的蚂蚁选择该边的概率也较大。

(4)每只蚂蚁只能走合法路线(经过每个城市1次且仅1次),为此设置禁忌表来控制。

(5)所有蚂蚁都搜索完一次就是迭代一次,每迭代一次就对所有的边做一次信息素更新,原来的蚂蚁死掉,新的蚂蚁进行新一轮搜索。

(6)更新信息素包括原有信息素的蒸发和经过的路径上信息素的增加。

(7)达到预定的迭代步数,或出现停滞现象(所有蚂蚁都选择同样的路径,解不再变化),则算法结束,以当前最优解作为问题的最优解。

1.1发车

      选择节点X为发车节点选择该节点的发车数量Y.检索连通节点,排除禁忌表内节点,按照信息素浓度随机选择节点,将该节点加入路径表,将上一节点加入禁忌表,反复调用此方法直至抵达邮件目的地,对路径上节点做一次信息素增加,对全部节点做一次信息素挥发,挥发时判断各个节点车辆数是否过少如果过少则提高挥发率.

1.2到站

       节点可看到下一目的地为自身的且当前位置在路上的车辆,当车到达时点击抵达——记录行驶成本,需记录在额外的表中.

1.3中途发车

        如果行驶路径中仍有节点,判断当前节点是否有目的地与改车辆路径相符的邮件,如果有则将这些邮件装车直至邮件装完或者到达载重最大值,依行驶路径继续发车,车辆状态改为驶向节点Z。

1.4终点返程

       如果行驶路径中没有节点了,将车辆目的地设为车辆归属地,判断当前节点是否有目的地与改车辆路径相符的邮件,如果有则将这些邮件装车直至这些邮件装完或者到达载重最大值,将车辆驶向车辆归属地节点。

2.仿真效果预览

matlab2022a仿真结果如下:

 

 

 

3.MATLAB核心程序


%蚁群算法的参数
n           = 9;
%信息素增加量
gamma0      = 0.1;
gamma       = gamma0*ones(LEN,n);
%低于一定百分比,这里设置为50%
lvl1        = 0.5;
lvl2        = 0.7;%正常值
rho0        = 0.05;                   % 信息素挥发因子
rho         = rho0*ones(LEN,n);

delta       = 0.00012;


alpha       = 0.5;                      % 信息素重要程度因子
beta        = 0.5;                      % 启发函数重要程度因子
Q           = 1;                      % 常系数
Eta         = 1./D;                   % 启发函数
m           = Tlate-Tearly;
Tau         = 0.01*ones(LEN,n);              % 信息素矩阵
Table       = zeros(LEN,n);             % 路径记录表
iter        = 1;                      % 迭代次数初值
iter_max    = 50;

%迭代寻找最佳路径
while iter <= iter_max 
    %%
    iter 
    if iter==1
       gamma0=0.1*ones(size(gamma)); 
    end
    
%     %首先记录运输车辆的发车时间并对车辆的到达时间做出预估,得出不同时间的各个节点的承运能力记录,
 
    for i=1:Tlate-Tearly;
        %这里按时间段进行分类统计不同整数时间段的邮件数量和重量
        s1  = Tearly+i-1;
        e1  = Tearly+i;
        idx = find(Timee>=s1 & Timee < e1);
        L   = length(idx);
        Mail_point0{i}    = ends(idx);%....
        Mail_Wpoint0{i}   = package2(idx,6);%....
        Mail_nums0(i,1)   = L;%....
        Mail_weight0(i,1) = sum(package2(idx,6));
        for j = 1:length(idx)
            Mail_paths0{i}{j} = mypaths{idx(j)};
        end
        Mail_idx0{i} = package2(idx,1);
    end
    Mail_point = Mail_point0;
    Mail_Wpoint= Mail_Wpoint0;
    Mail_nums  = Mail_nums0;
    Mail_weight= Mail_weight0;
    Mail_paths = Mail_paths0;
    Mail_idx   = Mail_idx0;
    %对Mail_paths进行处理
    cnt1=1;
    for i=1:Tlate-Tearly;
        s1_ = [];
        e1_ = [];
        for j1 = 1:length(Mail_paths0{i})
            path_tmp1 = Mail_paths0{i}{j1};
            if isempty(path_tmp1)==0
               s1_(j1)   = path_tmp1(1);
               e1_(j1)   = path_tmp1(end);
            end
        end
        bs=[];%得到唯一值
        ms=[];%唯一值的缩影
        ns=[];%相同的位置
        [bs,ms,ns] = unique(e1_);
        %合并相同的
        idxx=[];
        for j1=1:length(bs)
            idxx = find(ns==j1);
            %输出唯一路径
            Mail_paths0_unique{i}{j1}     = Mail_paths0{i}{ms(j1)};
            Mail_point0_unique{i}(j1)     = bs(j1);%....
            %质量合并
            Mail_Wpoint0_unique{i}{j1}    = Mail_Wpoint0{i}(idxx);%....
            Mail_Wpoint0_sumunique{i}{j1} = sum(Mail_Wpoint0{i}(idxx));%....
            %统计合并后的各个区间的邮件编号
            Mail_idx0_total{i}{j1}        = Mail_idx0{i}(idxx);%....
        end
    end
    
 
    Mail_point__ = Mail_point0;
    Mail_Wpoint__= Mail_Wpoint0_sumunique;
    Mail_nums__  = Mail_nums0;
    Mail_weight__= Mail_weight0;
    Mail_paths__ = Mail_paths0_unique;
    Mail_idx__   = Mail_idx0_total;
    
    
    %Mail_point
    %Mail_Wpoint
    %Mail_nums
    %Mail_weight
    %Mail_paths
    figure(1);
    subplot(211)
    bar([Tearly:Tlate-1],Mail_nums)
    title('不同时间段下的邮件数量');
    subplot(212)
    bar([Tearly:Tlate-1],Mail_weight)
    title('不同时间段下的邮件总重量');

    %%
    %当蚂蚁出发时,预估到达各个节点时该节点的承运量水平
    Carrying_capacity1 = zeros(Tlate-Tearly,n);%不同时刻,不同节点的承运量水平
    Carrying_capacity2 = zeros(Tlate-Tearly,n);%不同时刻,不同节点的承运量水平对应的百分比
    Carrying_select    = zeros(Tlate-Tearly,n);%路节点被选择的概率越来越低。

    for i=1:Tlate-Tearly;
        point = Mail_point{i};
        for j = 1:n%统计各个节点的承运量水平
            Npoint = find(point==j);
            if isempty(Npoint)==0
               Carrying_capacity1(i,j) = [sum(sum(Mail_Wpoint{i}))]/(ceil((Tlate-Tearly)/2));
               Carrying_capacity2(i,j) = Carrying_capacity1(i,j)/sum(sum(Carrying_capacity1));
            else
               Carrying_capacity1(i,j) = 0;
               Carrying_capacity2(i,j) = 1;  
            end
        end
    end
    %%
    %如果预计到达某节点时该节点承运能力低于一定百分比,即使蚂蚁选择了这个节点,通过后信息素增加量也会很少,
    for i=1:Tlate-Tearly;
        point = Mail_point{i};
        for j = 1:n%统计各个节点的承运量水平
            Npoint = find(point==j);
            if Carrying_capacity2(i,j)<lvl1 & isempty(Npoint)==0
               gamma(i,j)=gamma0(i,j)*0.9;%信息素增加量也会很少,变少的方式可以自己定义不同的方式,我这里按原来0.9来定义
            else
               gamma(i,j)=gamma0(i,j); 
            end
            %而当蚂蚁不通过这个节点时,信息素的挥发率rho会增大,
            pathss = Mail_paths{i};
            for jj = 1:length(pathss)
                pathss2 = pathss{jj}; 
                ix = find(pathss2==j);
                if isempty(ix)==1%而当蚂蚁不通过这个节点时,信息素的挥发率rho会增大,
                   rho(i,j) = (1+delta)*rho(i,j); 
                else
                   rho(i,j) = (1-delta)*rho(i,j);  
                end
            end
            %这样当该节点的承运能力越来越低时,该路节点被选择的概率越来越低。%这里,将节点选择概率和承载百分比等同处理
            Carrying_select(i,j) = Carrying_capacity2(i,j);  
        end
    end
    %% 
    for i=1:Tlate-Tearly;
        point = Mail_point{i};
        for j = 1:n
            pathss = Mail_paths{i};
            for jj = 1:length(pathss)
                
                if isempty(pathss{jj}) == 0
                   Npoint = find(pathss{jj}(end)==j);  
                   %节点的承运能力也将得到一定的恢复,将当前时刻的这两个变量变为正常情况下的标准情况下的承运能力
                   Carrying_capacity1(i,j) = round(0.9*Carrying_capacity1(i,j));   %一定程度的恢复
                   Carrying_capacity2(i,j) = 1-Carrying_capacity1(i,j)/sum(Mail_Wpoint{i});;%一定程度的恢复
                   %当承运能力恢复到一定水平的时候,再将该路径的信息素增加量和挥发率调整回正常值。
                   if Carrying_capacity2(i,j) > lvl2
                      rho(i,j)  = rho0;
                      gamma(i,j)= gamma0(i,j); 
                   end
                end
            end
        end
    end

    %%
    addcar      = zeros(Tlate-Tearly,n);
    for i=1:Tlate-Tearly;
        for j = 1:n
            if Carrying_capacity2(i,j) < lvl1%如果某个节点滞留的快件过多
               %增加其他车辆前来的几率帮助此节点减轻快件压力。以此来达到整个运输网络的负载均衡。
               addcar(i,j)=1;%用这个变量表示当前时刻对应的节点增加车辆,如果是0,则不增加
            end
        end
    end
    %更新Table
    m     = LEN;%每个邮件对应一个蚂蚁,构建信息表
    start = zeros(m,1);
    for i = 1:m
        start(i) = Xsel;
    end
    %先将起点写入禁忌表
    Table(1:m,1) = start; 
    %构建解空间
    citys_index = 1:n;
    %禁忌表Table的更新
    for i = 1:m
        target     = mypaths{i};
        for j = 2:length(target)
           Table(i,j) = target(j);
        end
        for j = length(target)+1:n
           Table(i,j) = target(end);
        end
    end
    % 计算各个蚂蚁的路径距离
    Length = zeros(m,1);
    for i = 1:m
        Route = Table(i,:);
        target     = mypaths{i};
        for j = 1:length(target)-1
            Length(i) = Length(i) + D(Route(j),Route(j + 1));
        end
        Length(i) = Length(i) + D(Route(n),Route(1));
    end
    
    %概率选择优化,参考文献3.4.2
    
    for i = 1:m
        Route = Table(i,:);
        for j = 1:n
            if mean(Carrying_capacity2(:,j))<0.4
               miu=0.2; 
            end
            if mean(Carrying_capacity2(:,j))>0.4 & mean(Carrying_capacity2(:,j))<1
               miu=0.7; 
            end
            if mean(Carrying_capacity2(:,j))>=1
               miu=1; 
            end
            
            if j<=n-1
               PP(i,j) = (1-miu) * Tau(i,j)^alpha*[1/D(Route(j),Route(j + 1))]^beta/sum(sum(Tau(i,:).^alpha.*[1./D(Route(j),:)].^beta)) + miu*gamma(i,j)/gamma0(i,j);
            else
               PP(i,j) = (1-miu) * Tau(i,j)^alpha*[1/D(Route(1),Route(j))]^beta/sum(sum(Tau(i,:).^alpha.*[1./D(Route(j),:)].^beta)) + miu*gamma(i,j)/gamma0(i,j);  
            end
            PP(i,j) = min(PP(i,j),1);
        end
    end 
    

    % 计算最短路径距离及平均距离
    for i = 1:LEN
        if iter == 1
           [min_Length,min_index] = min(Length);
           Length_best(iter) = min_Length;  
           Length_ave(iter) = mean(Length);
           %找到最大概率值
           [VV,II] = max((PP(i,:)));
           Route_best{iter} = Table(i,1:II); 
        else
           [min_Length,min_index] = min(Length);
           Length_best(iter) = min(Length_best(iter - 1),min_Length);
           Length_ave(iter) = mean(Length);
           if Length_best(iter) <= min_Length
              [VV,II] = max(sum(PP));
              Route_best{iter} = Table(i,1:II); 
           else
              Route_best{iter} = Route_best{iter-1};
           end
        end
        %通过遗传之后,更新mypath这个变量,这样后面的消重合叠加的就是蚁群优化的后的变量了
        %mypathss{i} = unique(Table(i,1:II)) ; 
        [ioo,joo]   = unique(Table(i,1:II),'first');
        mypathss{i} = Table(i,sort(joo));  
        
    end
    
    
 
    
    
    %更新信息素
    Delta_Tau = zeros(n,n);
    for i = 1:m
        for j = 1:n
            Tau(i,j) = (1-rho(i,j)) * Tau(i,j) + rho(i,j)*gamma(i,j);%论文公式3.11 gamma为要求中提到的每次修正后的增量
        end
    end 
    iter = iter + 1;
    gamma0=Tau;
end
%更新,
mypaths=mypathss;
for i=1:Tlate-Tearly;
    %这里按时间段进行分类统计不同整数时间段的邮件数量和重量
    s1  = Tearly+i-1;
    e1  = Tearly+i;
    idx = find(Timee>=s1 & Timee < e1);
    L   = length(idx);
    Mail_point0{i}    = ends(idx);%....
    Mail_Wpoint0{i}   = package2(idx,6);%....
    Mail_nums0(i,1)   = L;%....
    Mail_weight0(i,1) = sum(package2(idx,6));
    for j = 1:length(idx)
        Mail_paths0{i}{j} = mypaths{idx(j)};
    end
    Mail_idx0{i} = package2(idx,1);
end
Mail_point = Mail_point0;
Mail_Wpoint= Mail_Wpoint0;
Mail_nums  = Mail_nums0;
Mail_weight= Mail_weight0;
Mail_paths = Mail_paths0;
Mail_idx   = Mail_idx0;
%对Mail_paths进行处理
cnt1=1;
for i=1:Tlate-Tearly;
    s1_ = [];
    e1_ = [];
    for j1 = 1:length(Mail_paths0{i})
        path_tmp1 = Mail_paths0{i}{j1};
        if isempty(path_tmp1)==0
           s1_(j1)   = path_tmp1(1);
           e1_(j1)   = path_tmp1(end);
        end
    end
    bs=[];%得到唯一值
    ms=[];%唯一值的缩影
    ns=[];%相同的位置
    [bs,ms,ns] = unique(e1_);
    %合并相同的
    idxx=[];
    for j1=1:length(bs)
        idxx = find(ns==j1);
        %输出唯一路径
        Mail_paths0_unique{i}{j1}     = Mail_paths0{i}{ms(j1)};
        Mail_point0_unique{i}(j1)     = bs(j1);%....
        %质量合并
        Mail_Wpoint0_unique{i}{j1}    = Mail_Wpoint0{i}(idxx);%....
        Mail_Wpoint0_sumunique{i}{j1} = sum(Mail_Wpoint0{i}(idxx));%....
        %统计合并后的各个区间的邮件编号
        Mail_idx0_total{i}{j1}        = Mail_idx0{i}(idxx);%....
    end
end


Mail_point__ = Mail_point0;
Mail_Wpoint__= Mail_Wpoint0_sumunique;
Mail_nums__  = Mail_nums0;
Mail_weight__= Mail_weight0;
Mail_paths__ = Mail_paths0_unique;
Mail_idx__   = Mail_idx0_total;






%%
id=0;
for i = 1:Tlate-Tearly
    pointss=Mail_paths__{i};
    for j = 1:length(pointss)
        id=id+1;
        %把路径记录下来Shortest_Route,
        d      = func_RL2d(Mail_paths__{i}{j},dist2);
        LL{id} = d;%路径长度
        RL{id} = Mail_paths__{i}{j}; %路径编号
        NM{id} = id;                 %路径编号
    end
end
 
%如果路径已记录累加路径上通过的邮件质量
%邮件质量
for i = 1:LEN
    MASS2(i) = MASS(i);%重量
    MASST(i) = package2(i,6); %路径质量
end



MASS3=MASS2;
for i = 1:Ynum
    %将路径记录在车辆信息后,将记录的该路径质量归零,邮件状态设置为在车牌为XXXXX的某辆车上;
    if MASS3(i)>=MASST(i)%载重大于等于质量最高的路径
       Info{i}{1} = ['在车牌为',num2str(CARD(NM{i},:)),'的某辆车上'];
       Info{i}{2} = [MASST(i)];%记录车辆载重
       MASST(i)   = 0;%清零
    end
    %则将路径记录在车辆信息后,将记录的该路径质量减去车辆载重的数值,
    %邮件状态依序设置为在车牌为XXXXX的某辆车上直至车辆满载
    if MASS3(i)<MASST(i)%载重小于等于质量最高的路径
       Mass_      = MASST(i)-MASS3(i); %反复使用此方法直至达到发车数量Y为止)
       if i<=Ynum-1
          MASS3(i+1) = MASS3(i+1) + Mass_;%累计到后一个车进行运载
       end
       Info{i}{1} = ['在车牌为',num2str(CARD(NM{i},:)),'的某辆车上']; 
       Info{i}{2} = [MASS3(i)]; 
    end
end
 
% 如果未满载车辆有经过未装车邮件目的地的节点相符合,
% 将邮件装车(设置邮件状态在车XXXXX上,车辆载重增加邮件质量)
% (设置邮件状态在车XXXXX上,车辆载重增加邮件质量)直至邮件装完或者全部车辆满载。
%将未装车邮件目的地
Info0=[];%单独存放这个增加变量
for i = 1:LEN-Ynum%——将未装车邮件目的地
    ends      = package2(Ynum+i,5); %未装车邮件目的地的节点
    MASSother = MASS(Ynum+i);
    for j = 1:Ynum%未满载车辆路径进行比对
        Paths = RL{j};%如果未满载车辆
        %判断是否有经过
        idx = find(Paths==ends);
        if isempty(idx) == 1%没有经过,不做处理
        end
        if isempty(idx) == 0%有经过
           Info{j}{1} = ['在车牌为',num2str(CARD(NM{j},:)),'的某辆车上']; 
           if Info{j}{2} < MASS(j); %如果没装满
              if MASS(j)-Info{j}{2}>=MASSother
                 Info{j}{2} = Info{j}{2}+MASSother;
                 MASS(Ynum+i)=0;
                 Info0{j}{1}=MASSother;
              else
                 Info{j}{2} = MASS(j);
                 Info0{j}{1}= 0;
              end
           end
        end
    end
end

  

%%
%到站
%节点可看到下一目的地为自身的且当前位置在路上的车辆,当车到达时点击抵达
%——记录行驶成本(按照车辆载重*节点间公里数*收费标准),
%需记录在额外的表中(记录下车牌号,抵达时间,行驶路径段,这段路的载重,产生的费用,这段路运输的邮件数量)
%——更新车辆信息(当前位置),更新车辆上邮件所在地(即更新表中当前运输车辆为车牌XXXXX的车辆的邮件所在地为抵达的节点)
Info2=Info;%这个阶段,用info2去更新

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;
    %这段路运输的邮件数量
    Info2{i}{6} = tmps2/package2(i,6);
    %当前位置
    Info2{i}{7} = RL{i}(end);
end

%——判断抵达情况(终点,节点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

%根据上面的数据分别统计各个邮件的行走信息
xx = 0;
xy = 0;
for i = 1:length(Mail_idx__)
    tmps = Mail_idx__{i};
    weigh= Mail_Wpoint0_unique{i};
    for j = 1:length(tmps)
        xy    = xy+1;
        tmps2 =tmps{j};
        weigh2=weigh{j};
        yx    =mod(xy,Ynum)+1;
        for k = 1:length(tmps2)
            xx = xx + 1;
            %邮件对应车辆的车牌信息
            pkg_info{xx}{1}=Info2{yx}{1};
            %邮件的本身重量
            pkg_info{xx}{2}=weigh2(k);
            %记录重量*节点间公里数*收费标准)
            pkg_info{xx}{3}=pkg_info{xx}{2}*func_RL2d(Mail_paths__{i}{j},dist2)*MONEY;
            %%行驶路径段
            pkg_info{xx}{4}=Mail_paths__{i}{j};
            %计算时间
            pkg_info{xx}{5}=func_RL2T(Mail_paths__{i}{j},TME2);
            %和其相同路段上的邮件数量
            pkg_info{xx}{6}=length(tmps2);
            %邮件序号
            pkg_info{xx}{7}=tmps2(k);
        end
    end
end
%%
%核算部分,计算运输成本与平均运达所需时间
for ii = 1:length(Info2)
    moneys(ii) = Info2{ii}{3};
    times(ii)  = Info2{ii}{5};
end
moneysavg = mean(moneys) 
timesavg  = mean(times) 
02_075m

4.完整MATLAB

V

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81679.html

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

相关文章

渗透学习-靶场篇-WebGoat靶场(JWT攻击)

文章目录前言一、介绍JWTJWT令牌结构获取的令牌的基本过程二、攻击方式以及靶场的搭建1.安装cWebGoat2.空加密验证攻击3.字典爆破三、认证-键值逻辑前言 本次主要学习了javaweb项目方面任意出现的一些安全问题&#xff0c;最主要的是有关于JWT身份认证上的攻击&#xff0c;并利…

es的搜索服务

1、在项目中&#xff0c;创建一个搜索服务的模块&#xff1a;search-service 2、在新创建的搜索模块中添加依赖&#xff1a; <dependencies><!--nacos--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-start…

MyBatis-Plus中的逻辑删除使用

系列文章目录 Mybatis-PlusSpringBoot结合运用_心态还需努力呀的博客-CSDN博客MyBaits-Plus中TableField和TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus分页查询&#xff08;快速上手运用&#xff09;_心态还需努力呀的博客-CSDN博客_mybatis plus分页查询 MyBa…

【ESXi 7.x 升 8.x】ESXi 升级 —— 使用 ESXCLI 升级 ESXi(Offline Bundle ZIP)

目录3.1 示例 — 使用 ESXCLI 升级 ESXi&#xff08;Offline Bundle ZIP&#xff09;【目标&#xff1a;将 ESXi 6.5 U2 GA 升级为 7.0 U3f】&#xff08;1&#xff09;下载离线升级ZIP包&#xff08;2&#xff09;升级 ESXi① 查看离线包② 升级前确认ESXi版本③ 获取升级用的…

[附源码]Python计算机毕业设计大学生社团管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

ChatGPT教程之 01 什么是ChatGPT革命性的对话生成新工具

今天,我想揭开 ChatGPT 的神秘面纱——GANs*(生成对抗网络)的一个迷人的新应用程序,它在 AI 社区中引起了很大的轰动。 对于那些不熟悉 GAN 的人来说,它们是一种神经网络,它使用两个相互竞争的网络——一个生成器和一个鉴别器——来创建逼真的输出。生成器创建假输出,而…

Paper Note——经典Polyline类型Map论文损失函数

文章目录1. Hierarchical Recurrent Attention Networks for Structured Online Maps2. DAGMapper: Learning to Map by Discovering Lane Topology1. Hierarchical Recurrent Attention Networks for Structured Online Maps https://patrick-llgc.github.io/Learning-Deep-Le…

QT(4)-QAbstractItemView

QAbstractItemView1 说明2 常用函数2.1 交替行颜色2.1.1 alternatingRowColors2.1.2 setAlternatingRowColors2.2 autoScroll2.2.1 hasAutoScroll2.2.2 setAutoScroll2.3 autoScrollMargin2.3.1 autoScrollMargin2.3.2 setAutoScrollMargin2.4 defaultDropAction2.4.1 setDefau…

python--飞机大战

实现功能&#xff1a; 1&#xff1a;飞机的移动&#xff0c;发射子弹&#xff0c;手雷&#xff0c;生命值&#xff0c;生命条 2&#xff1a;敌飞机有3种形态&#xff08;小&#xff0c;中&#xff0c;大&#xff09;不同的飞机大小不一样&#xff0c;生命值不一样&#xff0c…

基于springboot+mybatis+mysql+vue在线订餐系统

基于springbootmybatismysqlvue在线订餐系统一、系统介绍二、功能展示1.主页(用户)2.菜单(用户)3.用户注册(用户)4.用户登陆(用户)5.我的订单(用户)6.我的购物车(用户)7.首页(管理员)8.用户管理(管理员)9.商品管理(管理员)9.订单管理(管理员)10.评论管理(管理员)三、获取源码一…

c++ 类型的转换

文章目录1. C语言中的类型转换1.1 隐式转换1.2 显示转换2. C的类型转换2.1 static_cast2.2 reinterpret_cast2.3 const_cast2.4 dynamic_cast3. 常见面试题前言&#xff1a; C给出了四种类型转换&#xff0c;这是做出的一些规范&#xff0c;为了减少隐式转换。隐式转换的问题&a…

JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK14特性讲解】

JDK各个版本特性讲解-JDK14特性 一、Java14概述 Oracle在2020年3月17日宣布JAVA14 全面上市,JAVA14通过每六个月发布一次新功能,为企业和开发人员社区提供增强功能,继续了Oracle加快创新的承诺. 最新的JAVA开发工具包提供了新功能,其中包括两项备受期待的新预览功能,实例匹配的…

【Redis】分布式限流与Redis实现限流的四种方式(Redis专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

MHA高可用及故障切换

目录 一、MHA的概述 1、 MHA的概念 2&#xff0e;MHA 的组成 3&#xff0e;MHA 的特点 二、搭建 MySQL MHA的操作步骤 1、实验思路&#xff1a; 1.1、MHA架构 1.2、故障模拟 2、环境准备 3、修改 Master、Slave1、Slave2 节点的主机名 4、修改 Master、Slave1、Slav…

基于java+springboot+mybatis+vue+mysql的农产品销售商城网站

项目介绍 农产品销售成为了很多农产品商家的一项重要的创收项目。传统的销售方式采用了摆摊销售和市场的农产品的批发&#xff0c;在销售农产品方面不是很方便&#xff0c;因此采用了网络的方式进行销售。也是电子商务发展今天的一种趋势&#xff0c;建立了网站&#xff0c;前…

WebSocket——SpringBoot+Vue3+TS+SockJS+STOMP简单连接使用

WebSocket——SpringBootVue3TSSockJSSTOMP简单连接使用本文视频以及相关资源关于WebSocket文档什么时候使用WebSocketWebSocket连接头服务器返回状态码客户端使用技术Github地址npm安装为什么要安装sockjs的.d.ts文件常用方法1.连接2.关闭连接3.发送消息4.设置订阅构建1.创建w…

【Redis】Redis布隆过滤器工作原理与实战(Redis专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

判断质数复习与分解质因数

TIPS 1. 之前我们讲到比方说要得到一个整数&#xff08;十进制形式&#xff09;的每一位数字&#xff0c;就需要把这个整数先%10得到最低位的数字&#xff0c;然后呢再把这个整数/10更新一下&#xff0c;然后呢就这么循环往复直到最终这个不断更新的整数为0跳出循环。那如果这…

深度学习-神经网络(Pytorch应用)

文章目录简介卷积层池化层激活层线性层前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 上图摘自网络 受生物神经网络的启发&#xff0c;每个神经元与其他神经元相连&#xff0c;当…

InfluxDB时序数据库-笔记-更新中

本笔记由在Bilibili学习的尚硅谷教学视频后整理得来 文章目录一、InfluxDB基础概念1.1InfluxDB是什么1.2为什么选择InfluxDB而不选择关系型数据库1.3下载安装1.4Promethus数据格式1.5时序数据中的数据模型1.6与时间标准相关的知识二、Flux语言2.1初识Flux语言2.2Flux基本语法三…