进化算法简单实现

%%%%%%%%%%%%标准遗传算法解单决策变量问题%%%%%%%
%%%%%%%%%%%求取f(x) = 想+ 10sin(5x) + 7cos(4x)在[0,10]上的最大值%%%


%% 初始化参数
clear all;close all;clc;
Np = 14; %种群数量
L = 20; % 二进制编码长度
Pc = 0.8; % 交叉概率
Pm = 0.1; %变异概率
x_min = 0;
x_max = 10;  %上下限
G = 100; % 最大迭代次数

pop = randi([0, 1], Np, L);% 随机获得初始种群
next_pop = pop; % 新一代
fit = zeros(1, Np); % 种群中每个个体对应的适应度

trace = zeros(1, G); % 跟踪每一次迭代的最好值
%% 遗传算法循环
for k = 1 : G
    %%%%%%%%%解码二进制串为十进制%%%%%%%%%%%%
    for i = 1:Np
        unit = pop(i,:);%第i个个体的二进制码
        m = 0;
        
        for j = 1:L
            
            m = m + unit(j) * 2^(j-1); % m为二进制编码pop(i,:)对应的十进制编码
            
        end
    
        x(i) = x_min + (m/(2^L-1)) * (x_max - x_min); % 该十进制编码对应的区间中的值
        
        fit(i) = func1(x(i));
    end
    
    %找出最好适应度和最差适应度, 并确定最好/差适应度对应的个体
    max_fit = max(fit);
    min_fit = min(fit);
    
    best_idxs = find(fit == max_fit);
    pop_best = pop(best_idxs(1,1), :);
    x_best = x(best_idxs(1,1));
     
    normed_fit = (fit - min_fit)/(max_fit - min_fit);   % 归一化适应度
    
    %%%%%%%%%%%%基于轮盘赌的选择操作%%%%%%%
    fit_sum = sum(normed_fit);
    
    prob_sel = normed_fit./fit_sum;  %第i个元素代表第i个个体被选择的概率
    cum_prob = cumsum(prob_sel); % 选择概率的累积和,等下会看到
    
    old_i = 1;
    new_i = 1;
    
    sel_rate = sort(rand(1, Np)); % 通过累积和进行比较去保证选择率高的个体被选中的多些,
                                                      % 概率低的个体幅复制地少些甚至不复制
    
    % 这个算法在这部分的做法是很巧妙的,就是我要怎么保证选择操作能够
    % 让下一代的数量和这一代的数量相同?
    % 它用了一种方法,可能有其他的方法
    while(old_i <= Np && new_i <= Np)
        % 如果满足, 则选取
        if(sel_rate(new_i) < cum_prob(old_i))
            next_pop(new_i, :) = pop(old_i, :);
            new_i = new_i +1;
          % 否则  
        else
            old_i = old_i+1;
        
        end
        
    end
    %%%%%%%%%%%%基于概率的交叉操作%%%%%%%    
    
    for i = 1:2:Np %i表示第i对 
        p = rand(1);
        if (p<Pc)
            q = randi([0,1],1,L);% 随机生成一个个体——一个长为L的二进制码
            for j = 1:L
                if(q(j) == 1)
                    %交叉操作
                    temp = next_pop(i+1, j);
                    next_pop(i+1, j) = next_pop(i,j);
                    next_pop(i,j) = temp;
                end
            end
            
        end
    end
    %%%%%%%%%%%%基于概率的变异操作%%%%%%%
    i = 1;
    while i <= round(Np * Pm)
        h = randi([1, Np]);
        for j = 1:round(L * Pm)
            g = randi([1,L]);
            next_pop(h, g) =~ next_pop(h, g);%变异
        end
        
        i = i+1;
    end
    
    pop = next_pop;
    
    pop(1,:) = pop_best; % 保留最优个体
    
    trace(k) = max_fit;
    
    
end


figure(1);
plot(trace);







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值