1.算法描述
遗传算法 (Genetic Algorithm,GA) 是一种基于规律进化的随机优化搜索算法,该算法最早是由Holland在1975年提出的。遗传算法的主要优势是通过对目标对象进行优化操作,并通过基于概率的搜索方法,获得相应的搜索空间,因此GA算法具有较强的全局搜索能力。由于遗传算法特有的全局搜索能力,其被广泛使用在各个领域,包括信号处理,机器学习以及控制域等。遗传优化的主要算法流程图如下图所示:
遗传算法中每一条染色体,对应着遗传算法的一个解决方案,一般我们用适应性函数(fitness function)来衡量这个解决方案的优劣。所以从一个基因组到其解的适应度形成一个映射。遗传算法的实现过程实际上就像自然界的进化过程那样。
遗传算法的一般步骤:
1.随机产生种群
2.根据策略判断个体的适应度,是否符合优化准则,若符合,输出最佳个体及其最优解,结束。否则,进行下一步
3.依据适应度选择父母,适应度高的个体被选中的概率高,适应度低的个体被淘汰
4.用父母的染色体按照一定的方法进行交叉,生成子代
5.对子代染色体进行变异
由交叉和变异产生新一代种群,返回步骤2,直到最优解产生
基本遗传算法的具体过程如下:
2.仿真效果预览
matlab2022a仿真如下:
3.MATLAB核心程序
......................................................... Lens = data(:,2); NUM = length(Lens);%x,y %间隔 SCALE= 45/60;%转换为小时 Sums = 29; %每一行的最大值不大于29 Sums2= 24; %每一行的总和不大于24 %纵坐标最大范围 Ymax = 24; %放射变换 %根据遗传算法进行参数的拟合 MAXGEN = 400; NIND = 2000; Chrom = crtbp(NIND,NUM*10); %49个变量的区间 Areas = []; for i = 1:NUM Areas = [Areas,[1;Ymax]];%最多24行 end FieldD = [rep([10],[1,NUM]);Areas;rep([0;0;0;0],[1,NUM])]; Error = zeros(1,MAXGEN); Error2 = zeros(1,MAXGEN); for a=1:1:NIND J(a,1) = 0; end Objv = (J+eps); gen = 0; while gen < MAXGEN; gen FitnV=ranking(Objv); Selch=select('sus',Chrom,FitnV); Selch=recombin('xovsp', Selch,0.995); Selch=mut( Selch,0.005); phen1=bs2rv(Selch,FieldD); for a=1:1:NIND YY = round(phen1(a,:)); flag= []; %设置约束条件,间隔 for i = 1:Ymax indx{i} = find(YY == i);%找到每一行的序列号 end Xs=[]; Ys=[]; Ls=[]; flag = zeros(1,Ymax); Numss= 0; for i = 1:Ymax NO = indx{i}; X0 = []; Ltmps= Lens(NO); Ytmps= YY(NO); for j = 1:length(NO) if j == 1 X0(j) = 0; else X0(j) = X0(j-1)+Ltmps(j-1)+SCALE; end end Xs=[Xs,X0]; Ys=[Ys,Ytmps]; Ls=[Ls,Ltmps']; if isempty(NO)==0 Numss = Numss+1; if X0(end) + Ltmps(end) <= Sums & sum(Ltmps) <= Sums2 flag(i)=1; else flag(i)=0; end end end epls = func_obj(Xs,Ys,Ls,Ymax); %符合约束条件的进行输出 E = epls; JJ(a,1) = E; XX_{a} = Xs; YY_{a} = Ys; LL_{a} = Ls; end Objvsel=(JJ); [Chrom,Objv]=reins(Chrom,Selch,1,0,Objv,Objvsel); gen=gen+1; Error(gen)=min(JJ); if gen <= 64 Error2(gen) = mean(Error(1:gen)); else Error2(gen) = mean(Error(gen-64:gen)); end end figure; plot(Error2,'b-o'); xlabel('迭代次数'); ylabel('优化目标值'); grid on %得到最优坐标 [V,I] = min(JJ); X_opt = XX_{I}; Y_opt = YY_{I}; L_opt = LL_{I}; %画出甘特图 for i = 1:length(L_opt) indx = find(Lens==L_opt(i)) NO2_(i)= indx(1); end figure; for i=1:length(X_opt) hold on; plotRec(X_opt(i),X_opt(i)+L_opt(i),Y_opt(i)); text((X_opt(i)+X_opt(i)+L_opt(i))/2,Y_opt(i)-0.5,num2str(NO2_(i))); end xlabel('时间'); ylabel('序号'); title('甘特图'); 02_053m
标签:end,Ymax,Selch,甘特图,适应度,matlab,遗传算法,X0,优化 From: https://www.cnblogs.com/51matlab/p/17093838.html