遗传算法以及实现

智能优化算法-遗传算法以及Matlab实现


一、什么是遗传算法GA

遗传算法是进化类算法的一种,模拟生物遗传行为的自适应全局优化搜索算法。学习遗传算法首先应了解一定的生物基础(染色体、基因、变异、染色体变异)。

二、基本概念

1.种群和个体

算法实现在矩阵上,一般把矩阵当作整个群体,矩阵的行向量代表一个个体。个体表示可行解,种群表示可行解集合。

2.基因和染色体

染色体表示可行的编码,基因表示可行的编码的分量。

3.编码

编码的目的是进行交叉、变异操作。以二进制编码为例,假设求[0,4]上f(x)最大值,我们用长度为6的编码表示x,从 [0 0 0 0 0 0]到[1 1 1 1 1 1],将编码映射到实数内为0-63,所以编码精度就是4/63≈0.0635。一般来说编码精度高,计算复杂度高,结果就精确。

4.适应度函数

适应度函数代表个体的适应能力,一般使用目标函数作为适应函数,使用函数唯一的要求是:对于输入能够计算出可比较的结果。

二、步骤

1.初始化,设置最大进化代数G,随机生成矩阵NP*L作为初始种群;
2.使用适应度函数进行个体评价,计算适应度;
3.选择操作,根据适用度排序,选择适应度大的个体遗传到下一代;
4.交叉操作,选中群体中的个体,按照一定概率交换他们的染色体编码;
5.变异操作,作用与整个群体,以一定概率改变其基因(编码)
6.循环2345,判断终止条件是否满足。

三、示例

1.求函数f(x)=x+10sin(5x)+7cos(4x)在[0,10]上的最大值

代码如下(示例):

clear all;
close all;
clc;
NP = 50;
L=20;
G=100;
Pc= 0.6;
Pm= 0.1;
Xs= 10;
Xx=0;
f = randi([0,1],NP,L);

for k = 1:G         %每一次迭代
    for i =1:NP     %种群中每一个个体进行操作
        U = f(i,:); %取出种群的一个个体 
        m =0;
        for j =1:L
            m =U(j)*2^(j-1)+m; %m 二进制的0 1编码-->十进制数字,用于计算X(i)
        end
        x(i)=Xx+m*(Xs-Xx)/(2^j-1);      %(Xs-Xx)/(2^j-1)是编码精度
        Fit(i)=func1(x(i));
    end
    maxFit = max(Fit);
    minFit = min(Fit);%max min 在返回向量的个体值,不返回索引
    rr = find(maxFit == Fit); %记录Fit中的最大,find函数返回索引值
    fBest = f(rr(1,1),:);%fBest ----1*20,double
    xBest = x(rr(1,1));  %fBest ----int
    Fit = (Fit-minFit)/(maxFit-minFit);
    
    %--轮盘赌选择操作--%
    sum_fit = sum(Fit);
    fit_value = Fit./sum_fit;   %计算Fit中每个个体适应能力的比 1*50 double
    fit_value = cumsum(fit_value);
    ms = sort(rand(NP,1));       % ms  -- 1*50 double
    fiti = 1;
    new =1;
    while new<=NP
        if (ms(new)<fit_value(fiti))
            nf(new,:)=f(fiti,:);
            new = new+1;
        else
            fiti = fiti+1;
        end
    end

 %--交叉操作--%
    for i=1:2:NP
        p=rand;
        if p<Pc
            q=randi([0,1],L);
            for j=1:L
                if q(j)==1          %要符合条件=1(=0就不会交叉)
                    temp=nf(i+1,j);     %选择第i个染色体的第j个点进行交叉
                    nf(i+1,j)=nf(i,j);
                    nf(i,j)=temp;
                end
            end
        end
    end

    %--变异操作--%
    i =1;
    while i<round(NP*Pm)
        h =randi(NP,1,1);%随机生成一个1-NP的整数
        for j =1:round(L*Pm)
            g =randi(L,1,1);
            nf(h,g)=~nf(h,g);
        end
            i=i+1;
    end
    f = nf;
    f(1,:)=fBest;
    trace(k)= maxFit;
end

xBest;
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')

function result=func1(x)
fit= x+10*sin(5*x)+7*cos(47*x);
result=fit;
end


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
遗传算法是一种基于自然选择和遗传学原理的优化算法,它通过模拟自然界中的进化过程来寻找最优解。在MATLAB中,可以使用遗传算法工具箱来实现遗传算法。 以下是MATLAB遗传算法代码实现的步骤: 1. 定义适应度函数:适应度函数遗传算法中最重要的部分,它用于评估每个个体的适应度。在MATLAB中,可以使用函数句柄来定义适应度函数。 2. 设置遗传算法参数:包括种群大小、交叉概率、变异概率等。 3. 初始化种群:随机生成一组初始个体作为种群。 4. 迭代优化:在每一代中,根据适应度函数对种群进行评估,然后根据选择、交叉和变异等操作生成新的种群,直到达到预设的停止条件。 5. 输出结果:输出最优解及其适应度值。 下面是一个简单的MATLAB遗传算法代码实现的例子: ```matlab % 定义适应度函数 fitnessfcn = @(x) x(1)^2 + x(2)^2; % 设置遗传算法参数 options = gaoptimset('PopulationSize', 50, 'CrossoverFraction', 0.8, 'MutationFcn', {@mutationuniform, 0.1}); % 初始化种群 x0 = [0, 0]; % 迭代优化 [x, fval] = ga(fitnessfcn, 2, [], [], [], [], [], [], [], options); % 输出结果 disp(['最优解为:[', num2str(x(1)), ', ', num2str(x(2)), ']']); disp(['最优解的适应度值为:', num2str(fval)]); ``` 这个例子中,我们定义了一个简单的适应度函数,用于求解二元函数的最小值。然后,我们设置了遗传算法的参数,并初始化种群。最后,我们使用MATLAB内置的`ga`函数进行迭代优化,并输出最优解及其适应度值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值