遗传算法 / Genetic Algorithm

4月 30, 2024·
Junhong Liu
Junhong Liu
· 2 分钟阅读时长

遗传算法主函数

k1为遗传进化总代数,k2为计算机显示控制数 m为群体规模,n为染色体长度,t为交叉算子选择位 pc为交叉概率,pm为变异概率,[a,b] 为解码取值范围 A为进化结束后群体,xx为对应解码,yy为目标函数值

function [A,xx,yy] = genetic_algorithm(k1,k2,m,n,t,pc,pm,a,b)
%{
k1为遗传进化总代数,k2为计算机显示控制数
m为群体规模,n为染色体长度,t为交叉算子选择位
pc为交叉概率,pm为变异概率,[a,b]为解码取值范围
A为进化结束后群体,xx为对应解码,yy为目标函数值
%}
A = round(rand(m,n)); %生成遗传基因
% round()函数用于取最接近的整数
% rand())函数用于产生由在(0, 1)之间均匀分布的随机数组成的数组。
for k = 1:k1
    [g,f] = fun_fitness(A,n,a,b);%计算适应度函数
    A = fun_selection(A,g,m,n);%选择算子
    A = fun_crossover(A,t,n,pc);%交叉算子
    A = fun_mutation(A,pm); %变异算子
    if mod(k,k2) == 0
        [xx,yy] = fun_value(A,n,a,b); %函数值计算
        k
        dispx = xx'
        dispy = yy'
    end
end
[xx,yy] = fun_value(A,n,a,b);
%[A,xx,yy] = genetic_algorithm(500,100,10,17,9,0.8,0.01,0,10)

适应度函数,用于计算A中各染色体的个体适应度

n为染色体长度,**[a,b]**为变量取值范围,g为适应值,f为目标函数值

function [g,f] = fun_fitness(A,n,a,b)
%适应度函数,用于计算A中各染色体的个体适应度
%n为染色体长度,[a,b]为变量取值范围,g为适应值,f为目标函数值
[p,~] = size(A);
f = zeros(p,1);
g = zeros(p,1);
vx = fun_decode(A,n,a,b); % 解码操作
for i = 1:p
     x = vx(i);
     f(i,1) = 8*sin(5*x)+5*cos(4*x); %目标函数值
end

fmin = min(f);
for i = 1:p
    g(i,1) = f(i)-fmin+1; %适应度函数值
end

选择算子

按个体适应度F从种群A中选取m个形成种群B,n为基因编码长度

function B = fun_selection(A,F,m,n)
%选择算子。按个体适应度F从种群A中选取m个形成种群B,n为基因编码长度
[p,~] = size(A);
B = zeros(m,n);
s = sum(F); % 默认对每列进行求和
F = cumsum(F)/s; %cumsum()函数计算元素累加值,默认对每列进行累加
rr = rand(1,m); %
for k=1:m
    if rr(k)<F(1)
        w = 1;
    else
        con = 1;
        t = 2;
        while t <= p && con == 1 %&&与
            if rr(k)<F(t) && rr(k)>=F(t-1)
                w = t;
                con = 0;
            end
            t = t+1;
        end
    end
    B(k,:) = A(w,:);
    %D(k) = w;
end

交叉算子,单点交叉操作。

k表示选择位,n表示总位数,r表示交叉概率

function B = fun_crossover(A,k,n,r)
%交叉算子,单点交叉操作。k表示选择位,n表示总位数,r表示交叉概率
[p,q] = size(A);
B = zeros(p,q);
R = rand(p,1);
for i = 1:2:p
    if R(i)<r
        a = A(i,:);
        b = A(i+1,:);
        a1 = a(1:k-1);
        a2 = a(k:n);
        b1 = b(1:k-1);
        b2 = b(k:n);
        B(i,:) = [a1,b2];
        B(i+1,:) = [b1,a2];
    else
        B(i,:) = A(i,:);
        B(i+1,:) = A(i+1,:);
    end
end

变异算子

以变异概率r对种群A中基因进行变异操作

function A = fun_mutation(A,r)
%变异算子,以变异概率r对种群A中基因进行变异操作
[p,q] = size(A);
B = rand(p,q);
for i = 1:p
    for j = 1:q
        if B(i,j)<r
            if A(i,j) == 1
                A(i,j)=0;
            else
                A(i,j) = 1;
            end
        end
    end
end

函数值计算

n为染色体长度,**[a,b]**为变量取值范围,xx为染色体解码,yy为目标函数

function [xx,yy] = fun_value(A,n,a,b)
%函数值计算
%n为染色体长度,[a,b]为变量取值范围,xx为染色体解码,yy为目标函数
[p,q] = size(A);
xx = fun_decode(A,n,a,b);
yy = zeros(p,1);
for i=1:p
    x = xx(i);
    yy(i,1) = 8*sin(5*x)+5*cos(4*x);
end

解码操作

将二进制基因编码转换为在**[a,b]**内对应的十进制数值,n为染色体长度

function d = fun_decode(A,n,a,b)
% 解码操作,将二进制基因编码转换为在[a,b]内对应的十进制数值,n为染色体长度
[p,~] = size(A); %p为矩阵行数,q为矩阵列数
d = zeros(p,1);
for k = 1:p
    x = A(k,:);
    ss = 0;
    for i = 1:n
        ss = ss + x(i)*2^(n-i);
    end
    d(k,1) = a + ss*(b-a)/(2^n-1);
end