MATLAB实现遗传算法优化公铁水联运
公铁水联运是运输行业的经典问题, 常用智能算法进行优化,比如遗传算法.
公铁水多式联运优化的数学模型如下:
1.模型简介
公铁水多式联运优化问题可以抽象为一个网络流问题,其中节点代表不同的运输方式转换点(如公路、铁路、水运的交汇点),边代表不同的运输路径。目标是找到从起点到终点的最优路径,同时考虑运输时间、成本和距离等多个因素。
2.目标函数
目标函数通常包括最小化运输时间、成本和距离。这些目标可以通过加权的方式组合成一个单目标函数。具体公式如下:
- 最小化运输时间:,其中是路径i的运输时间,是一个0-1变量,表示路径i的以第j种运输方式运输是否被选择(1表示选择,0表示未选择)。
- 最小化运输成本:,其中 是路径i的运输成本,是一个0-1变量,表示路径i的以第j种运输方式运输是否被选择(1表示选择,0表示未选择)。
- 最小化运输距离:,其中 是路径i的运输成本,是一个0-1变量,表示路径i的以第j种运输方式运输是否被选择(1表示选择,0表示未选择)。
综合以上三个目标,可以得到一个加权的目标函数:,其中 )是权重因子,用于平衡不同目标之间的重要性。
约束条件
约束条件主要包括以下几类:
- 路径选择约束:确保从起点到终点只有一条路径被选择。即 ,其中是从起点s 到终点t的所有可能路径集合。
- 转运次数约束:限制在整个运输过程中转运的次数。,其中最多转运次数为k,表示在第j个转运点是否进行转运(1表示转运,0表示不转运)。
- 容量约束:确保每个运输方式的容量不超过其最大限制。,其中是路径i上运输方式j的运输量,是路径i的运输方式j最大运输容量。
- 时间约束:确保货物在规定的时间内到达目的地。设置总运输时间不超过。
请注意,以上模型是一个简化的表示,实际应用中可能需要根据具体情况进行调整和扩展。
遗传算法的流程已经很多,不再赘述, 总体流程如下图所示:
MATLAB主程序:
%% 遗传算法优化多目标 clc;close all;clear all;warning off;%清除变量 rand('seed', 100); randn('seed', 100); format long g; global alpha1 beta1; alpha1=0.1; beta1=0.9; %% 读取数据 filename='数据.xlsx'; [adata201,bdata201,cdata201]=xlsread(filename,'运费'); [adata202,bdata202,cdata202]=xlsread(filename,'转换费'); [adata203,bdata203,cdata203]=xlsread(filename,'转换时间'); [adata204,bdata204,cdata204]=xlsread(filename,'边数据');% [边序号 节点1 节点2 距离 公 铁 水] [adata205,bdata205,cdata205]=xlsread(filename,'坐标'); %% 变量赋值 global transport_cost_mat transport_v_mat tran_cost_mat tran_time_mat; global nodenumber edgenumber edge_table transport_type_cell dmat nearcell; XY=adata205(:,2:3);% 坐标 transport_cost_mat=adata201(1,:)';% 运费 transport_v_mat=adata201(2,:)';% 速度 tran_cost_mat=adata202;% 转换费 tran_time_mat=adata202;% 转换时间 nodenumber=size(XY,1); edge_table=adata204(:,2:end);% 节点1 节点2 距离 公 铁 水 edgenumber=size(edge_table,1);% 边数 E=zeros(nodenumber,nodenumber); transport_type_cell=cell(edgenumber,1); lb=zeros(1,edgenumber); ub=zeros(1,edgenumber); dmat=zeros(nodenumber,nodenumber); for i=1:edgenumber node1=edge_table(i,1); node2=edge_table(i,2); E(node1,node2)=1;% 邻接关系 dmat(node1,node2)=edge_table(i,3);% 距离 dmat(node2,node1)=edge_table(i,3);% 距离 mat201=edge_table(i,4:end); index20i= find(mat201>0); lb(1,i)=1; ub(1,i)=length(index20i); transport_type_cell{i,1}=index20i; end nearcell=nearfun(E,nodenumber);% 设定邻近集 N=nodenumber; % 遗传算法参数 popsize=20;% 遗传算法种群数 maxgen=50;% 遗传算法迭代次数 PM=0.05;% 变异概率 PC=0.8;% 交叉概率 %% 遗传算法主程序 %性能跟踪 tracemat_ga=zeros(maxgen,2); Chrom=genChrome(popsize,N,lb,ub);% 建立种群 Value= decodingFun(Chrom,popsize);% 解码染色体 [vmin,indexmin]=min(Value); bestChrom=Chrom(indexmin,:);% 记录最优染色体 bestValue=vmin;% 记录最优值 %% 遗传算法优化的主循环 %进度条 gen=0; tic; wait_hand = waitbar(0,'run……', 'tag', 'TMWWaitbar'); while genvmin bestChrom=Chrom(indexmin,:);% 记录最优染色体 bestValue=vmin;% 记录最优值 end tracemat_ga(gen,1)=bestValue; tracemat_ga(gen,2)=mean(Value); waitbar(gen/maxgen,wait_hand);%每循环一次更新一次进步条 end delete(wait_hand);%执行完后删除该进度条 disp('算法运行时间'); runtime_ga=toc % 显示结果 disp('遗传算法优化得到的最优目标函数值'); bestValue disp('遗传算法优化得到的最优染色体'); bestChrom figure; plot(tracemat_ga(:,1),'r-','linewidth',1); hold on; plot(tracemat_ga(:,2),'b-','linewidth',1); legend({'种群最优值','种群均值'},'fontname','宋体'); xlabel('迭代次数','fontname','宋体'); ylabel('目标函数','fontname','宋体'); title('遗传算法迭代曲线','fontname','宋体'); x=bestChrom; [y,route,C,T,midmat,egeIDmat,timeline]=myfun(x); outcell={'起点','终点','运输方式','起点到达时间','起点转运时间','起点到终点运行时间','到终点时间'}; outcell=[outcell; num2cell(timeline(:,1)),num2cell(timeline(:,2)),num2cell(timeline(:,3:end))] disp('路径') route C T title201='遗传算法优化得到的路线图'; drawnetfun102(XY,E,route,midmat,title201);
程序结果如下;
算法运行时间
runtime_ga =
1.8201103
遗传算法优化得到的最优目标函数值
bestValue =
29.9884615384615
遗传算法优化得到的最优染色体
bestChrom =
1 至 28 列
23 1 20 13 21 3 10 16 14 7 2 5 19 11 4 17 15 9 12 6 8 22 18 1 2 2 2 2
29 至 56 列
1 2 1 2 2 2 1 1 2 2 1 1 1 1 1 2 1 1 1 2 2 1 1 2 1 2 2 1
57 列
1
outcell =
'起点' '终点' '运输方式' '起点到达时间' '起点转运时间' '起点到终点运行时间' '到终点时间'
[ 1] [ 3] [ 2] [ 0] [ 0] [ 2.5] [ 2.5]
[ 3] [ 6] [ 2] [ 2.5] [ 0] [ 3.75] [ 6.25]
[ 6] [ 9] [ 2] [ 6.25] [ 0] [ 2.5] [ 8.75]
[ 9] [ 10] [ 2] [ 8.75] [ 0] [ 2.5] [ 11.25]
[ 10] [ 15] [ 3] [ 11.25] [ 0.1] [6.15384615384615] [17.5038461538462]
[ 15] [ 20] [ 2] [17.5038461538462] [ 0.1] [ 7.5] [25.1038461538462]
[ 20] [ 23] [ 2] [25.1038461538462] [ 0] [ 6.25] [31.3538461538462]
路径
route =
1 3 6 9 10 15 20 23
C =
17.7
T =
31.3538461538462
>>
还没有评论,来说两句吧...