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