matlab遗传算法求解选址结合路径优化问题

5 篇文章 13 订阅
4 篇文章 8 订阅

问题描述:

客户到自提点取货,配送中心配送货物到取货点。客户到自提点取货为选址,配送中心到取货点为路径优化。
目标–1、客户满意度总体最高
2、总成本最小

3、实例
在这里插入图片描述

clc;clear;%%如需帮助 zhangshu2274
tic;
%% 初始化
PopSize=200;%种群大小 
MaxIteration =500;%最大迭代次数
R=50;
load('shuju2');
load('location1')
load('jsfy');
shuju=c101;
cap=900;                                                        %车辆最大装载量
%% 提取数据信息
syzb=shuju(:,2:3);
zb=shuju(1:9,2:3);
sanjizb=shuju(10:end,2:3);                                       %所有点的坐标x和y
erjizb=zb(2:end,:);                                       %顾客坐标
cusnum=size(erjizb,1);                                         %顾客数
v_num=2;                                                        %f分界点
ejdemands=shuju(2:9,4);
sjdemands=shuju(10:end,4);
%% 遗传算法参数设置
alpha=10000;                                                       %违反的容量约束的惩罚函数系数
N=cusnum+v_num;                                %染色体长度=顾客数目+车辆最多使用数目-1
V=N;
M=2;
pc=0.8;pm=0.9;
%% 初始化种群
chromosome(:,1:N)=InitPop(PopSize,N);
[VC,NV]=decode(chromosome(1,:),cusnum);
%%
chromosome(:,V+1:V+2)=calObj(chromosome,cusnum,cap,ejdemands,sjdemands,location1,alpha,jsfy);             %计算种群目标函数值
%%
[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
        
        [VC,NV]=decode(scro(1,:),cusnum);
        if size(VC)==0
            scro(1,:)=parent_var(m1,:);
        end
           [VC,NV]=decode(scro(2,:),cusnum);
        if size(VC)==0
            scro(2,:)=parent_var(m2,:);
        end
        scro_cost(1,:)=calObj(scro(1,:),cusnum,cap,ejdemands,sjdemands,location1,alpha,jsfy);
%         scro_cost(1,:)=costfunction(scro(1,:),location1,location2);
scro_cost(2,:)=calObj(scro(2,:),cusnum,cap,ejdemands,sjdemands,location1,alpha,jsfy);
%         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'));
        end
    if ~mod(Iteration,MaxIteration)
        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

%% 假设选择第一个解作为最优解
[VC,NV]=decode(chromosome(1,1:N),cusnum)
 [cost1,cost2,zzl]=costFuction(VC,NV,jsfy,ejdemands,sjdemands,location1,cap,alpha);
 [myd,d,b]=manyidu(location1,VC)
 %%
figure
hold on;box on
title('最优配送方案路线图')
hold on;
 for i=2:size(syzb,1)
    text(syzb(i,1),syzb(i,2),num2str(i-1),'color',[1,0,0]);
end
 plot(zb(:,1),zb(:,2),'ro','linewidth',1);hold on;
 plot(zb(1,1),zb(1,2),'s','linewidth',2,'MarkerEdgeColor','b','MarkerFaceColor','b','MarkerSize',10);hold on
  plot(sanjizb(:,1),sanjizb(:,2),'ko','linewidth',1);hold on;
 D=size(d,2);
%   C=linspecer(D);
  DD=size(VC,1)+D;
  C=linspecer(DD);
  CC=size(VC,1);
  %%
 for i=1:CC
      part_seq=VC{i}; 
         len=length(part_seq);  
         for j=0:len
        %当j=0时,车辆从配送中心出发到达该路径上的第一个门店
        if j==0
            fprintf('%s','配送路线',num2str(i),':');
            fprintf('%d->',0);
            c1=zb(part_seq(1)+1,:);
            plot([zb(1,1),c1(1)],[zb(1,2),c1(2)],'-','color',C(i,:),'linewidth',1);
        %当j=len时,车辆从该路径上的最后一个门店出发到达配送中心
        elseif j==len
            fprintf('%d->',part_seq(j));
            fprintf('%d',0);
            fprintf('\n');
            c_len=zb(part_seq(len)+1,:);
            plot([c_len(1),zb(1,1)],[c_len(2),zb(1,2)],'-','color',C(i,:),'linewidth',1);
        %否则,车辆从路径上的前一个门店到达该路径上紧邻的下一个门店
        else
            fprintf('%d->',part_seq(j));
            c_pre=zb(part_seq(j)+1,:);
            c_lastone=zb(part_seq(j+1)+1,:);
            plot([c_pre(1),c_lastone(1)],[c_pre(2),c_lastone(2)],'-','color',C(i,:),'linewidth',1);
        end
    end
 end
%%

%   j=0;
%   for i=1:D
 for j=1:40
%      part_seq=VC{i};
%          len=length(part_seq); 
%          j=j+1;
       
%          for j=1:len
            c_pre=zb(d(b(j))+1,:);
            c_lastone=sanjizb(j,:);
            
            plot([c_pre(1),c_lastone(1)],[c_pre(2),c_lastone(2)],'-','color',C(b(j)+size(VC,1),:),'linewidth',1);
         
%         end
    end

运行结果‘

多目标帕累托解

在这里插入图片描述

红色的点为备选取货点在这里插入图片描述

选择的备选网点及配送路径图

在这里插入图片描述

客户选择的自提点

在这里插入图片描述

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张叔zhangshu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值