[Planificación de ruta] Planificación de ruta de vehículo abierta para múltiples centros logísticos basada en algoritmo genético [Matlab 013]

1. Antecedentes

Disponer de múltiples centros logísticos.
El vehículo sale de un determinado centro logístico, una vez finalizada la tarea de entrega, no es necesario que regrese al centro logístico donde se inició originalmente, sino al centro logístico más cercano, es decir, el camino abierto del vehículo. Eso sí, según la distancia entre el último cliente del servicio del vehículo y todos los centros logísticos, si es la distancia más corta del centro logístico original, también puede regresar al centro logístico original.
Objetivo de optimización: la suma del costo fijo de uso del vehículo (200 yuanes / vehículo), el costo del tiempo de viaje del vehículo (0.3 yuanes / minuto), el costo del tiempo de espera del vehículo (0.3 yuanes / minuto) y el tiempo de servicio del vehículo (0.3 yuanes / minuto) es el mas pequeño.
Restricciones: (1) No exceda el límite de capacidad del vehículo (la capacidad del vehículo es de 1,000 unidades), (2) El servicio debe realizarse dentro de la ventana de tiempo del cliente, (3) El vehículo puede llegar al cliente con anticipación, lo que resulta en una espera hora. (4) Establezca la hora de salida del vehículo desde el centro logístico a la hora 0, es decir, el minuto 0.
En segundo lugar, el código fuente

function [] =opengamainforfzh20200706()
close all
clear all
tic%开始计时。
%%%% 数据读取
[data1,data2,data3,data4,data5,data6,data7]=textread('depot2.txt','%n%n%n%n%n%n%n','delimiter', ',','headerlines', 1);% 中心
datazx=[data1 data2 data3 data4 data5 data6 data7]; % 中心数据读取
%%%%%%%%%
[data1,data2,data3,data4,data5,data6,data7]=textread('RC201.txt','%n%n%n%n%n%n%n','delimiter', ',','headerlines', 1);
data=[data1 data2 data3 data4 data5 data6 data7];
wjchangdu=size(data,1);%%调用文件的长度
%把个客户的服务时间修改为5分钟
% for gg=2:wjchangdu
%     data(gg,7)=5;
% end
% data;
%%%%%%%%%%%%%
Gmax=1000;% 迭代次数
Size=200;% 规模
Pm=0.03;% 变异概率
Pc=0.85;% 交叉概率
maxQ=1000;% 载货量
sudu=60/60;% 车辆速度 km/min
fy=0.3;% 单位费用
cb=200;% 固定成本
khNum=length(data(:,1));% 客户数量
zxNum=length(datazx(:,1));% 中心数量
cheNum=khNum;% 车辆最多数量 =客户数量
CodeL=khNum*2;% 编码个数=先后顺序+中心分配  分配采用整数代码 1是属于1 2 属于2
juli=zeros(khNum+1,khNum+1);% 距离矩阵计算
for i=1:khNum % 客户之间的距离
    for j=i+1:khNum
        juli(i,j)=(sum((data(i,2:3)-data(j,2:3)).^2))^0.5;% 距离
        juli(j,i)=juli(i,j);% 对称
    end
end
 
for i=1:zxNum
    for j=1:khNum
        julizx(i,j)=(sum((datazx(i,2:3)-data(j,2:3)).^2))^0.5;% 到中心距离
        
    end
end
 
for i=1 :Size
    Pop(i,:)= [randperm(CodeL/2) ceil(rand(1,CodeL/2)*zxNum)];% 初始化 前面是顺序 后面是隶属关系
    
end
 
for kg=1:Gmax % 开始循环
    disp(['正在进行遗传算法第' num2str(kg) '次优化'])
    
    for i=1:Size % 对每个个体进行操作
        % 计算目标函数
        fi=fical(Pop(i,:),CodeL,data,juli,maxQ,sudu,fy,cb,julizx ,zxNum);  %   调用目标
        fit(1,i)=1/fi;% 适应度=目标函数倒数
    end
    
    [Val,Ind]=max(fit);% 找出最大数值及其位置
    gBestf=Val;% 全局最优
    gBestS=Pop(Ind,:);% 全局最优个体
    
    % 选择
    ga_chose(Pop,fit,Size);
    
    % 交叉操作
    Pop=ga_cross(Pop,Size,CodeL,Pc);
    
    %   变异操作
    Pop=ga_mutation(Pop,Size,CodeL,Pm) ;
    
    Bestfi(kg)=gBestf;% 最优目标函数保存 以便画图用
    
    Pop(Size,:)=gBestS;% 精英保留策略
    
end
 
[mb,AP,zsj,zjl,waitingtime,qi]=fical(gBestS,CodeL,data,juli,maxQ,sudu,fy,cb,julizx ,zxNum); % 最优计算
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure('color',[1 1 1])% 收敛曲线
plot(1./Bestfi)
xlabel('进化代数')
ylabel('目标函数')
 
figure('color',[1 1 1])% 收敛曲线
hold on
[val,ind]=sort(AP(:,2));% 安排的序号
plot(AP(ind,3));% 到达时间曲线绘制
plot(data(1:end,5),'r--')% 时间窗开始
plot(data(1:end,6),'r:')% 时间窗结束
xlabel('客户序号')
ylabel('时间/min')
legend('开始服务时间','最早要求时间','最晚要求时间')
 
yanse={
    
    'r','b','m'};
for i1=1:max(AP(:,5))% 每一个中心
    ind1=find(AP(:,5)==i1);% 当前中心
    
    for i=1:max(AP(ind1,1))% 每一个安排车辆的路径
        figure('color',[1 1 1])
        hold on
        % 配送中心
        for  j=1:zxNum
            scatter(datazx(j,2),datazx(j,3),'b*')% 每个中心坐标
            text(datazx(j,2),datazx(j,3),[ '配送中心' num2str(datazx(j,1))])% 序号标注
        end
        
        for j=1:khNum
            scatter(data(j,2),data(j,3),'bo')% 每个客户坐标
            text(data(j,2),data(j,3),num2str(data(j,1)))% 序号标注
        end
        ind=find(AP(ind1,1)==i);% 当前车辆
        lj=[AP(ind1(ind),2)];%
        ind3=find(qi(:,1)==i1 & qi(:,2)==i);
        
        %             plot([datazx(i1,2);data(lj,2)],[datazx(i1,3);data(lj,3)],'r')% 路径绘制
        
        plot([datazx(i1,2);data(lj,2);datazx(qi(ind3,3),2)],[datazx(i1,3);data(lj,3);datazx(qi(ind3,3),3)],'r')% 路径绘制
        %         end
        xlabel('x')% 横坐标
        ylabel('y')% 纵坐标
        title(['中心' num2str(i1) '  车辆 ' num2str(i) ' 的路径为 ' num2str(lj')])% 路径标题标注
        
    end
end
 
figure('color',[1 1 1])
hold on
% 配送中心
for  j=1:zxNum
    scatter(datazx(j,2),datazx(j,3),'b*')% 每个中心坐标
    text(datazx(j,2),datazx(j,3),[ '配送中心' num2str(datazx(j,1))])% 序号标注
end
 
for j=1:khNum
    scatter(data(j,2),data(j,3),'bo')% 每个客户坐标
    text(data(j,2),data(j,3),num2str(data(j,1)))% 序号标注
end
 
for i1=1:max(AP(:,5))% 每一个中心
    ind1=find(AP(:,5)==i1);% 当前中心
    disp(['中心' num2str(i1) '路径安排: '])
    for i=1:max(AP(ind1,1))% 每一个安排车辆的路径
        ind=find(AP(ind1,1)==i);% 当前车辆
        lj=[ AP(ind1(ind),2)];% 加上起点终点
        ind3=find(qi(:,1)==i1 & qi(:,2)==i);
        
        disp(['    车辆 ' num2str(i) ' 路径安排: ' num2str([i1+khNum lj'   qi(ind3,3)+khNum]) ])
        plot([datazx(i1,2);data(lj,2);datazx(i1,2)],[datazx(i1,3);data(lj,3);datazx(qi(ind3,3),3)],'r')% 路径绘制
        
    end
end
 
xlabel('x')% 横坐标
ylabel('y')% 纵坐标
title( '车辆总路线图')  % 路径标题标注
 
toc
disp(['最优总成本为: '  num2str(1./Bestfi(end))    ', 车辆总数量为:'   num2str(length(qi(:,1)))  ', 车辆总行驶距离:'  num2str(zjl) ', 车辆总使用时间:' num2str(zsj)  ', 总等待时间 :' num2str(waitingtime)])
end

Tres, resultados en ejecución

Inserte la descripción de la imagen aquí

Cuatro, comentarios

Código completo o escritura para agregar QQ912100926 revisión anterior
>>>>>>
[planificación de ruta] algoritmo de optimización de enjambre de partículas para planificación de ruta UAV tridimensional [Matlab 012]

Supongo que te gusta

Origin blog.csdn.net/m0_54742769/article/details/112982627
Recomendado
Clasificación