1. 소개
1
유전 알고리즘 소개 유전 알고리즘은 자연 진화를 시뮬레이션하는 최적화 된 검색 알고리즘입니다. 피트니스 함수에만 의존하여 최적의 솔루션을 찾을 수 있기 때문에 문제의 솔루션 공간에 대한 지식이 필요하지 않으며 피트니스 함수는 연속 미분 등의 조건에 의해 제약을받지 않으므로 다중 문제 해결에 사용됩니다. -차원, 고도로 비선형적인 복잡한 최적화 문제가 널리 사용되고 심층 연구되었습니다.
유전 알고리즘은 패턴 인식, 신경망, 기계 학습, 산업 최적화 제어, 적응 제어, 생물학 및 사회 과학에 사용됩니다.
2 유전 알고리즘의 원리
둘째, 소스 코드
clc
tic
%%参数初始化
maxgen=100; %进化代数,即迭代次数,初始预定值选为100
sizepop=200; %种群规模,初始预定值选为100
pcross=0.9; %交叉概率选择,0和1之间,一般取0.9
pmutation=0.01; %变异概率选择,0和1之间,一般取0.01
individuals=struct('fitness',zeros(1,sizepop),'chrom',[]);
%种群,种群由sizepop条染色体(chrom)及每条染色体的适应度(fitness)组成
avgfitness=[];
%记录每一代种群的平均适应度,首先赋给一个空数组
bestfitness=[];
%记录每一代种群的最佳适应度,首先赋给一个空数组
bestchrom=[];
%记录适应度最好的染色体,首先赋给一个空数组
%初始化种群
for i=1:sizepop
%随机产生一个种群
individuals.chrom(i,:)=4000*rand(1,12);
%把12个0~4000的随机数赋给种群中的一条染色体,代表K=4个聚类中心
x=individuals.chrom(i,:);
%计算每条染色体的适应度
individuals.fitness(i)=fitness(x);
end
%%找最好的染色体
[bestfitness bestindex]=max(individuals.fitness);
%找出适应度最大的染色体,并记录其适应度的值(bestfitness)和染色体所在的位置(bestindex)
bestchrom=individuals.chrom(bestindex,:);
%把最好的染色体赋给变量bestchrom
avgfitness=sum(individuals.fitness)/sizepop;
%计算群体中染色体的平均适应度
trace=[avgfitness bestfitness];
%记录每一代进化中最好的适应度和平均适应度
for i=1:maxgen
i
%输出进化代数
individuals=Select(individuals,sizepop);
avgfitness=sum(individuals.fitness)/sizepop;
%对种群进行选择操作,并计算出种群的平均适应度
individuals.chrom=Cross(pcross,individuals.chrom,sizepop);
%对种群中的染色体进行交叉操作
individuals.chrom=Mutation(pmutation,individuals.chrom,sizepop);
%对种群中的染色体进行变异操作
for j=1:sizepop
x=individuals.chrom(j,:);%解码
[individuals.fitness(j)]=fitness(x);
end
%计算进化种群中每条染色体的适应度
[newbestfitness,newbestindex]=max(individuals.fitness);
[worestfitness,worestindex]=min(individuals.fitness);
%找到最小和最大适应度的染色体及它们在种群中的位置
if bestfitness<newbestfitness
bestfitness=newbestfitness;
bestchrom=individuals.chrom(newbestindex,:);
end
%代替上一次进化中最好的染色体
individuals.chrom(worestindex,:)=bestchrom;
individuals.fitness(worestindex)=bestfitness;
%淘汰适应度最差的个体
avgfitness=sum(individuals.fitness)/sizepop;
trace=[trace;avgfitness bestfitness];
%记录每一代进化中最好的适应度和平均适应度
end
% 交叉概率决定是否进行交叉
pick=rand;
while pick==0
pick=rand;
end
if pick>pcross
continue;
end
pick=rand;
while pick==0
pick=rand;
end
for i=1:sizepop
pick=pick-sumf(i);
if pick<0
index=[index i];
break;
end
end
end
individuals.chrom=individuals.chrom(index,:);
individuals.fitness=individuals.fitness(index);
ret=individuals;
세, 실행 결과
네, 비고
QQ1575304183을 추가하는 대신 코드를 작성하거나 작성하십시오.