实验数据包括15个服务点和3个车场。
main.m如下
clc
clear
%导入数据
global request;
global v_Pos;
global d_Pos;
[request,v_Pos,d_Pos] = Pos_init;
%客户数,车场数,各车场车辆数,最大装载量、货物需求表request
v_num = length(v_Pos);
d_num = length(d_Pos);
global max_car_num;
global max_load;
max_car_num = 5;
max_load = 25;
%初始化最近邻车场表Service_D和临近车场表NearD,以及距离服务点矩阵Dis,和车场距离矩阵Dis_depot
lamda = 0.7;
%global some matrix
global Dis;
global Dis_depot;
global NearD;
[Service_D,NearD,Dis,Dis_depot] = NearD_ini(v_Pos,d_Pos,lamda);
%初始化染色体
%染色体个数
N = 75;
chrom = cell(N,1);
for i = 1:N
chrom{i} = chrom_ini(Service_D,d_num);
end
%
fitness = zeros(N,1);
temp_fitness = zeros(N,d_num);
%染色体解码---VSplit保证可行性
route = cell(N,1);
for i = 1:N
route{i} = zeros(d_num,v_num);
end
%对N个染色体进行解码操作
%设定执行VGSH操作的概率
P_VGSH = 0.2;
for i = 1:N
%判断是否使用VGSH进行优化
is_vgsh = 0;
if(randn<P_VGSH)
is_vgsh = 1;
end
for j = 1:d_num
%先得到每个路径上的客户点数和需要的车辆数
temp = chrom{i}(j,:);
temp(find(temp==0))=[];
total_request = 0;
global A;
A = zeros(1,length(temp));
for k = temp
total_request = total_request + request(k);
end
car_count = ceil(total_request/max_load);%至少需要的车辆数
[route{i}(j,:),temp_fitness(i,j)] = route_ini(temp,Dis,Dis_depot(j,:),request,max_load,car_count,max_car_num);%初始解码
if(is_vgsh == 1)
[chrom{i}(j,:),temp_fitness(i,j)] = VGSH(chrom{i}(j,:),route{i}(j,:));
end
end
fitness(i) = 1./sum(temp_fitness(i,:));
end
A = [];
draw_track(chrom{1},route{1});
%接下来进入进化阶段
%遗传代数
T = 2500;
t = 1;
changeofbest = zeros(T,1);
while(t<=T)
%首先对上一代的染色体进行自然选择
[chrom,fitness,route] = nature_select(chrom,route,fitness);
max(fitness);
if(mod(t,50)==0)
distance = 1/max(fitness)
end
changeofbest(t) = max(fitness);
t = t + 1;
end
draw_track(chrom{1},route{1});
if exist('result.xlsx','file')
a = xlsread('result.xlsx');
end
data = [a;distance max(fitness)];
xlswrite('result.xlsx',data,'sheet1')
plot(changeofbest,'LineStyle','-'
实验结果如下:
运行前:
运行后: