列车运行通常有两种操纵模式:节时模式和节能模式。其中节时模式是让列车以最短时间完成运行计划(即运行最大牵引力和最大制动力),该模式下要求列车贴近限制速度运行,当速度大于限制速度值后保持匀速运行,当速度小于限制速度值后牵引,即在运行过程中达到最高的技术速度。而节能模式是让列车选择最低能耗的优化操纵方案,使得列车在保证列车安全运行、准点的前提下,以比较节能的操纵方式完成运行计划。我们以节时模式和优化后的节能模式进行对比来证明灰狼优化算法优化后的能耗指标。
对于多目标优化问题的求解,具有两种典型的思路:一种是化繁为简的求解思路,将其转化为求解单目标优化问题;一种是基于Pareto理论应用多目标优化的智能算法进行求解。
将多目标优化问题转变为单目标优化问题进行求解的核心思想是通过一定的方式将各个子目标组装起来,组成一个包含多个子目标的数学表达式,这种求解方式对于多个目标通常有主次之分。以下具体介绍了几种常用的转化方法:
线性加权法。线性加权法是求解多目标优化问题的一种经典方法。该方法将多个优化目标函数分配一个固定的权重值 w i w_i wi,通过线性加权的方式将它们组合成一个新的综合目标函数。尽管这种方法将复杂的多目标问题简化成了单一的目标函数,但是由于多目标问题中各子优化目标及其评价指标存在差异,无法对权重系数的赋值确定统一合理的标准。因此,赋值权重大多需要根据求解者的主观判断,导致方法具有太强的主观操纵性。
主函数法。另一种将多目标优化问题转化为单目标优化问题的常用方法是主目标函数法。该方法选择一个主要的优化目标,将其他优化目标作为次要目标,并将其他目标的期望值大小转化为相应的约束条件,从而对优化变量的范围进行约束。这有助于优化过程向所期望的解的方向发展。通过这种方法,可以简化多目标优化问题的求解,但需要注意主要目标的选择和其他目标的转化方式,以确保所得到的单目标问题能够准确地反映出多目标优化问题的求解要求。
惩罚函数法。惩罚函数法是一种解决含有约束条件的最优化问题的常用方法。在惩罚函数法中,选定一个目标函数作为主要优化目标,将其他目标函数构造为惩罚函数,并将其作为约束条件添加到主目标函数中。这样就可以将含有约束条件的问题转化为一个无约束优化问题。由于列车运行优化控制问题通常含有较多的约束条件,惩罚函数法可以有效地将目标函数转换为无约束优化问题,从而减轻了主观赋权带来的不确定性和复杂性,并且可以方便地进行求解。因此,惩罚函数法在列车运行优化控制问题中具有广泛的应用前景。
Pareto原理是多目标优化领域中的一种基本原理,也称为帕累托优化原理或帕累托最优解原理。其基本思想是:在多个优化目标存在的情况下,存在一组解集,其中任何一个目标函数值的改善都会导致另一个目标函数值的恶化,即不存在一种解能够同时使得所有目标函数达到最优值,而只有一些解具有“最优”的性质,这些解被称为帕累托最优解。
在多目标优化问题中,帕累托最优解具有以下两个特点:
非劣性:即帕累托最优解是在所有可行解中非劣的,不能被其他解支配。
多样性:即帕累托最优解集中的每一个解在目标函数值上都是独立的,没有一组解在所有目标函数上都优于其他解。
基于Pareto原理的求解方法被称为Pareto最优解求解方法,其主要目的是寻找一组非劣解,这些非劣解组成了帕累托最优解集合。通过Pareto最优解求解方法,我们可以在多目标优化问题中获得一些重要信息,比如理解目标之间的权衡,边界情况和最优解的多样性等。这对于决策制定和问题解决都有重要的指导意义。
列车运行的过程中,司机的操纵简单说来就是在相应的位置对操纵工况进行调整。典型的列车操纵策略主要有节时操纵策略、节能操纵策略和混合操纵策略。针对列车不同的运行要求,应采用不同的操纵策略。无论采用哪种操纵策略,列车在启动加速阶段采用最大牵引力进行牵引加速,达到限速后,中间阶段根据运行要求采用合适的操纵策略。如果已知了列车运行过程中的操纵工况转换序列,以及相应的工况转换点位置,则列车运行曲线能够唯一确定。
工况转化序列可用如下公式描述:
P = ( p 0 , p 1 , p 2 , . . . , p i , . . . , p m ) \begin{align} P =& (p_0,p_1,p_2,...,p_i,...,p_m) \tag{3}\\ \end{align} P=(p0,p1,p2,...,pi,...,pm)(3)式(3)中, P P P为牵引、巡航、惰行和制动工况组成的工况转换序列,需满足工况转换约束。
基于工况序列表的列车列车节能操纵可描述为:预先给定列车运行过程中的操纵工况序列,将节能优化问题的解表示为求这些转换点的位置,即求解式(4)中的 X X X。
X = ( x 0 , x 1 , x 2 , . . . , x i , . . . , x m ) \begin{align} X=& (x_0,x_1,x_2,...,x_i,...,x_m) \tag{4}\\ \end{align} X=(x0,x1,x2,...,xi,...,xm)(4)式(4)中, x i x_i xi为工况切换点位置,且满足 0 = x 0 < x 1 < x 2 . . . < x i < . . . < x m < S 0=x_0
列车实际运行时,其工况转换次数是不定的,可采取若干个工况转换序列进行操纵。为提高节能操纵优化问题解的多样性,可预先给定多种操纵工况序列,比较各工况序列下的节能效果。假设现在操纵优化问题有两个合理的工况转换序列:
工况序列一: P 1 = ( p 0 , p 1 , p 2 , p 3 , p 4 , p 5 , p 6 , p 7 ) = ( 牵引 , 巡航 , 惰行 , 牵引 , 巡航 , 惰行 , 制动 ) P_1=(p_0,p_1,p_2,p_3,p_4,p_5,p_6,p_7)=(牵引,巡航,惰行,牵引,巡航,惰行,制动) P1=(p0,p1,p2,p3,p4,p5,p6,p7)=(牵引,巡航,惰行,牵引,巡航,惰行,制动)工况序列二: P 2 = ( p 0 , p 1 , p 2 , p 3 , p 4 , p 5 , p 6 , p 7 ) = ( 牵引 , 惰行 , 牵引 , 惰行 , 牵引 , 惰行 , 制动 ) P_2=(p_0,p_1,p_2,p_3,p_4,p_5,p_6,p_7)=(牵引,惰行,牵引,惰行,牵引,惰行,制动) P2=(p0,p1,p2,p3,p4,p5,p6,p7)=(牵引,惰行,牵引,惰行,牵引,惰行,制动)因此,仿真实验时则需分别求解其对应的工况转换点,比较两者得到节能操纵优化问题的最优解。实际应用时,工况序列可根据具体线路情况结合操纵经验预先给定。
以某实际线路为仿真线路,HXD1型电力机车牵引50节C80货车为仿真对象。货运列车基本属性如表1所示。
表1 货运列车的基本参数
参数 | 取值 |
---|---|
列车编组 | 1机车+50货车 |
机车质量 | 200 ( t ) 200(t) 200(t) |
机车长度 | 35.22 ( m ) 35.22(m) 35.22(m) |
机车单位基本阻力 | 1.2 + 0.0065 v + 0.000279 v 2 ( N / t ) 1.2+0.0065v+0.000279v^2(N/t) 1.2+0.0065v+0.000279v2(N/t) |
货车质量 | 80 ( t ) 80(t) 80(t) |
机车长度 | 12 ( m ) 12(m) 12(m) |
货车单位基本阻力 | 0.92 + 0.0048 v + 0.000125 v 2 ( N / t ) 0.92+0.0048v+0.000125v^2(N/t) 0.92+0.0048v+0.000125v2(N/t) |
function f= TractionForce(vel)
% 根据牵引曲线计算列车牵引力大小
% 输入速度单位为m/s
f=0;
u=vel*3.6; %单位换算
if u<5
f=760;
elseif u<65
f=779-3.8*u;
elseif u<100
f=34560/u;
end
end
function f= BrakingForce(vel)
% 根据制动曲线计算列车制动力大小
% 输入速度单位为m/s
f=0;
u=vel*3.6; %单位换算
if u<3
f=153.3*u ;
elseif u<=75
f=461;
elseif u<=100
f=34560/u;
end
end
function f = TotalResistance(vel,pos)
% 计算列车运行时所受到的总阻力
global RampArray;
global CurveArray;
global TrainLength;
global LocomotiveWeight TruckWeight TrainWeight;
%%
% tailStock=pos-TrainLength;
% bodyStock=pos-TRAINWGH/2;
% L=TrainLength;
u=vel*3.6;
%%
w0=1.2+0.0065*u+0.000279*u*u; %机车
w1=0.92+0.0048*u+0.000125*u*u; %C80货车
f1=w0*LocomotiveWeight*9.8/1000; %机车基本阻力
f2=w1*TruckWeight*9.8/1000;%货车基本阻力
f=0;
RampResistance=0;
CurveResistance=0;
n = size(RampArray, 2);
m = size(CurveArray, 2);
i=1;
j=1;
%% 列车坡道附加阻力计算公式,采用单质点模型
while (i<n)
if((pos>=RampArray(1,i)) && (pos<RampArray(1,i+1)))
wi = RampArray(2, i);
RampResistance =wi*TrainWeight*9.8/1000;
break;
end
i = i + 1;
end
%% 列车曲线附加阻力计算公式
while (j<m)
if pos>=CurveArray(1,j) && pos<CurveArray(1,j+1)
if 0==CurveArray(2,j)
wr=0;
CurveResistance =wr*TrainWeight*9.8/1000;
break;
else
wr=600/CurveArray(2,j);
CurveResistance =wr*TrainWeight*9.8/1000;
break;
end
end
j = j + 1;
end
%% 列车所受的总阻力
f=f1+f2+RampResistance+CurveResistance;
end
function fitness = CalculateFitness(Energy,Time)
% 计算适应度函数
% 定义全局变量
global Tmin;
% global Emax;
global Emin;
%% 适应度计算应该归一化
% 设置线性权重,包括能耗权重w1和时间权重w2
w1=0.5;
w2=0.5;
%% 分目标适应度值
f1=(abs(Energy-Emin))/Emin;
f2=(abs(Time-Tmin))/Tmin;
%% 适应度函数
fitness=w1*f1+w2*f2;
end
function [bestFitnessPos,bestFitness,newPop,IterCurve]=GWO_main(option)
%灰狼化算法的主函数
global switchNumber;
global popSize iterNumber;
global upLimit lowLimit;
%灰狼优化算法参数
popSize=option.PopulationSize; %种群数量
iterNumber=option.MaxGenerations; %迭代次数
%% 产生初始种群
Population= InitializePopulation(popSize,switchNumber); %生成种群
%% 计算适应度值
for i=1:popSize
[~,Energy,Time,~]=ModelConstraint(Population(i,:),2);
fitness(i)=CalculateFitness(Energy,Time);
end
%% 对适应度排序,找到Alpha,Beta,Delta狼
%寻找适应度最小的位置
[SortFitness,indexSort] = sort(fitness);
%记录适应度值和位置
Alpha_pos = Population(indexSort(1),:);
Alpha_score = SortFitness(1);
Beta_pos = Population(indexSort(2),:);
Beta_score = SortFitness(2);
Delta_pos = Population(indexSort(3),:);
Delta_score = SortFitness(3);
gBest = Alpha_pos;
gBestFitness = Alpha_score;
%% 开始迭代
for iter=1:iterNumber
%% 把种群赋给旧种群
oldPopulation=Population;
a=2-iter*((2)/iterNumber);
%% 对个体进行评估
for i=1:popSize
for j=1:switchNumber
%% 根据Alpha狼更新位置
r1=rand(); % [0,1]随机数
r2=rand(); % [0,1]随机数
A1=2*a*r1-a; % 计算A1
C1=2*r2; % 计算C1
D_alpha=abs(C1*Alpha_pos(j)-Population(i,j)); % 计算距离Alpha的距离
X1=Alpha_pos(j)-A1*D_alpha; %位置更新
%% 根据Beta狼更新位置
r1=rand();%[0,1]随机数
r2=rand();%[0,1]随机数
A2=2*a*r1-a;% 计算A2
C2=2*r2; % 计算C2
D_beta=abs(C2*Beta_pos(j)-Population(i,j)); % 计算距离Beta的距离
X2=Beta_pos(j)-A2*D_beta; %位置更新
%% 根据Delta狼更新位置
r1=rand();%[0,1]随机数
r2=rand();%[0,1]随机数
A3=2*a*r1-a; % 计算A3
C3=2*r2; % 计算C3
D_delta=abs(C3*Delta_pos(j)-Population(i,j)); % 计算距离Delta的距离
X3=Delta_pos(j)-A3*D_delta; %位置更新
%更新位置
Population(i,j)=(X1+X2+X3)/3;
end
%% 边界检查
Population(i,:) = BoundaryCheck(Population(i,:),upLimit,lowLimit,switchNumber);
end
%% 判断个体是否符合约束条件
for i=1:popSize
[flag,Energy,Time,~]=ModelConstraint(Population(i,:),2);
if flag~= 0
Population(i,:)=lowLimit + (upLimit -lowLimit).*rand(1,switchNumber);
%再次测试
[flag,Energy,Time,~]=ModelConstraint(Population(i,:),2);
while flag~= 0
Population(i,:)=lowLimit + (upLimit -lowLimit).*rand(1,switchNumber);
[flag,Energy,Time,~]=ModelConstraint(Population(i,:),2);
end
end
fitness(i)=CalculateFitness(Energy,Time);
end
%% 合并新旧种群,取种群数量大小
newPopulation = [oldPopulation; Population];
% 计算适应度值
newfitness = zeros(size(newPopulation, 1), 1);
for i = 1:size(newPopulation, 1)
[~,Energy,Time,~] = ModelConstraint(newPopulation(i,:), 2);
newfitness(i) = CalculateFitness(Energy, Time);
end
% 排序并选择前setNum个个体
[~, sortIndex] = sort(newfitness, 'ascend');
newPopulation = newPopulation(sortIndex(1:popSize), :);
% 更新种群和适应度值
Population = newPopulation;
fitness = newfitness(sortIndex(1:popSize));
%% 更新适应度值
for i=1:size(Population,1)
% 更新 Alpha, Beta, Delta狼
if fitness(i)<Alpha_score
Alpha_score= fitness(i); % 更新alpha狼
Alpha_pos=Population(i,:);
end
if fitness(i)>Alpha_score && fitness(i)<Beta_score
Beta_score= fitness(i); % 更新beta狼
Beta_pos=Population(i,:);
end
if fitness(i)>Alpha_score && fitness(i)>Beta_score && fitness(i)<Delta_score
Delta_score= fitness(i); %更新delta狼
Delta_pos=Population(i,:);
end
end
%%
gBest = Alpha_pos;
gBestFitness = Alpha_score;
IterCurve(iter) = gBestFitness;
%% 显示迭代次数
disp(['第',num2str(iter),'次迭代']);
end
bestFitnessPos=gBest;
bestFitness=gBestFitness;
newPop=Population;
end
[1] Mirjalili, Seyedali, Seyed Mohammad Mirjalili, and Andrew Lewis. “Grey wolf optimizer.” Advances in engineering software 69 (2014): 46-61.
[2] 杨彦强,刘海东,麻存瑞,徐靓.列车节能运行目标速度控制优化研究[J].交通运输系统工程与信息,2019,19(01):138-144.
[3] 张惠茹,贾利民,王莉.基于Pareto多目标优化的高速铁路列车节能驾驶曲线集生成[J].铁道学报,2021,43(03):85-91.
[4] 褚心童. 基于蚁群算法的城轨多列车节能运行优化研究[D].西南交通大学,2021.
[5] 杨杰. 货运列车节能运行优化与智能控制方法[D].北京交通大学,2017.
[6] 林轩. 货运电力机车节能优化操纵策略研究[D].西南交通大学,2018.