前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用遗传算法求函数最大值二:选择、交叉和变异

用遗传算法求函数最大值二:选择、交叉和变异

作者头像
mwangblog
发布2018-10-18 17:55:55
1.5K0
发布2018-10-18 17:55:55
举报
文章被收录于专栏:mwangblogmwangblog

选择

选择(或复制)操作决定哪些个体可以进入下一代。这里采用轮盘赌法选择,这种方法比较容易实现。

在轮盘赌法中,设种群大小为n,其中个体i的适应值是f_ifi,则i被选择的概率为:

p_i = \frac{f_i}{\sum_{j=1}^{n} f_i}pi=∑j=1nfifi

显然,个体适应值越大,被选择的概率越大。

轮盘赌法具体步骤如下:

  1. 计算f_{sum}fsum和p_ipi
  2. 产生(0,1)的随机数rand,求s=rand×f_sum 。
  3. 求\sum_{i=1}^k f_i \geqslant s∑i=1kfis中最小的k,该k被选中。
  4. 多次操作,直到得到指定个个体。

代码实现如下:

代码语言:javascript
复制
function [newpop] = selection(pop, fitvalue)% 选择,轮盘赌方法,最大化问题% pop       input  种群% fitvalue  input  适应度值% newpop    output 选择后的种群totalfit = sum(fitvalue);fitvalue = fitvalue / totalfit;fitvalue = cumsum(fitvalue);[n, l] = size(pop);newpop = zeros(n, l);rnumber = sort(rand(n,1));fitindex = 1;newindex = 1;while newindex <= n    if rnumber(newindex) < fitvalue(fitindex)
        newpop(newindex,:) = pop(fitindex,:);
        newindex = newindex + 1;
    else
        fitindex = fitindex + 1;
    endendend

交叉

这里采用单点交叉的方法,假设有两个个体:

X1 = 010*0110 X2 = 101*0001

在*交叉,得到两个子代:

Y1 = 0100001 Y2 = 1010110

实现代码如下:

代码语言:javascript
复制
function [newpop] = crossover(pop, pc)% 交叉% pop       input  种群% pc        input  变异概率% newpop    output 新种群[n, l] = size(pop);newpop = zeros(n, l);for i = 1:2:n-1   % 最少需剩余一行
    if rand < pc
        cpoint = round(rand * l);
        newpop(i, :) = [pop(i, 1:cpoint), pop(i+1, cpoint+1:l)];
        newpop(i+1, :) = [pop(i+1, 1:cpoint), pop(i, cpoint+1:l)];
    else
        newpop(i, :) = pop(i,:);
        newpop(i+1, :) = pop(i+1,:);
    endendend

变异

对于本问题的二进制编码,变异是指将染色体中的某一位进行反转,代码如下:

代码语言:javascript
复制
function [newpop] = mutation(pop, pm)% 变异% pop           input  种群% pm            input  变异概率% newpop        output 变异之后的新种群[n, l] = size(pop);newpop = zeros(n, l);for i = 1:n    newpop(i, :) = pop(i, :);
    if rand < pm
        mpoint = round(rand * l);
        if mpoint <= 0
            mpoint = 1;
        end
        if any(newpop(i, mpoint)) == 0
            newpop(i, mpoint) = 1;
        else
            newpop(i, mpoint) = 0;
        end
    endendend

最优个体

下面的函数得到种群中最优个体的索引:

代码语言:javascript
复制
function bestindex = bestindividual(pop, fitvalue, opt)% 得到种群中最优的个体的索引% pop               input  种群% fitvalue          input  适应度值% opt               input  操作模式:'min'求最小值,'max'求最大值% bestindex         output 最优个体索引if strcmp(opt, 'min')
    [~, bestindex] = min(fitvalue);else
    [~, bestindex] = max(fitvalue);endend
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 mwangblog 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 选择
  • 交叉
  • 变异
  • 最优个体
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档