【多式联运】基于粒子群结合遗传算法实现陆海空多式联运问题附matlab代码
1 简介
物流运输方式由公路、水路、空运及管道等 3 种方式组成,3 种运输方式在技术上、经济上各有长短,都有适宜的 使用范围,每种运输方式单独运用很难实现节约资源、降本增效。随着我国经济不断发展以及布局网络技术的不断深化,多式 联运通过把传统的、单一的运输方式进行择优组合,充分利用了各个运输方式现有的设施设备,实现了运输过程中的资源整 合,有利于运输过程中的可持续发展及达成规模经济中降本增效的目的,同时提高了物流行业竞争力。特别是通过公铁水多式 联运路径优化,构建以运输时间最少、运输线路距离最短、运输成本最低的公铁水多式联运模式,对于物流企业节约资源、降本增效意义重大。本文提出了一个以粒子群结合遗传算法为主框架的解决方案,用来求解多式联运的路径规划问题。本文从运输需求内容、运输过程、应用场景等角度对多式联运在军事运输中的应用进行分析,定义多式联运路径规划问题,建立分别以时问最短、路线最短、成本最低为目标的多式联运路径规划模型。
2 部分代码
clear
clc
close all
tic
%% 用importdata这个函数来读取文件
shuju= xlsread('shuju.xlsx', 'Sheet1');
bl=0;
cap=100; %车辆最大装载量
%% 提取数据信息
zuobiao=shuju(:,2:3); %所有点的坐标x和y
customer=zuobiao(2:end,:); %顾客坐标
cusnum=size(customer,1); %顾客数
v_num=8; %车辆最多使用数目
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);
lldist=squareform(h).*1.5; %路路距离矩阵
htdist=squareform(h); %飞机距离矩阵
hydist=squareform(h).*1.2; %%火车距离矩阵
%% 遗传算法参数设置
alpha=100000; %违反的容量约束的惩罚函数系数
belta=0.5;%违反时间窗约束的惩罚函数系数
belta2=0.5;
chesu=[1,5,2];
NIND=300; %种群大小
MAXGEN=500; %迭代次数
Pc=0.9; %交叉概率
Pm=0.05; %变异概率
GGAP=0.9; %代沟(Generation gap)
N=cusnum+v_num-1; %染色体长度=顾客数目+车辆最多使用数目-1
%% 粒子群参数
lx=3;
w=1; %惯性因子
wdamp=0.99; %惯性因子衰减率
c1=1.5; %个体学习因子
c2=2.0; %全局学习因子
XvMin=1; %Xv下限
XvMax=lx; %Xv上限
VvMin=-(lx-1); %Vv下限
VvMax=lx-1; %Vv上限
%% 初始化种群
Chrom=InitPopCW(NIND,N,cusnum,a,demands,cap,XvMin,XvMax,VvMin,VvMax); %构造初始解
%% 输出随机解的路线和总距离
disp('初始种群中的一个随机值:')
[VC,NV,PD]=decode(Chrom{1},cusnum);
% disp(['总距离:',num2str(TD)]);
disp(['车辆使用数目:',num2str(NV)]);
disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
%% 优化
gen=1;
figure;
hold on;box on
xlim([0,MAXGEN])
title('优化过程')
xlabel('代数')
ylabel('最优值')
ObjV=calObj(Chrom,cusnum,cap,demands,a,b,s,lldist,htdist,hydist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
preObjV=min(ObjV);
[~,minInd]=min(ObjV);
gbest_pos=Chrom{minInd,1}(2,:); %假设第一个粒子位置为全局最优位置
gbest_obj=preObjV; %第一个粒子位置的目标函数值
pbest_pos=cell(NIND,1); %初始化各个粒子的个体最优位置
pbest_obj=ObjV; %初始化各个粒子的个体最优的目标函数值
for i=1:NIND
particle=Chrom{i,1}; %第i个粒子
position=particle(2,:); %第i个粒子的位置
pbest_pos{i,1}=position; %初始化这个粒子的个体最优
if pbest_obj(i,1)<gbest_obj
%更新初始种群中的全局最优粒子
gbest_obj=pbest_obj(i,1);
gbest_pos=position;
end
end
%%
while gen<=MAXGEN
%% 计算适应度
ObjV=calObj(Chrom,cusnum,cap,demands,a,b,s,lldist,htdist,hydist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
line([gen-1,gen],[preObjV,min(ObjV)]);pause(0.0001)%画图 最优函数
preObjV=min(ObjV);
FitnV=Fitness(ObjV);
%% 选择
SelCh=Select(Chrom,FitnV,GGAP);
%% OX交叉操作
SelCh=Recombin(SelCh,Pc);
%% 变异
SelCh=Mutate(SelCh,Pm);
%% 重插入子代的新种群
Chrom=Reins(Chrom,SelCh,ObjV);
ObjV=calObj(Chrom,cusnum,cap,demands,a,b,s,lldist,htdist,hydist,alpha,belta,belta2,chesu,bl);
%% 更新各个粒子的位置和速度
Chrom1=Chrom;
for i=1:NIND
particle=Chrom{i,1}; %第i个粒子
position=particle(2,:); %第i个粒子的位置
Xv=position(1,:);
velocity=particle(3,:); %第i个粒子的速度
Vv=velocity(1,:);
%% 更新速度
velocity=w*velocity+ +c1*rand([1,N]).*(pbest_pos{i,1}-position)...
+c2*rand([1,N]).*(gbest_pos-position);
%% 速度越界处理
velocity(1,:)=max(velocity(1,:),VvMin);
velocity(1,:)=min(velocity(1,:),VvMax);
%% 更新位置
position=position+velocity;
position(1,:)=ceil(position(1,:)); %对Xv向上取整
%% 速度镜像影响
IsOutside=(position(1,:)<XvMin | position(1,:)>XvMax );
velocity(IsOutside)=-velocity(IsOutside);
%% 位置越界处理
position(1,:)=max(position(1,:),XvMin);
position(1,:)=min(position(1,:),XvMax);
Chrom1{i,1}(2,:)=position;
end
ObjV1=calObj(Chrom1,cusnum,cap,demands,a,b,s,lldist,htdist,hydist,alpha,belta,belta2,chesu,bl);
%% 重插入子代的新种群
Chrom=Copy_of_Reins(Chrom,Chrom1,ObjV1,NIND,ObjV);
%% 打印当前最优解
ObjV=calObj(Chrom,cusnum,cap,demands,a,b,s,lldist,htdist,hydist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
[~,minInd]=min(ObjV);
for i=1:NIND
if min(ObjV)<ObjV(i)
particle=Chrom{minInd,1};
position=particle(2,:);
pbest_pos{i,1}=position;
pbest_obj(i,1)=ObjV(i);
%% 更新全局最优
if preObjV<gbest_obj
gbest_pos=pbest_pos{i,1};
gbest_obj=pbest_obj(i,1);
end
end
end
disp(['第',num2str(gen),'代最优解:'])
fprintf('\n')
%% 更新迭代次数
gen=gen+1 ;
end
%% 画出最优解的路线图
ObjV=calObj(Chrom,cusnum,cap,demands,a,b,s,lldist,htdist,hydist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
[minObjV,minInd]=min(ObjV);
%% 输出最优解的路线和总距离
disp('最优解:')
bestChrom=Chrom{minInd(1)};
[VC,NV,PD]=decode(bestChrom,cusnum);
disp('-------------------------------------------------------------')
[cost]=costFuction(VC,NV,PD,a,b,s,lldist,htdist,hydist,demands,cap,alpha,belta,belta2,chesu,bl);
disp(['总成本:',num2str(cost)]);
disp(['路路:',num2str(1)]);
disp(['航天:',num2str(2)]);
disp(['海运:',num2str(3)]);
%% 画出最终路线图
draw_Best(VC,zuobiao,PD);
% toc
function [A,c]=cdzwz(dist,route,dis)
dis=0.9*dis;
n=length(route);
p_l=0;
DL=1;
c=[];
A=[];
for i=1:n
if i==1
p_l=p_l+dist(1,route(i)+1);
DL=DL-(dist(1,route(i)+1)/dis);
if DL<0
c=[c,i];
DL=1;
end
else
p_l=p_l+dist(route(i-1)+1,route(i)+1);
DL=DL-dist(route(i-1)+1,route(i)+1)/dis;
if DL<0
[a,b]=min(dist(route(i-1)+1,end-9:end));
DL=DL+dist(route(i-1)+1,route(i)+1)/dis-a/dis;
if DL<0
c=[c,i-1];
DL=1;
[a,b]=min(dist(route(i-1)+1,end-9:end));
A=[A,b+40];
DL=DL-dist(route(i-1)+1,b+41)/dis;
else
c=[c,i];
DL=1;
[a,b]=min(dist(route(i)+1,end-9:end));
A=[A,b+40];
DL=DL-dist(route(i)+1,b+41)/dis;
end
end
end
end
p_l=p_l+dist(route(end)+1,1);
DL=DL-dist(route(end)+1,1)/dis;
if DL<0
c=[c,n];
DL=1;
[a,b]=min(dist(route(i)+1,end-9:end));
A=[A,b+40];
DL=DL-dist(route(i)+1,b+41)/dis;
end
end
function [A,c]=cdzwz(dist,route,dis)
dis=0.9*dis;
n=length(route);
p_l=0;
DL=1;
c=[];
A=[];
for i=1:n
if i==1
p_l=p_l+dist(1,route(i)+1);
DL=DL-(dist(1,route(i)+1)/dis);
if DL<0
c=[c,i];
DL=1;
end
else
p_l=p_l+dist(route(i-1)+1,route(i)+1);
DL=DL-dist(route(i-1)+1,route(i)+1)/dis;
if DL<0
[a,b]=min(dist(route(i-1)+1,end-9:end));
DL=DL+dist(route(i-1)+1,route(i)+1)/dis-a/dis;
if DL<0
c=[c,i-1];
DL=1;
[a,b]=min(dist(route(i-1)+1,end-9:end));
A=[A,b+40];
DL=DL-dist(route(i-1)+1,b+41)/dis;
else
c=[c,i];
DL=1;
[a,b]=min(dist(route(i)+1,end-9:end));
A=[A,b+40];
DL=DL-dist(route(i)+1,b+41)/dis;
end
end
end
end
p_l=p_l+dist(route(end)+1,1);
DL=DL-dist(route(end)+1,1)/dis;
if DL<0
c=[c,n];
DL=1;
[a,b]=min(dist(route(i)+1,end-9:end));
A=[A,b+40];
DL=DL-dist(route(i)+1,b+41)/dis;
end
end
function [A,c]=cdzwz(dist,route,dis)
dis=0.9*dis;
n=length(route);
p_l=0;
DL=1;
c=[];
A=[];
for i=1:n
if i==1
p_l=p_l+dist(1,route(i)+1);
DL=DL-(dist(1,route(i)+1)/dis);
if DL<0
c=[c,i];
DL=1;
end
else
p_l=p_l+dist(route(i-1)+1,route(i)+1);
DL=DL-dist(route(i-1)+1,route(i)+1)/dis;
if DL<0
[a,b]=min(dist(route(i-1)+1,end-9:end));
DL=DL+dist(route(i-1)+1,route(i)+1)/dis-a/dis;
if DL<0
c=[c,i-1];
DL=1;
[a,b]=min(dist(route(i-1)+1,end-9:end));
A=[A,b+40];
DL=DL-dist(route(i-1)+1,b+41)/dis;
else
c=[c,i];
DL=1;
[a,b]=min(dist(route(i)+1,end-9:end));
A=[A,b+40];
DL=DL-dist(route(i)+1,b+41)/dis;
end
end
end
end
p_l=p_l+dist(route(end)+1,1);
DL=DL-dist(route(end)+1,1)/dis;
if DL<0
c=[c,n];
DL=1;
[a,b]=min(dist(route(i)+1,end-9:end));
A=[A,b+40];
DL=DL-dist(route(i)+1,b+41)/dis;
end
end
%% 根据vehicles_customer整理出final_vehicles_customer,将vehicles_customer中空的数组移除
function [ final_VC,VU ] = deal_vehicles_customer( VC )
vecnum=size(VC,1); %车辆数
final_VC={}; %整理后的vehicles_customer
count=1; %计数器
for i=1:vecnum
par_seq=VC{i}; %每辆车所经过的顾客
%如果该辆车所经过顾客的数量不为0,则将其所经过的顾客数组添加到final_vehicles_customer中
if ~isempty(par_seq)
final_VC{count}=par_seq;
count=count+1;
end
end
%% 为了容易看,将上述生成的1行多列的final_vehicles_customer转置了,变成多行1列的了
final_VC=final_VC';
VU=size(final_VC,1); %所使用的车辆数
end
%% 根据vehicles_customer整理出final_vehicles_customer,将vehicles_customer中空的数组移除
function [ final_VC,VU ] = deal_vehicles_customer( VC )
vecnum=size(VC,1); %车辆数
final_VC={}; %整理后的vehicles_customer
count=1; %计数器
for i=1:vecnum
par_seq=VC{i}; %每辆车所经过的顾客
%如果该辆车所经过顾客的数量不为0,则将其所经过的顾客数组添加到final_vehicles_customer中
if ~isempty(par_seq)
final_VC{count}=par_seq;
count=count+1;
end
end
%% 为了容易看,将上述生成的1行多列的final_vehicles_customer转置了,变成多行1列的了
final_VC=final_VC';
VU=size(final_VC,1); %所使用的车辆数
end
3 仿真结果
4 参考文献
[1]丁建伟. 基于遗传算法的多式联运应急管理研究[J]. 电脑开发与应用, 2009, 22(1):3.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。
【多式联运】基于粒子群结合遗传算法实现陆海空多式联运问题附matlab代码相关推荐
- 【回归预测-ELM预测】基于粒子群算法PSO优化极限学习机预测附matlab代码
1 内容介绍 风电功率预测为电网规划提供重要的依据,研究风电功率预测方法对确保电网在安全稳定运行下接纳更多的风电具有重要的意义.针对极限学习机(ELM)回归模型预测结果受输入参数影响的问题,现将粒子群 ...
- 【微电网优化】基于粒子群算法求解智能微电网调度问题附matlab代码
1 简介 搭建光伏,风力发电机和储能电池的数学模型.充分考虑对蓄电池的充放电保护,制定优化调度策略.应用粒子群算法(PSO)对其优化调度模型进行求解,在算法中增加了蓄电池满充满放的限制条件,同时使系统 ...
- 【SVM分类】基于粒子群算法优化支持向量机实现葡萄酒数据分类附matlab代码
1 简介 在机器学习领域,要处理的数据的规模越来越大,而学习算法在数据的特征过多的时候,往往会产生性能上的下降.作为解决这个问题的有效手段,特征选择一直以来都得到了广泛的关注.粒子群优化算法作为一种优 ...
- 【优化选址】基于粒子群算法实现无线传感器网络覆盖优化附matlab代码
1 简介 无线传感器网络是将大量的传感器感知节点散布在监测区域中,通过节点之间的无线信息传输形成的自组网.由于无线传感器网络工作环境复杂,传感器节点更换电源不便,网络的覆盖控制问题成为研究核心,它决定 ...
- 【图像配准】基于粒子群改进sift实现SAR图像配准附matlab代码
1 简介 1.1 SIFT综述 尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找 ...
- 基于蚁群结合遗传算法的路径规划问题附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.
- 【微电网优化】基于粒子群优化IEEE经典微电网结构附matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.
- 基于基于粒子群优化算法的微电网调度(Matlab代码实现)
目录 ⛳️1 写在前面 ⛳️2 基于基于粒子群优化算法的微电网调度(Matlab代码实现)
- 【ELAMN预测】基于粒子群算法优化ELMAN神经网络实现数据回归预测 matlab代码
1 简介 风能,作为一种重要,有潜力,无污染,可再生.可持续的能源,已经成为全球发电最为迅速的能源之一,越来越受到世界各国的青睐.近年来,为缓解能源短缺问题,改善环境,实现经济乃至人类的可持续发展,世 ...
最新文章
- linux中cat more less head tail 命令区别
- 这个机械装置真的能够分离彩色小球吗?
- UVA11255 Necklace Burnside、组合
- html中iframe根据子页面内容动态修改高度
- 【李宏毅机器学习】Unsupervised Learning - Word Embedding 无监督学习 - 词嵌入(p22) 学习笔记
- leetcode题解25-K个一组翻转链表
- C++学习(三)(C语言部分)之 基本数据类型
- 1009 C语言 SUM problem
- 【转】jquery文件上传插件uploadify在.NET中session丢失的解决方案
- 《记》rxjs分流操作符简单实现
- linux内核网络基础,linux网络内核基础.doc
- 关于if __name__ == '__main__'的理解
- linux c 密码 星号,Linux C : 登录密码星号 * 显示,包含能回退 backspace
- 图神经网络学习笔记(1)——图信号与图傅里叶变换
- redis设计与实现读书笔记(一)
- vue组件库(Element UI)
- 中级软件工程师的技能基本要求
- 统计学中p值计算公式_统计学中P值的计算!
- 微信小程序引用vant toast 提示 “未找到 van-toast 节点“
- ArcGIS简单的三维演示