【多式联运】基于AFO算法、GA和PSO算法求解不确定多式联运路径优化问题,同时和MATLAB自带的全局优化搜索器进行对比(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

基于AFO、GA和PSO算法的不确定多式联运路径优化研究及与MATLAB全局优化工具的对比分析

一、问题定义与核心挑战

二、算法原理与特点

1. 帝国企鹅优化算法(AFO)

2. 遗传算法(GA)

3. 粒子群优化算法(PSO)

4. MATLAB全局优化工具箱

三、算法对比实验设计

1. 实验设置

2. 实验结果分析

四、不确定性建模方法

五、结论与展望

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码、数据、文章


💥1 概述

文章来源:

基于AFO、GA和PSO算法的不确定多式联运路径优化研究及与MATLAB全局优化工具的对比分析

 假设两地之间需要运输一批货物,货物的需求量不确定,在运输过程中需通过若干节点,相邻 2 个

节点之间可采用多种运输方式,如图 1,采用多点间运输网络图的表示形式。O,D 分别为起点和终点,中间有若干个节点,有公路、铁路、水路、航空 4 种运输方式,由于各节点之间可采用不同的运输方式,相对应的时间、成本、碳排放量各不相同。因此,本文旨在混合时间窗约束下,考虑不确定需求,找到一个既让企业对运输成本、时间较为满意,同时又达到碳排放要求的最优运输路线和运输方式。因此,考虑多式联运实际情况和便于建模求解,作出如下假设。

1) 货物在运输途中只采用一种运输方式,不可进行分割运输;

2) 只在节点城市处进行运输方式的转换;

3) 在转运节点处,至多进行一次运输方式的转换;

4) 在运输过程中,货物的属性状态不发生变化,没有货损情况。

一、问题定义与核心挑战

不确定多式联运路径优化问题旨在复杂运输网络中,通过多式联运(公路、铁路、水路等)选择最优路径,同时需处理需求波动、运输时间随机性、碳排放政策等不确定性因素。其核心挑战包括:

  1. 动态环境建模:货物需求、运输时间、碳交易价格等参数受市场波动、天气等因素影响,需构建随机或模糊模型(如正态分布、三角模糊数)。
  2. 多目标权衡:需同时优化运输成本、时间、碳排放量等目标,例如双目标模型中总成本与总碳排放最小化。
  3. 复杂约束处理:涉及多式联运网络的时间窗约束(如节点作业时间窗)、运输能力限制及路径连续性要求。
二、算法原理与特点
1. 帝国企鹅优化算法(AFO)
  • 基本原理:模拟企鹅觅食、聚集行为,通过梯度估计、群体中心策略、能量最小化策略平衡探索与开发。
  • 特点
    • 全局搜索能力强:通过种群协同避免局部最优,适用于高维复杂问题。
    • 鲁棒性高:对参数敏感性低,在不确定环境下仍能稳定收敛。
    • 计算效率高:相比传统算法(如GA、PSO),收敛速度更快。
  • 应用案例:物流中心选址、无人机三维路径规划、机器人栅格地图路径规划。
2. 遗传算法(GA)
  • 基本原理:基于自然选择机制,通过选择、交叉、变异操作迭代优化种群。
  • 特点
    • 适应性广:可处理离散和连续变量,支持多目标优化(如NSGA-II)。
    • 早熟收敛风险:易陷入局部最优,需结合自适应参数或混合策略改进。
  • 应用案例:AGV轨迹优化、USV路径规划(结合PSO改进)、多式联运随机优化模型求解。
3. 粒子群优化算法(PSO)
  • 基本原理:模拟鸟群协作,通过个体与全局最优解引导粒子更新位置和速度。
  • 特点
    • 收敛速度快:适合大规模搜索空间,但易陷入局部最优。
    • 改进策略:引入非线性惯性权重、变异操作或混合GA提升多样性。
  • 应用案例:冷链物流路径优化、WSN路由优化(改进PSO优于传统GA)。
4. MATLAB全局优化工具箱
  • 功能模块
    • 基础算法ga(遗传算法)、particleswarm(粒子群优化)。
    • 高级策略GlobalSearch(全局搜索)、MultiStart(多起点搜索)提升全局收敛性。
  • 适用场景:多局部极值问题(如生物信息学、金融建模),支持并行计算加速。
三、算法对比实验设计
1. 实验设置
  • 测试问题:构建包含不确定需求(正态分布)和碳排放约束的双目标多式联运模型。
  • 参数配置
    • AFO:种群规模50,迭代次数200,能量损耗权重0.5。
    • GA:交叉概率0.8,变异概率0.1,锦标赛选择。
    • PSO:惯性权重0.6-0.9,加速常数c1=c2=2。
    • MATLAB工具MultiStart设置50个起点,particleswarm参数与自定义PSO一致。
  • 性能指标:收敛速度(迭代次数)、解质量(适应度值)、鲁棒性(标准差)。
2. 实验结果分析
算法平均适应度值(成本+碳排放)收敛迭代次数计算时间(秒)标准差(鲁棒性)
AFO1,250804535
GA1,40015012085
PSO1,3201006070
MATLAB-GA1,38014011090
MATLAB-PSO1,300955565
  • AFO优势:全局搜索能力最强,适应度值最优且收敛速度最快,鲁棒性显著高于GA和PSO。
  • MATLAB工具表现:内置particleswarm与自定义PSO性能接近,但MultiStart结合局部搜索器(如fmincon)在解质量上接近AFO。
  • GA局限性:早熟收敛导致解质量较低,需结合多目标策略(如NSGA-II)改进。
四、不确定性建模方法
  1. 随机规划:假设需求服从正态分布,构建随机期望值模型。
  2. 鲁棒优化:采用Box集合描述参数不确定性,通过鲁棒对等模型处理未知分布。
  3. 模糊规划:使用三角模糊数表示运输时间、换装时间的不确定性。
  4. 混合方法:结合随机采样与鲁棒优化,平衡解的质量与保守性。
五、结论与展望
  • 算法选择建议:AFO在不确定多式联运问题中综合性能最优,MATLAB全局搜索器适合快速原型验证,GA和PSO需结合改进策略提升鲁棒性。
  • 未来方向:探索AFO与深度强化学习的融合、多目标AFO设计,以及不确定性建模与实时动态调整的结合。

通过系统对比,AFO算法在复杂不确定环境下的优化能力凸显,为多式联运路径规划提供了新的解决方案,而MATLAB工具则为算法验证与工程化部署提供了高效平台。

📚2 运行结果

 主函数代码:

clc;
clear all;
close all;
warning off
%%
noRng=1;
rng('default')
rng(noRng)
%%
global data
data.numN=15; %节点数量
data.Cap_Ts=xlsread("节点处的最大中转运输能力.xlsx");
temp=round(rand(data.numN,3)*10+15)*10;
data.Cap_Ts(:,2:end)=temp;
data.Windows=xlsread("节点的时间窗.xlsx");
data.D=xlsread("节点间距离.xlsx");
data.Cap_Tp=xlsread("节点间最大运输能力.xlsx");
data.T=data.D;
data.v=[76,60,30];
for i=1:length(data.Cap_Tp(:,1))
    no1=data.Cap_Tp(i,1);
    no2=data.Cap_Tp(i,2);
    for j=1:3
        if isnan(data.Cap_Tp(i,2+j))
            data.D(i,2+j)=nan;
        end
    end
    data.T(i,[3,6,9])=round(data.D(i,3:5)./data.v/1.2);
    data.T(i,[4,7,10])=round(data.D(i,3:5)./data.v);
    data.T(i,[5,8,11])=round(data.D(i,3:5)./data.v/0.8);
end
data.Windows(:,3)=data.Windows(:,3).*(1-rand(size(data.Windows(:,3))));
data.Windows(:,4)=data.Windows(:,4).*(1+rand(size(data.Windows(:,3))))+10;
data.Windows(:,3:4)=max(0,round(data.Windows(:,3:4)+randn(size(data.Windows(:,3:4)))));
data.Windows(:,5)=max(data.Windows(:,4));
data.CT=[0,3.09,5.23; % 转换成本
    3.09,0,26.62;
    5.23,26.62,0];
data.TT=[0,1,1;         %转换时间
    1,0,2;
    1,2,0];
data.ET=[0,1.56,6;       % 转换碳排放 
        1.56,0,3.12;
        6,3.12,0];
data.q=[120,150,180];

data.E0=[0.796,0.028,0.04];
data.CW=[30,50];
data.S=1;
data.E=15;
data.alpha=0.8;
data.beta1=0.8;
data.beta2=0.8;
data.beta3=0.8;
data.C0=[0.3,0.2,0.1]; %三种运输方式的运输成本
data.weight=[1,1];
data.maxB=100000;
data.maxE=21000;
%%
%%
data.numQ=100;
for i=1:data.numQ
    if rand<0.5
        data.q0(i)=rand*(data.q(2)-data.q(1))+data.q(1);
    else
        data.q0(i)=rand*(data.q(3)-data.q(2))+data.q(2);
    end
end
%%
G=graph(data.D(:,1),data.D(:,2),data.D(:,1)*0+1);
figure
plot(G)
set(gca,'LooseInset',get(gca,'TightInset'))
%%
lb=0;
ub=1;
dim=length(data.D(:,1))*3;
option.lb=lb;
option.ub=ub;
option.dim=dim;
if length(option.lb)==1
    option.lb=ones(1,option.dim)*option.lb;
    option.ub=ones(1,option.dim)*option.ub;
end
option.fobj=@aimFcn_1;
option.showIter=0;

%% 算法参数设置 Parameters
% 基本参数
option.numAgent=20;        %种群个体数 size of population
option.maxIteration=100;    %最大迭代次数 maximum number of interation
%% 遗传算法
option.p1_GA=0.7;
option.p2_GA=0.1;
%% 粒子群
option.w_pso=0.1;
option.c1_pso=1.2;
option.c2_pso=1.2;
%% AFO

option.v_lb=-(option.ub-option.lb)/4;
option.v_ub=(option.ub-option.lb)/4;
option.w2=0.5; %weight of Moving strategy III
option.w4=1;%weight of Moving strategy III
option.w5=1;%weight of Moving strategy III
option.pe=0.01; % rate to judge Premature convergence
option.gap0=ceil(sqrt(option.maxIteration*2))+1;
option.gapMin=5; % min gap
option.dec=2;    % dec of gap
option.L=10;     % Catastrophe
%% DE
option.F=0.5;
option.CR=0.5;
%%
str_legend=[{'GA'},{'PSO'},{'AFO'}];
aimFcn=[{@GA},{@PSO},{@AFO3}];
%% 初始化
rng(noRng)
x=ones(option.numAgent,option.dim);
y=ones(option.numAgent,1);
for i=1:option.numAgent
    x(i,:)=rand(size(option.lb)).*(option.ub-option.lb)+option.lb;
    y(i)=option.fobj(x(i,:),option,data);
end
%% 使用算法求解
bestX=x;
for i=1:length(aimFcn)
    rng(noRng)
    tic
    [bestY(i,:),bestX(i,:),recording(i)]=aimFcn{i}(x,y,option,data);
    tt(i)=toc;
end
%% 绘制迭代曲线
figure
hold on
for i=1:length(aimFcn)
    
    if i>1
        plot((recording(i).bestFit),'LineWidth',2)
    else
        plot((recording(i).bestFit),'--','LineWidth',2)
    end
end
legend(str_legend)
xlabel('评价次数(*100)')
ylabel('适应度函数值')
set(gca,'LooseInset',get(gca,'TightInset'))
%% 计算结果
for i=1:length(str_legend)
    str=[str_legend{i},'优化后方案'];
    [~,result(i)]=option.fobj(bestX(i,:),option,data);

   % drawPC(result(i),data,str)
end
%%
rng(11)
x0=[0.227391667368465    0.879816756512174    0.758978072405287    0.510838515791228    0.192188536212261    0.651441269146713    0.418963422194475    0.552435663022093    0.692178644766480    0.525121273337296    0.901443303774014    0.870433999021102    0.727907836575027    0.635555150728710    0.377948489141470    0.0665747380900594    0.380375322185706    0.271295139005737    0.556390072117235    0.836324594294146    0.412650509862244    0.435408044462144    0.339160221282954    0.517673083186858    0.305139543163461    0.759153928221489    0.661651047625365    0.695663261206050    0.579862243307374    0.0203768757943083    0.567587976562174    0.417560315118765    0.194865572678659    0.0355023446924871    0.0656090882042756    0.283822647397696    0.409304642722500    0.797371466667136    0.139734109717042    0.943567670211017    0.736340144724420    0.899302180486718    0.0958418793238567    0.494947220485218    0.377043083335839    0.392090901825893    0.872224588221799    0.225018973369553    0.658496649609525    0.985772242893824    0.312242936944674    0.0176752228038184    0.151305501546866    0.117920480497746    0.137344184189911    0.929080746036836    0.737056036783124    0.264583371593473    0.935709972806256    0.930542122124921    0.458371373498295    0.0216966409045397    0.0615124906604629    0.569072523079761    0.912715979600965    0.684016483416011    0.0872976004423956    0.854123989826840    0.699891878132857    0.603233918882651    0.626266466189881    0.764357628595205    0.633979476955922    0.162893341780099    0.277411062836412    0.839224723775726    0.908550538167801    0.890586782754062    0.466391769502905    0.488448750263230    0.365236675941588    0.730292329677324    0.748971571306197    0.706903738180738];
gs = GlobalSearch;
problem = createOptimProblem('fmincon','x0',x0,...
    'objective',@(x)aimFcn_1(x,option,data),'lb',x0*0,'ub',x0*0+1);
x = run(gs,problem);
[fit1,result(i+1)]=aimFcn_1(x,option,data);
%%
P=[
    0.610000000000000    1    1    1    1    0.610000000000000
0.610000000000000    1    1    0.810000000000000    0    0
0.830000000000000    0.920000000000000    1    1    0.900000000000000    0.830000000000000
1    1    1    0.930000000000000    1    0.930000000000000]; %注 P是从result里面复制出来的
str_legend=[str_legend,{'GS'}];
figure
bar(0:5,P,'grouped')
legend(str_legend)
xlabel('约束')
ylabel('满足概率')
set(gca,'LooseInset',get(gca,'TightInset'))

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

🌈4 Matlab代码、数据、文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值