**
问题描述
**
有关多配送中心的选址-路径优化问题,一般是通过基于区域内的客户需要求,对配送中心进行合理的选址以及配送中心的车辆调度以及路径优化。在给出的配送中心候选点位置已知,需要在给出的这些位置中,通过与顾客需求,车辆类型及容量,配送时间窗等约束,将路径长度,配送成本等目标条件中,建立模型,找到最优的配送方式。
本文目标函数为:
配送中心成本–所以需要确定配送中心位置,即为选址
运输成本–所以需要确定配送路径,配送车辆类型
时间惩罚成本–配送时间窗
约束:
(懒得插入公式凑合着看)
主函数代码:
c101的数据来自http://web.cba.neu.edu/~msolomon/problems.htm 大家可以在这个网站找自己需要的数据,然后对数据进行修改。
clear
clc
close all
load('c101');
shuju=c101
cap=[50 60 70]; %车辆最大装载量
E=shuju(1,5); %配送中心时间窗开始时间
L=shuju(1,6); %配送中心时间窗结束时间
zuobiao=shuju(:,2:3); %所有点的坐标x和y
pszx=zuobiao(1:4,:);
customer=zuobiao(5:end,:); %顾客坐标
cusnum=size(customer,1); %顾客数
v_num=10; %车辆最多使用数目
demands=shuju(5:end,4); %需求量
a=shuju(5:end,5); %顾客时间窗开始时间[a[i],b[i]]
b=shuju(5:end,6); %顾客时间窗结束时间[a[i],b[i]]
s=shuju(5:end,7); %客户点的服务时间
h=pdist(zuobiao);
dist=squareform(h);
%% 遗传算法参数设置
alpha=10; %违反的容量约束的惩罚函数系数
belta=1;%违反时间窗约束的惩罚函数系数
belta2=1;
NIND=200; %种群大小
MAXGEN=200; %迭代次数
Pc=0.9; %交叉概率
Pm=0.05; %变异概率
GGAP=0.9; %代沟(Generation gap)
N=cusnum+v_num-1; %染色体长度=顾客数目+车辆最多使用数目-1
% N=cusnum;
%% 初始化种群
pppp=rand(NIND,1);
fpfa=clsjfp(pppp,v_num);%随机分配车辆
dpszx = struct('ps',[], 'Chrom',[]);
dpszx.Chrom=InitPopCW(NIND,N,cusnum,a,demands,cap,fpfa); %构造初始解
ps=pszxxz(dpszx.Chrom,cusnum);
fp=clfprl(dpszx.Chrom,cusnum,v_num,fpfa);
disp('初始种群中的一个随机值:')
[VC,NV,TD,violate_num,violate_cus]=decode(dpszx.Chrom(1,:),cusnum,cap,demands,a,b,L,s,dist,chesu,bl);
disp(['车辆使用数目:',num2str(NV),',车辆行驶总距离:',num2str(TD)]);
disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
%% 优化
gen=1;
figure;
hold on;box on
xlim([0,MAXGEN])
title('优化过程')
xlabel('代数')
ylabel('最优值')
ObjV=calObj(dpszx.Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl,ps,fp); %计算种群目标函数值
preObjV=min(ObjV);
%%
while gen<=MAXGEN
%% 计算适应度
ObjV=calObj(dpszx.Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl,ps,fp); %计算种群目标函数值
line([gen-1,gen],[preObjV,min(ObjV)]);pause(0.0001)%画图 最优函数
preObjV=min(ObjV);
FitnV=Fitness(ObjV);
% FitnV
%% 选择
[SelCh,psc,fpc]=Select(dpszx.Chrom,FitnV,GGAP,ps,fp);
%% OX交叉操作
[SelCh,psc,fpc]=Recombin(SelCh,Pc,psc,fpc,cusnum,a,demands,cap,v_num,fpfa);
%% 变异
[SelCh,psc,fpc,]=Mutate(SelCh,Pm,psc,fpc,cusnum,a,demands,cap,v_num,fpfa);
%% 重插入子代的新种群
[dpszx.Chrom,ps,fp]=Reins(dpszx.Chrom,SelCh,ObjV,psc,ps,fpc,fp);
%% 打印当前最优解
ObjV=calObj(dpszx.Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl,ps,fp); %计算种群目标函数值
[minObjV,minInd]=min(ObjV);
disp(['第',num2str(gen),'代最优解:']);
[bestVC,bestNV,bestTD,best_vionum,best_viocus]=decode(dpszx.Chrom(minInd(1),:),cusnum,cap,demands,a,b,L,s,dist,chesu,bl);
disp(['车辆使用数目:',num2str(bestNV),',车辆行驶总距离:',num2str(bestTD)]);
fprintf('\n')
%% 更新迭代次数
gen=gen+1 ;
end
%% 画出最优解的路线图
ObjV=calObj(dpszx.Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl,ps,fp); %计算种群目标函数值
[minObjV,minInd]=min(ObjV);
%% 输出最优解的路线和总距离
disp('最优解:')
bestChrom=dpszx.Chrom(minInd(1),:);
bestps=ps(minInd(1),:);
[bestVC,bestNV,bestTD,best_vionum,best_viocus]=decode(bestChrom,cusnum,cap,demands,a,b,L,s,dist,chesu,bl);
disp(['车辆使用数目:',num2str(bestNV),',车辆行驶总距离:',num2str(bestTD)]);
disp('-------------------------------------------------------------')
% [cost]=costFuction(bestVC,a,b,s,L,dist,demands,cap,alpha,belta,belta2,chesu,bl,);
%% 画出最终路线图
draw_Best(bestVC,zuobiao,bestps);
%-------------如需帮忙V:18332607515
运行结果:
此程序为遗传算法,并没有太多的优化,后续可以再加上局部搜索进行优化,目前仅为展示
可以看到这是不同的类型的车辆分配方案:
这是每个配送中心的任务量: