|
工程优化问题可以分为连续性和离散型两类,如果直接采用遗传算法对它们进行求解,可以直接使用matlab工具箱的多目标和单目标GA工具箱,求解的核心在于设计问题的编码结构和编写目标函数,以多目标问题为例,主程序核心代码如下:
options = gaoptimset('ParetoFraction',0.35,'CreationFcn',@myCreationFcn,'EliteCount',PopulationSize/2, 'PopulationSize', PopulationSize,'Generations', 200,'PlotFcn',@gaplotpareto);
[x,Fval,exitFlag,Output] = gamultiobj(@GA_fun, 2*numberofFlights, [], [], [], [], ...
lb, ub, [], options);
其中:options 设置算法参数,包括种群规模,画图方式等,如果需要自定义初始种群、交叉和变异算子,可以编写相关函数,并引用;gamultiobj主函数,调用目标函数,设置每个的变量上下界 lb和ub。
染色体编码决定每个的变量上下界 lb和ub,以车辆路径问题为例,如果10个客户分配给两辆车,一种编码结构1 1 1 1 1 2 2 2 2 2,表示客户1-5被分配给车辆1,客户6-10被分配给车辆2,其中车辆执行顺序可以由最短路算法获取,在解码函数中嵌入算法。
此外,gamultiobj仅支持连续问题,若是整数优化问题,可以取整处理。对于带约束问题,可以采用惩罚函数。
以车辆路径问题为例给出部分代码
-------------------------------------------------------------------------------------------------
PopulationSize=1000;
MaxCapicity=12;
StartTime=0; %1小时内的车辆调度
Costomers=[];%人数,客户点起讫时间窗,最大在车时间等
NumberOfCostomers=size(Costomers,2);
NumberOfRoutes=0;
NumberOfDepots=0;
[Distance,Speed]=GetDistanceandSpeed(NumberOfCostomers,NumberOfDepots);
lb = repmat(1,1,NumberOfCostomers );
ub = repmat(NumberOfRoutes , 1,NumberOfCostomers );
lb =[lb , repmat(1,1,NumberOfRoutes )];
ub = [ub, repmat(NumberOfDepots , 1,NumberOfRoutes )];
lb =[lb , repmat(0,1,NumberOfRoutes )];
ub = [ub, repmat(60 , 1,NumberOfRoutes )];
-------------------------------------------------------------------------------------------------
options = gaoptimset('stallGenLimit',200,'TolFun',1e-10,'ParetoFraction',0.3,'EliteCount',0.05*PopulationSize,'CrossoverFraction',0.8, 'PopulationSize', PopulationSize,'Generations', 5000,'PlotFcn',@gaplotpareto);
[x,Fval,exitFlag,Output] = gamultiobj(@GA_fun, NumberOfCostomers+2*NumberOfRoutes, [], [], [], [], ...
lb, ub, [], options);
-------------------------------------------------------------------------------------------------
function Fitness = GA_fun(chrom)
%UNTITLED 此处显示有关此函数的摘要
% 此处显示详细说明
busTask=zeros(NumberOfRoutes,51);
for eachtrip=1:NumberOfCostomers
%提取不同飞机跑道的起飞降落航班分配
eachbus=round(chrom(eachtrip));
busTask(eachbus,51)= busTask(eachbus,51)+1;
busTask(eachbus,busTask(eachbus,51))=eachtrip;
routeCapicity(eachbus)=routeCapicity(eachbus)+Costomers(1,eachtrip);
end
%各个班次在跑道的排序
for eachbus=1:NumberOfRoutes
if busTask(eachbus,51)>0&& busTask(eachbus,51)< NumberOfCostomers/(NumberOfRoutes-2)
routeSet=Dijkstra(NumberOfCostomers+NumberOfDepots+1,Distance,busTask(eachbus,1:busTask(eachbus,51)),startPoint,endPoint);
route=GetRoute(busTask(eachbus,1:busTask(eachbus,51)),routeSet,startPoint);
end
中国民航大学空中交通管理学院 魏明 mingtian911@163.com
中国民航大学空管学院魏明的学术名片
http://blog.sciencenet.cn/u/mingtian911
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-9-27 09:31
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社