遗传算法(GA)

本文详细介绍了遗传算法的原理,包括如何通过模仿生物进化中的繁殖、变异、选择和交叉等过程来优化问题,以及在Matlab中的具体实现步骤,如随机初始化群体、选择、交叉和变异操作,以及目标函数的判断和种群更新机制。
摘要由CSDN通过智能技术生成

遗传算法主要融合了自然生物进化中的一些行为:繁殖、变异、选择、交叉

生物生存环境的适应度:目标函数(越大越好)
染色体:所有待优化的参数,可以用串表示,such as 二进制串
群体:个体集合,串是元素
基因:基因是串中的元素,通常一个基因对应一个参数,such as二进制编码时,一位代表一个基因

初始化:
随机生成一定数量的生物个体,染色体不尽相同。

选择:
目标函数值大的(适应度高的)生存下来繁殖下一代的机率更大;当然也随机少量选择一些“幸运儿”(目标函数小的,即适应度低的)也能生存下来繁殖下一代。

交配:
两两交配,基因进行交叉、变异(基因交叉->参数交叉互换,变异->参数修改)产生新个体。

判断目标函数是否满足,不满足就迭代,满足就退出。

Matlab版本如下

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;    %这里是转置,找不到matlab语言的插入
    flag=test_here(lenchrom,bound,ret);
end
%%可行性检验
function flag=test_here(lenchrom, bound, code)
flag=1;
[n,m]=size(code);
for i=1:m
    if code(i)<bound(i,1)||code(i)>bound(i,2)
        flag=0;
    end
end
%迭代寻优,对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
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
    end
end
individuals=individuals(index,:);
fitness=fitness(index);
ret=individuals;
  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值