matlab遗传算法求解时间惩罚与路径最短的多目标路径优化问题

Posted 张叔zhangshu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab遗传算法求解时间惩罚与路径最短的多目标路径优化问题相关的知识,希望对你有一定的参考价值。

问题描述

在解决带有时间窗的路径优化问题时,很难抉择时间窗与路径最短两个之间的关系,通常采用将多目标转换成单目标函数的方法,而转换成单目标后,系数的调节起到至关重要的作用,其中一个占比较小,就会导致另外一个参数对结果影响较大,很难真正的反应出满意的解,所以此文章采用帕累托方法,运用遗传算法,对这两个目标进行分析。

主程序如下


clc;clear;
tic;
%% 初始化
PopSize=200;%种群大小 
MaxIteration =200;%最大迭代次数
R=50;
load('cc101');
shuju=c101;
bl=0;
cap=800;                                                        %车辆最大装载量
%% 提取数据信息

E=shuju(1,5);                                                    %配送中心时间窗开始时间
L=shuju(1,6);                                                    %配送中心时间窗结束时间
zuobiao=shuju(:,2:3);                                       %所有点的坐标x和y
% vertexs= vertexs./1000;
customer=zuobiao(2:end,:);                                       %顾客坐标
cusnum=size(customer,1);                                         %顾客数
v_num=6;                                                        %车辆最多使用数目
demands=shuju(2:end,4);                                          %需求量
a=shuju(2:end,5);                                                %顾客时间窗开始时间[a[i],b[i]]
b=shuju(2:end,6);                                                %顾客时间窗结束时间[a[i],b[i]]
s=shuju(2:end,7);                                                %客户点的服务时间
h=pdist(zuobiao);
% dist=load('dist1.mat');
% dist=struct2cell(dist);
% dist=cell2mat(dist);
% dist=dist./1000;                                               %实际城市间的距离
location1=squareform(h);                                             %距离矩阵,满足三角关系,暂用距离表示花费c[i][j]=dist[i][j]
%% 遗传算法参数设置
alpha=100000;                                                       %违反的容量约束的惩罚函数系数
belta=900;%违反时间窗约束的惩罚函数系数
belta2=60;
chesu=0.667;
N=cusnum+v_num-1;                                %染色体长度=顾客数目+车辆最多使用数目-1
% location1=load('location1_100.txt');%优化100个城市
% location2=load('A_location2_100.txt');
% location1=load('location1.txt');  
% location2=load('location2.txt');
% CityNum =size(location1,2);%城市数
V=N;
M=2;
pc=0.8;pm=0.9;
%% 初始化种群
init_vc=init(cusnum,a,demands,cap);                             %构造初始解
chromosome(:,1:N)=InitPopCW(PopSize,N,cusnum,init_vc);
% for i=1:PopSize
% %     chromosome(i,1:CityNum)=randperm(CityNum);
%     chromosome(i,V+1:V+2)=costfunction(chromosome(i,1:V),location1,location2);
% end
chromosome(:,V+1:V+2)=calObj(chromosome,cusnum,cap,demands,a,b,L,s,location1,alpha,belta,belta2,chesu,bl);             %计算种群目标函数值
%%

[chromosome,individual]= non_domination_sort_mod(chromosome,N);%将解分  最后一列为拥挤度 倒数第二列为分级数
index=find(chromosome(:,N+3)==1);
costrep=chromosome(index,N+1:N+2);%第一级即非劣解

%% 主循环
pool = round(PopSize/2);  %突变池规模

for Iteration=1:MaxIteration
    if ~mod(Iteration,10)
        fprintf('current iter:%d\\n',Iteration)
        disp([' Number of Repository Particles = ' num2str(size(costrep,1))]);
    end
    parent_chromosome = selection_individuals(chromosome,pool,2);
    parent_var=parent_chromosome(:,1:N);%分离出解向量
    %% 交叉
    offspring_var=[];offspring_cost=[];
    for ic=1:pool/2
        
        m1=randi(pool);%选出交叉向量
        m2=randi(pool);
        while m1==m2
            m1=randi(pool);
        end
        scro(1,:)=parent_var(m1,:);
        scro(2,:)=parent_var(m2,:);
        if rand<pc
            c1=randi(N);%选出交叉位置
            c2=randi(N);
            while c1==c2
                c1=randi(N);
            end
            chb1=min(c1,c2);
            chb2=max(c1,c2);
            
            middle=scro(1,chb1+1:chb2);
            scro(1,chb1+1:chb2)=scro(2,chb1+1:chb2);
            scro(2,chb1+1:chb2)=middle;
            for i=1:chb1
                while find(scro(1,chb1+1:chb2)==scro(1,i))
                    zhi=find(scro(1,chb1+1:chb2)==scro(1,i));
                    y=scro(2,chb1+zhi);
                    scro(1,i)=y;
                end
                while find(scro(2,chb1+1:chb2)==scro(2,i))
                    zhi=find(scro(2,chb1+1:chb2)==scro(2,i));
                    y=scro(1,chb1+zhi);
                    scro(2,i)=y;
                end
            end
            for i=chb2+1:N
                while find(scro(1,1:chb2)==scro(1,i))
                    zhi=find(scro(1,1:chb2)==scro(1,i));
                    y=scro(2,zhi);
                    scro(1,i)=y;
                end
                while find(scro(2,1:chb2)==scro(2,i))
                    zhi=find(scro(2,1:chb2)==scro(2,i));
                    y=scro(1,zhi);
                    scro(2,i)=y;
                end
            end
        end
        if rand<pm%逆序变异
            m1=randi(N);
            m2=randi(N);
            while m1==m2
                m1=randi(N);
            end
            loc1=min(m1,m2);loc2=max(m1,m2);
            scro(1,loc1:loc2)=fliplr(scro(1,loc1:loc2));
            %             tt=scro(1,m2);
            %             scro(1,m2)=scro(1,m1);
            %             scro(1,m1)=tt;
        end
        if rand<pm%对换变异
            m1=randi(N);
            m2=randi(N);
            while m1==m2
                m1=randi(N);
            end
            tt=scro(2,m2);
            scro(2,m2)=scro(2,m1);
            scro(2,m1)=tt;
        end
        scro_cost(1,:)=calObj(scro(1,:),cusnum,cap,demands,a,b,L,s,location1,alpha,belta,belta2,chesu,bl);
%         scro_cost(1,:)=costfunction(scro(1,:),location1,location2);
scro_cost(2,:)=calObj(scro(2,:),cusnum,cap,demands,a,b,L,s,location1,alpha,belta,belta2,chesu,bl);
%         scro_cost(2,:)=costfunction(scro(2,:),location1,location2);
        offspring_var=[offspring_var;scro];%解
        offspring_cost=[offspring_cost;scro_cost];%适应度
        
    end
    offspring_chromosome(:,1:V)=offspring_var;
    offspring_chromosome(:,V+1:V+M)=offspring_cost;
    
    main_pop = size(chromosome,1);
    offspring_pop = size(offspring_chromosome,1);
    intermediate_chromosome(1:main_pop,:) = chromosome;
    intermediate_chromosome(main_pop + 1 :main_pop + offspring_pop,1 : M+V) = ...
        offspring_chromosome;
    intermediate_chromosome = ...
        non_domination_sort_mod(intermediate_chromosome,N);
    %% 选择
    
    chromosome = replace_chromosome(intermediate_chromosome,PopSize,N);
    
    
    index=find(intermediate_chromosome(:,N+3)==1);
    costrep=intermediate_chromosome(index,N+1:N+2);
    cost=intermediate_chromosome(:,N+1:N+2);
        if ~mod(Iteration,1)
    
            figure (1)
            plot(costrep(:,1),costrep(:,2),'r*',cost(:,1),cost(:,2),'kx');
            xlabel('路径成本');ylabel('时间成本');
            title(strcat('Interaction ',num2str(Iteration), ' Pareto non-dominated solutions'));
            %          hold on
        end
    if ~mod(Iteration,MaxIteration)
        %             if ~mod(Iteration,1)
        fun_pf=costrep;
        [fun_pf,~]=sortrows(fun_pf,1);
        plot(fun_pf(:,1),fun_pf(:,2),'k*-');
        title(strcat('Interaction ',num2str(Iteration), ' Pareto non-dominated solutions'));
        hold on;
        grid on;
    end
end
% dx=size(fun_pf,1);
%% 假设选择第一个解作为最优解
[VC,NV,TD,violate_num,violate_cus]=decode(chromosome(1,1:N),cusnum,cap,demands,a,b,L,s,location1,chesu,bl)

基于NSGA-Ⅱ的时变时间窗双目标问题求解及对比分析

运行结果图如图所示:
在这里插入图片描述

从表中我们可以看出,随着f1的逐渐减少f2在逐渐增大,所以f1与f2呈负相关。任意两个解之间互不优劣,互不支配,这就是帕累托解集的特点。

对比分析

第一个解:
在这里插入图片描述

车程:28.66千米
违反时间窗惩罚成本:1081元

行驶路径:
配送路线1:0->6->9->1->0
配送路线2:0->2->8->4->7->0
配送路线3:0->5->3->0

第六个解:
在这里插入图片描述

车程:43.17千米
时间惩罚成本:918元

行驶路径:
配送路线1:0->2->9->4->0
配送路线2:0->1->3->8->7->0
配送路线3:0->5->6->0

对比分析
对比第一个方案和第六个方案,第一个方案行驶车程较第六辆车少了5千米,一千米油耗2元,相当于第一个方案在运输成本上比第六个方案少了10元,但是第一个方案违反时间窗的惩罚成本比第六个方案多大约162元,所以第六个方案更优。

第六个解路径图如下

在这里插入图片描述

如需代写或代码+VX:zzs1056600403

以上是关于matlab遗传算法求解时间惩罚与路径最短的多目标路径优化问题的主要内容,如果未能解决你的问题,请参考以下文章

路径规划遗传算法求解考虑分配次序的多无人机协同目标分配问题

VRP问题基于matlab遗传算法求解受灾期间的多中心车辆路径规划问题含Matlab源码 2353期

在matlab上实现遗传算法解决TSP旅行者问题

路径规划基于matlab粒子群和遗传算法求解充电量和时间窗约束下的多AGV路径规划问题含Matlab源码 2399期

配送路径规划基于matlab遗传算法求解带时间窗的多配送中心半开放式车辆路径规划问题含Matlab源码 YC002期

路径规划基于matlab遗传算法求解仓库拣货距离最短优化问题含Matlab源码 2154期