本文共 2659 字,大约阅读时间需要 8 分钟。
遗传算法:
一种仿生全局优化算法 模拟生物的遗传进化原理,通过选择、交叉与变异等操作机制,使种群中个体的适应性不断提高。matlab代码:
参考博客链接如下(侵删):主函数:
function main()clear;clc;%种群大小popsize=100;%二进制编码长度chromlength=10;%交叉概率pc = 0.6;%变异概率pm = 0.001;%初始种群pop = initpop(popsize,chromlength); for i = 1:100 %计算适应度值(函数值) objvalue = cal_objvalue(pop); fitvalue = objvalue; %选择操作 newpop = selection(pop,fitvalue); %交叉操作 newpop = crossover(newpop,pc); %变异操作 newpop = mutation(newpop,pm); %更新种群 pop = newpop; %寻找最优解 [bestindividual,bestfit] = best(pop,fitvalue); x2 = binary2decimal(bestindividual); x1 = binary2decimal(newpop); y1 = cal_objvalue(newpop); if mod(i,10) == 0 figure; fplot('10*sin(5*x)+7*abs(x-5)+10',[0 10]); hold on; plot(x1,y1,'*'); title(['迭代次数为n=' num2str(i)]); %plot(x1,y1,'*'); endendfprintf('The best X is --->>%5.2f\n',x2);fprintf('The best Y is --->>%5.2f\n',bestfit);
二进制种群生成函数:
%初始化种群大小%输入变量:%popsize:种群大小%chromlength:染色体长度-->>转化的二进制长度%输出变量:%pop:种群function pop=initpop(popsize,chromlength)pop = round(rand(popsize,chromlength));%rand(3,4)生成3行4列的0-1之间的随机数% rand(3,4)% % ans =% % 0.8147 0.9134 0.2785 0.9649% 0.9058 0.6324 0.5469 0.1576% 0.1270 0.0975 0.9575 0.9706%round就是四舍五入% round(rand(3,4))=% 1 1 0 1% 1 1 1 0% 0 0 1 1%所以返回的种群就是每行是一个个体,列数是染色体长度
二进制转十进制:
%二进制转化成十进制函数%输入变量:%二进制种群%输出变量%十进制数值function pop2 = binary2decimal(pop)[px,py]=size(pop);for i = 1:py pop1(:,i) = 2.^(py-i).*pop(:,i);end%sum(.,2)对行求和,得到列向量temp = sum(pop1,2);pop2 = temp*10/1023;
适应度函数:
%计算函数目标值%输入变量:二进制数值%输出变量:目标函数值function [objvalue] = cal_objvalue(pop)x = binary2decimal(pop);%转化二进制数为x变量的变化域范围的数值objvalue=10*sin(5*x)+7*abs(x-5)+10;
选择新的个体:
%如何选择新的个体%输入变量:pop二进制种群,fitvalue:适应度值%输出变量:newpop选择以后的二进制种群function [newpop] = selection(pop,fitvalue)%构造轮盘[px,py] = size(pop);totalfit = sum(fitvalue);p_fitvalue = fitvalue/totalfit;p_fitvalue = cumsum(p_fitvalue);%概率求和排序ms = sort(rand(px,1));%从小到大排列fitin = 1;newin = 1;while newin<=px if(ms(newin))
交叉:
%交叉变换%输入变量:pop:二进制的父代种群数,pc:交叉的概率%输出变量:newpop:交叉后的种群数function [newpop] = crossover(pop,pc)[px,py] = size(pop);newpop = ones(size(pop));for i = 1:2:px-1 if(rand
变异:
%关于编译%函数说明%输入变量:pop:二进制种群,pm:变异概率%输出变量:newpop变异以后的种群function [newpop] = mutation(pop,pm)[px,py] = size(pop);newpop = ones(size(pop));for i = 1:px if(rand
选择最优个体:
%求最优适应度函数%输入变量:pop:种群,fitvalue:种群适应度%输出变量:bestindividual:最佳个体,bestfit:最佳适应度值function [bestindividual bestfit] = best(pop,fitvalue)[px,py] = size(pop);bestindividual = pop(1,:);bestfit = fitvalue(1);for i = 2:px if fitvalue(i)>bestfit bestindividual = pop(i,:); bestfit = fitvalue(i); endend
转载地址:http://migwi.baihongyu.com/