mingtian911的个人博客分享 http://blog.sciencenet.cn/u/mingtian911

博文

如何应用matlab遗传算法直接求解工程优化问题

已有 2287 次阅读 2020-2-28 13:02 |系统分类:科研笔记

工程优化问题可以分为连续性和离散型两类,如果直接采用遗传算法对它们进行求解,可以直接使用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




https://blog.sciencenet.cn/blog-3419274-1220845.html

上一篇:论应用学科的学术论文和工程实践之间关系,如何做好科研,个人的简单粗略认识
下一篇:进离场航班的调度与排序问题
收藏 IP: 118.28.81.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (1 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-17 03:53

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部