フレーム構造とGAのMATLABコードを実装します

GAの全体的な枠組み

ここに画像を挿入説明

選択演算子(ルーレット選択)

ここに画像を挿入説明

クロスオーバー(シングルポイントクロスオーバー)

ここに画像を挿入説明

突然変異オペレータ

ここに画像を挿入説明

達成するためのコード遺伝的アルゴリズム

GAを符号化および復号化の方法
  • コード:個々の遺伝情報の特性になります
  • デコード:遺伝情報を文字に
  • 例コーディング:変数xについて、xの可変範囲が想定される:[ - 1,12]、間隔の長さは、12(-1)= 13であり、我々は、バイナリ変換が行われ、4つの10進の場所に必要な精度と仮定 65536 = 2 16 < 13 × 1 0 4 < 2 17 = 131072 65536 = 2 ^ {16} <13 \回10 ^ 4 <2 ^ {17} = 131072 、我々バイナリコード長は17であります
  • 復号化の方法:xは区間[a、b]である場合、xが二値化された(A_0、A_1、... A_N-1、A_N)を小数点数、長さN + 1であります ( a 0 a 1 . . . a n 1 a n ) 2 = ( i = 0 n a i × 2 i ) 10 = s u m (a_0a_1 ... A_ {N-1} A_N)_2 =(\ sum_ {i = 0} ^ {n}はa_iを\ times2 ^ I)_ {10} =合計 x = a + s u m × ( b a ) / ( 2 n + 1 1 ) X = A +和\回(BA)/(2 ^ {N + 1} -1)
初期集団
%% 初始化种群
Num_pop = 200;
Num_gen = 1000;
Binary_lenth = 32;
P_c=0.8;
P_m=0.02;
pop = round(rand(Num_pop,Binary_lenth));        %表示将矩阵元素全都四舍五入取整
                                     %又因为rand函数生成的是(0,1)之间的随机数
                                     %所以取整之后,pop得到了天然的二进制01编码
x1 = decode_x1(pop(:,1:17));         %x1是一个4017列的矩阵,用来存放所有个体的第一个染色体
x2 = decode_x2(pop(:,18:end));      %x2是一个4015列的矩阵,用来存放所有个体的第二个染色体

%% 计算适应度值
fitness = x1.*sin(pi*x1) + x2.*sin(exp(x2));
[max_fit,spot]=max(fitness);
デコーディング

decode_x1

%  date:201935%  Author: Chauncy_xu
function [a] = decode_x1(binary_code)
%该函数把二进制编码进行解码
%   input  x1的二进制编码,是一个4017列的01矩阵
%   output 一个401列的实数矩阵
[M,N] = size(binary_code);%这里面M应该为40,N为17
sum = zeros(M,1);%产生一个M行1列的零矩阵,用于存放实数值
for i = 1:M    %开始遍历01编码矩阵
               %行遍历,也就是按照个体遍历 
    for j = 1:N  %列遍历
        sum(i) = sum(i)+binary_code(i,j)*2^(N-j);
    end
    a(i) = -1.0 + sum(i)*(12.0-(-1.0))/(2^N-1);
end

decode_x2

%  date:201935%  Author: Chauncy_xu
function [b] = decode_x2(binary_code)
%该函数把二进制编码进行解码
%   input  x1的二进制编码,是一个4017列的01矩阵
%   output 一个401列的实数矩阵
[M,N] = size(binary_code);%这里面M应该为40,N为17
sum = zeros(M,1);%产生一个M行1列的零矩阵,用于存放实数值
for i = 1:M    %开始遍历01编码矩阵
               %行遍历,也就是按照个体遍历 
    for j = 1:N  %列遍历
        sum(i) = sum(i)+binary_code(i,j)*2^(N-j);
    end
    b(i) = 4.0 + sum(i)*(6.0-(4.0))/(2^N-1);
end
選択(ルーレット選択方式)
%  date:201935%  Author: Chauncy_xu
function [new_pop] = Select(fitness,pop)
% 该函数是一个轮盘赌选择函数,选择好的个体进入交配池
% Input  适应度值
% Input  矩阵A
% Output 交配池,也可以说是中间的新的种群
[M,N]=size(pop);
for i=1:M  %把每个个体的适应度值转化为被选择的概率
    prob(i)=fitness(i)/sum(fitness);   %sum函数可以直接获得fitness的总和
end
for i=2:M  %把每个个体的被选择概率转化为累加概率
    prob(i)=prob(i)+prob(i-1);
end
for j=1:M
    p=rand();
    i=1;
    while p>prob(i)
        i=i+1;
    end
    new_pop(j,:)=pop(i,:);
end
クロスオーバー(シングルポイントクロスオーバー)
%  date:201935%  Author: Chauncy_xu
function [Cross_pop] = Crossover(P_c,pop)
% 该函数实现交配池中的交叉,基本思想是两两配对,根据交叉概率选择是否交叉,
% 这里进行的交叉是单点交叉
% Input   P_c  交叉概率
% Input   pop  交配池,也可以说是中间种群
% Output  Cross_poop   进行交叉运算之后的种群
Cross_pop=pop;
[M,N]=size(pop);
for i=1:2:M-1
    p=rand();
    q=rand();
    if p<P_c
        spot = ceil(q*N);  %随机选择交叉点
        for j=spot:N
            temp = pop(i,j);
            Cross_pop(i,j) = pop(i+1,j);
            Cross_pop(i+1,j) = temp;
        end
    end
end
end
バリエーション
%  date:201935%  Author: Chauncy_xu
function [Mut_pop] = Mutation(P_m,pop)
% 该函数进行遗传算法中的变异操作,具体为随机选择变异位值,对该点的二进制编码取反
% Input   P_m  变异概率
% Iutput  pop   刚刚进行过交叉的中间种群
% Output  Mut_pop  变异之后的种群 
[M,N] = size(pop);
Mut_pop = pop;
flag = (rand(M,N)<P_m);
for i=1:M
    for j=1:N
        if flag(i,j)==1
            if pop(i,j)==1
                Mut_pop(i,j)=0;
            else
                Mut_pop(i,j)=1;
            end
        end
    end
end
end
反復プロセス
%  date:201935%  Author: Chauncy_xu
for gen=1:Num_gen
    %% 进行选择操作
    [pop] = Select(fitness,pop);
    %% 进行交叉操作
    [pop] = Crossover(P_c,pop);
    %% 进行变异操作
    [pop] = Mutation(P_m,pop);
    pop=pop;
    %解码
    x1 = decode_x1(pop(:,1:17));         
    x2 = decode_x2(pop(:,18:end)); 
    fitness = x1.*sin(pi*x1) + x2.*sin(exp(x2));
     %存储该代的最优个体适应值
    [best_fit,index] = max(fitness); 
    %更新全局最优值
    if best_fit >= max_fit
        max_fit = best_fit;
        spot = pop(index,:);
        x_1 = decode_x1(spot(1:17));
        x_2 = decode_x2(spot(18:end));
    end
    num(gen) = max_fit;
end
結果は
%  date:201935%  Author: Chauncy_xu
%% 绘图显示结果
disp(sprintf('%.6f',num(gen)));
disp(sprintf('x=%.5f,y=%.5f',x_1,x_2));
figure
plot(num,'k');

ここに画像を挿入説明

公開された37元の記事 ウォン称賛17 ビュー2597

おすすめ

転載: blog.csdn.net/qq_44384577/article/details/104613040