Estructura de trama y MATLAB GA código implementan

El marco general de GA

Aquí Insertar imagen Descripción

Selección de operador (la ruleta selección de rueda)

Aquí Insertar imagen Descripción

Crossover (cruce de un solo punto)

Aquí Insertar imagen Descripción

operador de mutación

Aquí Insertar imagen Descripción

El algoritmo genético código para lograr

El método de codificación y decodificación GA
  • Código: los rasgos de la información genética de cada individuo se convierte
  • Decodificación: la información genética en un personaje
  • Ejemplo de codificación: Para una variable x, se asume el rango variable de x: [- 1,12], la longitud de intervalo es 12- (-1) = 13, se asumió que la precisión requerida para cuatro cifras decimales, se lleva a cabo la conversión binaria 65536 = 2 dieciséis < 13 × 1 0 4 < 2 17 = 131072 65536 = 2 ^ {16} <13 \ times 10 ^ 4 <2 ^ {17} = 131 072 entonces la longitud del código binario es 17
  • El método de decodificación: si x es el intervalo [a, b], x es codificado en binario (a_0, a_1, ... a_n-1, a_n) es de longitud n + 1, entonces el número decimal ( 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 \ ocasiones2 ^ i) _ {10} = suma x = a + s u m × ( b a ) / ( 2 n + 1 1 ) x = a + sum \ times (BA) / (2 ^ {n + 1} -1)
población inicial
%% 初始化种群
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);
la decodificación

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
Seleccionar (ruleta método de selección de rueda)
%  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
Crossover (cruce de un solo punto)
%  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
variación
%  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
proceso iterativo
%  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
Los resultados muestran
%  date:201935%  Author: Chauncy_xu
%% 绘图显示结果
disp(sprintf('%.6f',num(gen)));
disp(sprintf('x=%.5f,y=%.5f',x_1,x_2));
figure
plot(num,'k');
Ejemplos

Aquí Insertar imagen Descripción

Publicado 37 artículos originales · ganado elogios 17 · vistas 2597

Supongo que te gusta

Origin blog.csdn.net/qq_44384577/article/details/104613040
Recomendado
Clasificación