利用遗传算法求解最优值

1.初始化种群

function Init_pop = Initial_pop( pop_num,range_l,range_r )
%%
%   目的:初始化种群
%   输入:种群个数
%         初始化的种群应该在[range_l,range_r]之间
%   输出:初始化之后的种群
%%
    for i=1:pop_num
        Init_pop(:,i) = range_l + (range_r - range_l)*rand;
    end
end

2.目标函数

function y = f_x( x )
%%  目标函数
    y=x.*sin(3*pi.*x);
end

3.适应度函数

function fit_value = Fitness(Init_pop)
%%  目的;计算适应度
%    输入:初始种群
%          目标函数:y=x^2  
%          所以我们取适应度函数为fit_value=1/y,值最小的时候,即为最优解
%    输出:适应度值
    for i=1:size(Init_pop,2)
        fit_value(i) = 1/(2-f_x(Init_pop(:,i)));
    end
end

4.选择函数

function New_pop = Option( pop,pop_num,Fit_value )
%%  选择适应度高的个体
%    输入:pop 初始化种群
%         pop_num 种群中的个体数目
%         Fit_value 适应度矩阵
%    输出:New_pop 选择新的种群
%%
     % 对适应度求和
     Total = sum(Fit_value,2);
     % 选择概率
     P_Selection = Fit_value/Total;
     % 求累计概率
     P_Accum = cumsum( P_Selection);
     for i=1:pop_num
         % 找到比随机数大的累计概率
         Index_mat = find(P_Accum>rand);
         if isempty(Index_mat)
             continue
         end
         % 将首个比随机数大的累积概率位置的个体遗传下去
         New_pop(:,i) = pop(:,Index_mat(1));
     end
end

5.二进制编码

function bin_pop = encoding( opt_pop,range_l)
%%  目标:对选择后的新种群进行二进制编码
%    输入:opt 选择后的种群
%          pop_lenth 编码长度
%    处理过程: 进行二进制编码
%    输入:bin_pop 二进制种群
%%
     pop =round((opt_pop-range_l)*10^6); % 10^6精确度
     bin_pop = [];
     %dec2bin将整数转换为二进制
     bin_pop = dec2bin( pop);
end

6.交叉函数

function new_pop = crossovers(bin_pop,P_cross)
%%  目的:进行交叉
%    输入:bin_pop 二进制编码
%          P_cross  交叉概率
%    输出:new_popbin 新的二进制种群
%%
    [r,c] = size(bin_pop);
    for i = 1:2:r-1
        if(rand<P_cross)
            location = round(rand*c);
            len = length(bin_pop(i,:));
            pop_parent = bin_pop(i,:);
            pop_mother = bin_pop(i+1,:);
            temp_parent = pop_parent(1,location+1:c);
            temp_mother = pop_mother(1,location+1:c);
            new_pop(i,:) = [ pop_parent(1,1:location),temp_mother];
            new_pop(i+1,:) = [pop_mother(1,1:location),temp_parent];
        else
            new_pop(i,:) = bin_pop(i,:);
            new_pop(i+1,:) = bin_pop(i+1,:)
        end
    end
 end

7.变异函数

function New_pop = Mutation( cross_group,P_mutation,pop_num)
%%  变异算法
%   输入变量: cross_group   交叉后的二进制种群
%   重点问题: 利用什么方法寻找变异位置
%             P_mutation    变异概率
%   输出变量: Mutated_group  变异后的二进制种群
%%
    for i = 1:pop_num
        if(rand<P_mutation)
            temp = cross_group(i,:);
            location = ceil(rand*length(temp));
            if temp(1,location) =='0'
               temp(1,location) =='1';
            else temp(1,location) =='1'
               temp(1,location) ='0';
            end
        else
            New_pop(i,:) = cross_group(i,:);
        end
    end
end

8.二进制解码

function pop = decoding(pop_bin,range_l,pop_num)
%%  目的:解码
%    输入:pop_bin  二进制种群
%          range_l  区间左端点
%    输出:pop  实数种群
%% 
    [r,c] = size(pop_bin);
    pop = ones(1,pop_num);
    for i=1:r
        kid_str = pop_bin(i,:);
        kid_dec = bin2dec(kid_str);
        kid = kid_dec/10^6+range_l; 
        pop(:,i) = kid;
    end
end

9.主函数

%% 清理窗口和变量
clc
clear all
%% 遗传参数设置
NUMPOP=100;            %初始种群大小
range_l=-1;            %问题解区间
range_r=2;
LENGTH=22;             %二进制编码长度
ITERATION = 10000;     %迭代次数
CROSSOVERRATE = 0.7;   %杂交率
VARIATIONRATE = 0.001; %变异率
%%
%初始化种群
pop=Initial_pop(NUMPOP,range_l,range_r);
%绘制初始种群分布
x=linspace(-1,2,1000);
y=f_x(x);
plot(x,y);
hold on
for i=1:size(pop,2)
    plot(pop(i),f_x(pop(i)),'ro');
end
hold off
title('初始种群图像');
%%
%开始迭代
for time=1:ITERATION
    %计算初始种群的适应度
    fitness=Fitness(pop);
    %选择
    pop= Option(pop,NUMPOP,fitness);
    %编码
    binpop=encoding(pop,range_l);
    %交叉
    kidPop = crossovers(binpop,CROSSOVERRATE);
    %变异
    kidsPop = Mutation(kidPop,VARIATIONRATE,NUMPOP);
    %解码
    kid_Pop=decoding(kidsPop,range_l,NUMPOP);
    %更新种群
    pop=kid_Pop;
end
figure
x=linspace(-1,2,1000);
y=f_x(x);
plot(x,y);
hold on
for i=1:size(pop,2)
    plot(pop(i),f_x(pop(i)),'ro');
end
hold off
title('终止种群');
% 
disp(['最优解:' num2str(max(f_x(pop)))]);
disp(['最大适应度:' num2str(max(f_x(pop)))]); 

猜你喜欢

转载自www.cnblogs.com/mysterygust/p/12823739.html
今日推荐