100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 【优化调度】基于matlab遗传算法求解码头泊位分配调度优化问题【含Matlab源码 247期】

【优化调度】基于matlab遗传算法求解码头泊位分配调度优化问题【含Matlab源码 247期】

时间:2024-04-09 13:41:46

相关推荐

【优化调度】基于matlab遗传算法求解码头泊位分配调度优化问题【含Matlab源码 247期】

一、遗传算法简介

1 引言

2 遗传算法理论

2.1 遗传算法的生物学基础

2.2 遗传算法的理论基础

2.3 遗传算法的基本概念

2.4 标准的遗传算法

2.5 遗传算法的特点

2.6 遗传算法的改进方向

3 遗传算法流程

4 关键参数说明

二、部分源代码

%Name:Berth Allocation.mclearclcclose all%% 遗传参数popsize=100; %群体大小MAXGEN=50; %最大遗传代数vesselNum=7; %船舶数量berthNum=2; %泊位数量chromlength=8; %染色体长度Pc=0.6; %交叉概率Pm=0.001;%变异概率GGAP=0.9;%选择概率%% 初始化种群pop=initGroup(popsize,chromlength,vesselNum,berthNum); %随机产生初始群体%% 输出随机解的泊位调度方案和船舶在港总时间disp('初始种群中的泊位调度方案:')OutputPath(pop); %画出路径函数disp('初始随机解的船舶在港总时间:')objvalue=calobjvalue(pop,popsize,vesselNum,berthNum); disp(objvalue(1))disp('-------------------------------------------------------------')%% 优化gen=0;figure;hold on;box on %display the boundary of the current axes.xlim([0,MAXGEN])%x在坐标轴的范围title('优化过程')xlabel('迭代次数')ylabel('船舶在港时间每次迭代的最优解')objvalue=calobjvalue(pop,popsize,vesselNum,berthNum);%计算目标函数值preobjvalue=min(objvalue);while gen<MAXGEN%% 计算适应度objvalue=calobjvalue(pop,popsize,vesselNum,berthNum);%计算目标函数值line([gen-1,gen],[preobjvalue,min(objvalue)]);pause(0.0001) %line([X1 X2],[Y1 Y2],S); %点A(X1,Y1)和点B(X2 Y2)之间画一条直线,S为其它属性(颜色,线的粗细等)preobjvalue=min(objvalue);fitvalue=fitness(objvalue,popsize); %计算适应度函数%% 选择newpop=Selection(pop,fitvalue,GGAP);pop1=newpop;%pop1为选择过后的种群%% 交叉[newpop]=Crossover(pop1,Pc);pop2=newpop;%pop2为交叉后的种群%% 变异[newpop]=Mutate(pop2,Pm);%% 重插入子代pop=Reins(pop,newpop,objvalue);gen=gen+1;end[minobjvalue,minIndex]=min(objvalue); %[Y,U]=min(A):返回行向量Y和U,Y向量记录A的每列的最小值,U向量记录每列最小值的行号minpop=pop(minIndex,:);%% 输出最优解的泊位调度方案和船舶在港总时间disp('最优解的泊位调度方案:')OutputPath(minpop);disp('最优解的船舶在港总时间:')disp(min(objvalue));disp('-------------------------------------------------------------')%Name:calobjvalue.m%% 计算目标函数值%输入变量:%pop:初始种群%popsize:种群大小(规模)%vesselNum:船舶数量%berthNum:泊位数量%输出变量:function objvalue=calobjvalue(pop,popsize,vesselNum,berthNum)objvalue=zeros(popsize,1);for k=1:popsizechromsome=pop(k,:);%染色体shipInfo=zeros(vesselNum+berthNum-1,5);%把染色体中各条船的编号存入shipInfo矩阵第一列中i=1;while i<=length (chromsome)shipInfo(i,1)=chromsome(i);i=i+1;end%% 读取船舶到港信息存入matrix矩阵-load ship%第一列是船舶编号,第二列到港时间,第三列装卸箱时间ship=[1 0 122 4 103 6 34 9 85 11 56 18 127 19 4]; matrix=ship(1:vesselNum,1:3);%shipInfo矩阵第一列存放船舶编号(含分隔符0),%第二列存放该船等待时间,第三列存放该船作业前的泊位空闲时间,%第四列存放该船离港时间,第五列存放该船在港时间,i=1;j=1;berthNo=1;while i<=length(chromsome)%按调度顺序计算泊位上第一条船的相关信息,先取船号,如果遇到分隔符0,则直接看下一个符号,同时前一条船的相关信息清零vesselNo=shipInfo(i,1);if vesselNo==0j=0;berthNo=berthNo+1;else%船舶号实际存在时才执行查找及后续操作,从matrix中查找vesselNo,以便提取出该船到港时间,装卸作业时间m=find(matrix(:,1)==vesselNo);arrivetime=matrix(m,2);%船舶到港时间loadtime=matrix(m,3); %船舶装卸箱作业时间%计算该船的等待时间,作业前泊位空闲时间,离港时间,在港时间if j==1shipInfo(i,2)=0; %等待时间(作业前等待的时间)shipInfo(i,3)=arrivetime-0; %作业前泊位空闲时间shipInfo(i,4)=arrivetime+loadtime; %离港时刻shipInfo(i,5)=loadtime; %在港时间elseif arrivetime<shipInfo(i-1,4)%该船到港时刻>前一条船的离港时刻shipInfo(i,2)=0;shipInfo(i,3)=arrivetime-shipInfo(i-1,4);shipInfo(i,4)=arrivetime+loadtime;shipInfo(i,5) =loadtime;endendendi=i+1;j=j+1;endend%Name:Crossover.m%% 交叉操作(两点交叉)% 输入%pop1 被选择的个体%Pc交叉概率%输出:% newpop 交叉后的个体function [newpop]=Crossover(pop1,Pc)Npop1=size(pop1,1); newpop=pop1;for i=1:2:Npop1- mod(Npop1,2)if Pc>=rand %交叉概率Pc[newpop(i,:),newpop(i+1,:)]=intercross(pop1(i,:),pop1(i+1,:));endend%% 交叉算法采用部分匹配交叉%输入:%a和b为两个待交叉的个体%输出:%a和b为交叉后得到的两个个体function [a,b]=intercross(a,b)L=length(a);r1=randsrc(1,1,[1:L]); %Generate random matrix using prescribed alphabet.r2=randsrc(1,1,[1:L]);%OUT = RANDSRC(M,N,ALPHABET) generates an M-by-N random matrix, using the alphabet specified in ALPHABET.if r1~=r2a0=a;b0=b;s=min([r1,r2]);e=max([r1,r2]);for i=s:ea1=a;b1=b;a(i)=b0(i);b(i)=a0(i);x=find(a==a(i));y=find(b==b(i));i1=x(x~=i);i2=y(y~=i);if ~isempty(i1)a(i1)=a1(i);endif ~isempty(i2)b(i2)=b1(i);endendend%% sus(随机通用采样(Stochastic Universal Sampling))% 输入:%fitvalue 个体的适应度值%NSel 被选择个体的数目% 输出:%NewChrIx 被选择个体的索引号function NewChrIx = Sus(fitvalue,NSel) %NewChr 被选择的个体 Ix(Index)索引号[Nind,ans] = size(fitvalue);cumfit = cumsum(fitvalue); %cumsum函数:Cumulative sum of elements.cumsum(A,1)按列/cumsum(A,2)按行trials = cumfit(Nind) / NSel * (rand + (0:NSel-1)'); %trials 试用Mf = cumfit(:, ones(1, NSel));Mt = trials(:, ones(1, Nind))';[NewChrIx, ans] = find(Mt < Mf & [ zeros(1, NSel); Mf(1:Nind-1, :) ] <= Mt);[ans, shuf] = sort(rand(NSel, 1));NewChrIx = NewChrIx(shuf);%% RWS即轮盘赌(Roulette Wheel Selection)的选择方法,而SUS是随机通用采样.RWS的选择偏差往往比较大,而SUS可以在统计上避免选择偏差的存在。

三、运行结果

四、matlab版本及参考文献

1 matlab版本

a

2 参考文献

[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,.

[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。