遗传算法(Genetic Algorithm)
来源:互联网 发布:网站整站优化方案 编辑:程序博客网 时间:2024/05/18 15:28
遗传算法(Genetic Algorithm)是借鉴生物界的进化规律(适者生存,优胜劣汰)演化而来的随机优化搜寻算法。
主要特点:
1 GA从由很多的个体组成的一个初始化群体开始最优化的搜索过程.
2 遗传算法的选择,交叉,变异等运算都是以一种概率的方式进行的
3 具有并行的特点,适合大规模复杂问题的优化
主要算法:
1. 种群的创建. 这个是最开始需要做的. 定义一个种群包括多少个体,一个个体包含多少的染色体,个体的适应度(fitness). 这步骤之后,需要选择全局最优适应度和个体最佳适应度(这个群体本身).
popsize=100; %种族规模(个体的数量,表示有100个染色体)lenchrom=7; %变量字符串长度,一个个体染色体数量%染色体的取值范围popmax=50;popmin=0;bound=[popmin popmax;popmin popmax;popmin popmax;popmin popmax;popmin popmax;popmin popmax;popmin popmax];%产生1个群体,群体还有100个个体for i=1:popsize GApop(i,:)=Code(lenchrom,bound); %随机产生个体 fitness(i)=fun(GApop(i,:)); %染色体的适应度end
function ret=Code(lenchrom,bound)%将变量编码为染色体,随机初始化一个群体flag=0;while flag==0 pick=rand(1,lenchrom); ret=bound(:,1)'+(bound(:,2)-bound(:,1))'.*pick; flag=test_here(lenchrom,bound,ret);end
%初始化%找到最好的染色体[bestfitness bestindex]=min(fitness);zbest=GApop(bestindex,:); %全局最优gbest=GApop; %个体最佳fitnessgbest=fitness; %个体最佳适应值(最优的一个个体)fitnesszbest=bestfitness; %全局最佳适应度值(最优的一个整体)
2.迭代寻优.定义了种群进化的次数,每一次进化,个体的选择,染色体的交叉和变异就会出现。每一次的迭代寻优,个体最佳适应值和全局最佳适应值就会被计算和筛选.
%迭代寻优,对100个种群,迭代100次maxgen=100; %进化次数for i=1:maxgen i %种群的更新,GA选择更新 GApop=Selection(GApop,fitness,popsize); %交叉操作GA GApop=CrossGA(pc,lenchrom,GApop,popsize,bound); %变异操作GA变异 GApop=Mutation(pm,lenchrom,GApop,popsize,[i,maxgen],bound); pop=GApop; %适应值判断 for j=1:popsize if 0.072*pop(j,1)+0.063*pop(j,2)++0.057*pop(j,3)+0.05*pop(j,4)+0.032*pop(j,5)+0.0442*pop(j,6)+0.0675*pop(j,7)<=264.4 if 128*pop(j,1)+78.1*pop(j,2)++64.1*pop(j,3)+43*pop(j,4)+58.1*pop(j,5)+36.9*pop(j,6)+50.5*pop(j,7)<=69719 fitness(j)=fun(pop(j,:)); end end %个体最优更新,保存所有最优的个体到一个群体中 if fitness(j)<fitnessgbest(j) gbest(j,:)=pop(j,:); fitnessgbest(j)=fitness(j); end %群体最优更新 if fitness(j)<fitnesszbest zbest=pop(j,:); fitnesszbest=fitness(j); end end y(i)=fitnesszbest; end
3种群的更新GA,选择更新.对每个种群,都会筛选个体根据个体的适应性。一个个体的适应性越高,被选择的机会越大和次数越多.
function ret=Selection(individuals, fitness, sizepop)%对每一代个体进行选择,已进行后面的交叉和变异fitness=1./fitness;sumfitness=sum(fitness);sumf=fitness./sumfitness;index=[];%转100次转盘,选择个体for i=1:sizepop pick=rand; while pick==0; pick=rand; end for j=1:sizepop pick=pick-sumf(j); if pick<0 index=[index j]; %落入区间的个体被选择和可能重复的选择某些个体。 break; end endendindividuals=individuals(index,:);fitness=fitness(index);ret=individuals;
4交叉操. 让两个个体的染色体的交换,从而改变个体的适应性.
pc=0.7; %交叉概率function ret=CrossGA(pcross,lenchrom,chrom, sizepop, bound) for i=1:sizepop %随机选择两个个体的染色体进行交叉 pick=rand(1,2); if prod(pick)==0 pick=rand(1,2); end index=ceil(pick.*sizepop); %决定是否交叉 pick=rand; while pick==0 pick=rand; end if pick>pcross %(小于交叉函数,交叉) continue; end flag=0; while flag==0 pick=rand; while pick==0 pick=rand; end %选交叉的位置,对于两个个体的染色体,交叉位置相同 pos=ceil(pick*lenchrom); pick=rand; v1=chrom(index(1),pos); v2=chrom(index(2),pos); chrom(index(1),pos)=pick*v2+(1-pick)*v1; chrom(index(2),pos)=pick*v1+(1-pick)*v2; flag1=test_here(lenchrom,bound, chrom(index(1),:));%检验交叉的可行性 flag2=test_here(lenchrom,bound, chrom(index(2),:)); if flag1*flag2==0%不可行,重新交叉 flag=0; else flag=1; end end endret=chrom;
5 变异操作. 让个体的染色体的变异,从而改变个体的适应性.
pm=0.3; %变异概率function ret=Mutation(pmutation, lenchrom, chrom, sizepop,pop,bound)%本函数完成变异操作for i=1:sizepop pick=rand; while pick==0 pick=rand; end pick=rand; if pick>pmutation%变异概率是否进行 continue;%变异概率不进行 end %变异概率进行 flag=0; while flag==0 pick=rand; while pick==0 pick=rand; end %随机选择位置 pos=ceil(pick*lenchrom); v=chrom(i,pos);%获得当前群体的的第i个体的第pos位置 v1=v-bound(pos,1); v2=bound(pos,2)-v; pick=rand; %变异 if pick >0.5 delta=v2*(1-pick^((1-pop(1)/pop(2))^2)); chrom(i,pos)=v+delta; else delta=v1*(1-pick^((1-pop(1)/pop(2))^2)); chrom(i,pos)=v-delta; end flag=test_here(lenchrom, bound, chrom(i,:)); endendret=chrom;
%%可行性检验function flag=test_here(lenchrom, bound, code)[n,m]=size(code);flag=1;[n,m]=size(code);for i=1:n if code(i)<bound(i,1)||code(i)>bound(i,2) flag=0; endend
Reference
MATLAB 智能算法超级学习手册
1 0
- 遗传算法(Genetic Algorithm)
- 遗传算法 Genetic Algorithm
- 遗传算法--genetic algorithm
- 遗传算法(Genetic Algorithm)
- 遗传算法Genetic Algorithm
- 遗传算法(Genetic Algorithm)
- 遗传算法入门(Genetic Algorithm)
- 遗传算法(Genetic Algorithm,GA)
- Genetic Algorithm遗传算法学习
- [笔记]遗传算法 genetic algorithm
- Genetic Algorithm遗传算法学习
- 遗传算法(genetic algorithm, GA)
- GA遗传算法(Genetic Algorithm)
- 简单的遗传算法(Genetic Algorithm)源代码
- 算法理解-遗传算法(Genetic Algorithm)(一个带计算过程的例子)
- 跨世代保留精英遗传(基因)算法(intergenerational reserved Elitism Genetic Algorithm)
- 遗传算法(Genetic Algorithm)解决迷宫寻路问题
- 基因算法 Genetic Algorithm
- JavaScript数组学习
- ubutu sudo pip command not found
- 为了减少代码量。于是,我使用了butterknife,在使用的过程中遇到的一些坑
- 数据分析之旅(一)
- 集合-总结
- 遗传算法(Genetic Algorithm)
- Java线程:线程状态的转换
- 宏碁电脑双硬盘安装系统需要注意的几点问题
- 欢迎使用CSDN-markdown编辑器
- java多线程(二) 线程的生命周期
- keil MDK之RTX配置文件 RTX_Conf_CM.c 的向导解析
- Python序列化模块pickle
- JavaEE OGNL表达式(转载)
- Java线程:线程的同步与锁