Matlab 遗传算法的初学者实现

Matlab 遗传算法的初学者实现,matlab,mathematical-optimization,genetic-algorithm,genetic-programming,Matlab,Mathematical Optimization,Genetic Algorithm,Genetic Programming,我最近对遗传算法很感兴趣,并试图作为初学者编写一个简单的遗传算法代码来理解它。我取了一个函数f(x)=x^2,希望在域{0,1,….31}上最小化它。现在我知道最佳值是31,但我想用GA实现它,所以我写了一个代码。我想知道(I)我的代码是否接近遗传算法的功能,(ii)如果它是一个优秀的初学者级别的代码,那么在这方面可以做些什么改进,(iii)因为在这个问题中,我知道值应该是31,但我的遗传算法何时停止?,(iv)算法是否真的依赖于随机数生成,因此,我只能在第一次迭代中偶然得到解决方案,因此有时可

我最近对遗传算法很感兴趣,并试图作为初学者编写一个简单的遗传算法代码来理解它。我取了一个函数
f(x)=x^2
,希望在域
{0,1,….31}
上最小化它。现在我知道最佳值是
31
,但我想用GA实现它,所以我写了一个代码。我想知道(I)我的代码是否接近遗传算法的功能,(ii)如果它是一个优秀的初学者级别的代码,那么在这方面可以做些什么改进,(iii)因为在这个问题中,我知道值应该是
31
,但我的遗传算法何时停止?,(iv)算法是否真的依赖于随机数生成,因此,我只能在第一次迭代中偶然得到解决方案,因此有时可能会产生误导,所以应该检查所有参数。这是我的原始代码(请原谅,这是我第一次尝试)

%最大化函数f(x)=x^2;
%在域[0,31]中使用遗传算法;
%我们将4个初始候选项作为解决方案,仅5位
x=兰特(1,20);

A=(x现在,我还没有完全理解您的代码,尽管从您对问题的描述和提供的代码的一瞥来看,我认为您需要重新审视GAs的一些基本概念

  • 您的群体不是遗传编码的。您尚未定义基因型(遗传表示)到表型(遗传编码基因型转换为的功能)的遗传转换。下面是一个示例:让我们重新使用您的遗传搜索空间,它被描述为[0;31]范围内的整数.您的基因编码是将基因型(本例中为整数)转换为函数,例如:f(a)=ax^2-a
  • 当你的适应度函数返回一个可以解释为适应度的值时,它不是一个合法的适应度函数,因为你的适应度函数的输入不是一个函数。例如,当重复使用上面的遗传编码时,是一个适当的适应度函数,f(a)之间的均方误差的计算对于[0;10]之间的x,x^3+x^2
  • GAs的另一个基本概念是突变一个基因型或跨越两个基因型的定义方式。突变GA的一个例子是在-5和5之间添加一个随机值。跨越两个基因型的一个例子是两者的平均值
  • 遗传算法通常是一种基于群体的优化方法,因此你必须定义多个基因型,比较它们的适合度,有选择地繁殖(变异和交叉)适合的基因型,并在每个基因创造中去除低性能的基因型
  • 回答你的两个具体问题:遗传算法和它的基因型搜索空间一样是无限的。因为在你的例子中基因型搜索空间是有限的,所以遗传算法在搜索空间耗尽时会停止。遗传算法在很大程度上也是基于随机性的。因此,可以在第一代中找到最佳解决方案
如果你想了解一些关于神经进化的基本概念(基本上是遗传算法,所有基因型都必须转化为人工神经网络),请点击无耻插件:

现在,我还没有完全理解您的代码,尽管从您对问题的描述和所提供代码的一瞥来看,我认为您需要重新审视GAs的一些基本概念

  • 您的群体不是遗传编码的。您尚未定义基因型(遗传表示)到表型(遗传编码基因型转换为的功能)的遗传转换。下面是一个示例:让我们重新使用您的遗传搜索空间,它被描述为[0;31]范围内的整数.您的基因编码是将基因型(本例中为整数)转换为函数,例如:f(a)=ax^2-a
  • 当你的适应度函数返回一个可以解释为适应度的值时,它不是一个合法的适应度函数,因为你的适应度函数的输入不是一个函数。例如,当重复使用上面的遗传编码时,是一个适当的适应度函数,f(a)之间的均方误差的计算对于[0;10]之间的x,x^3+x^2
  • GAs的另一个基本概念是突变一个基因型或跨越两个基因型的定义方式。突变GA的一个例子是在-5和5之间添加一个随机值。跨越两个基因型的一个例子是两者的平均值
  • 遗传算法通常是一种基于群体的优化方法,因此你必须定义多个基因型,比较它们的适合度,有选择地繁殖(变异和交叉)适合的基因型,并在每个基因创造中去除低性能的基因型
  • 回答你的两个具体问题:遗传算法和它的基因型搜索空间一样是无限的。因为在你的例子中基因型搜索空间是有限的,所以遗传算法在搜索空间耗尽时会停止。遗传算法在很大程度上也是基于随机性的。因此,可以在第一代中找到最佳解决方案
如果你想了解一些关于神经进化的基本概念(基本上是遗传算法,所有基因型都必须转化为人工神经网络),请点击无耻插件:

%Maximize the function f(x)=x^2;
% Using GA in the domain [0,31];

% We take 4 initial candidates as solutions only 5 bits
x=rand(1,20);
A=(x<0.5);


% Checking for randomness
A=reshape(A,4,[]) ;

B_DEC=bi2de(A,'left-msb');
Y=B_DEC.^2;
%FIT=B_dec./sum(B_dec(:))% Fitness function
for loop=1:3


    [~,index]=sort(Y,'descend');
    B_DEC=B_DEC(index)   ; % Sorting the values
    FIT=B_DEC./sum(B_DEC(:));


    MATING_POOL(1:2)=B_DEC(1,:);
    MATING_POOL(3:4)=B_DEC(2:3,:);
    MATING_POOL=de2bi(MATING_POOL,'left-msb');

    CHOOSE=randi([3,4]);
    C=(rand(1,5)<0.5);
    ind=find(C>0);

    New(1,ind)=MATING_POOL(1,ind);
    ind=find(C<=0);
    New(1,ind)=MATING_POOL(CHOOSE,ind);


    C=(rand(1,5)<0.5)
    ind=find(C>0);

    New(2,ind)=MATING_POOL(CHOOSE,ind);
    ind=find(C<=0);
    New(2,ind)=MATING_POOL(1,ind);


    if mod(CHOOSE,4)==3
        C=(rand(1,5)<0.5);
        ind=find(C>0);

        New(3,ind)=MATING_POOL(2,ind);
        ind=find(C<=0);
        New(3,ind)=MATING_POOL(4,ind);


        C=(rand(1,5)<0.5);
        ind=find(C>0);

        New(4,ind)=MATING_POOL(4,ind);
        ind=find(C<=0);
        New(4,ind)=MATING_POOL(2,ind);

    else
        C=(rand(1,5)<0.5);
        ind=find(C>0);

        New(3,ind)=MATING_POOL(2,ind);
        ind=find(C<=0);
        New(3,ind)=MATING_POOL(3,ind);


        C=(rand(1,5)<0.5)
        ind=find(C>0);

        New(4,ind)=MATING_POOL(3,ind);
        ind=find(C<=0);
        New(4,ind)=MATING_POOL(2,ind);
    end

    B_dec=bi2de(New,'left-msb');

    Y=B_DEC.^2;
end