主要内容

编码和最小化使用遗传算法的适应度函数

这个例子展示了如何创建和最小化适应度函数的遗传算法解算器遗传算法使用三种技术:

  • 基本

  • 包括额外的参数

  • 矢量化的速度

基本的适应度函数

基本的适应度函数。函数,常用的测试函数的优化。平方和函数是:

f ( x ) = 1 0 0 ( x 1 2 - - - - - - x 2 ) 2 + ( 1 - - - - - - x 1 ) 2

函数的最小值为零的点[1]。因为。函数非常陡峭,1 +的对数函数的阴谋。

fsurf (@ (x, y)日志(1 + 100 * (x。^2- - - - - -y)。^2+(1- - - - - -x).^2),[0,2]) title(的日志(1 + 100 * (x (1) ^ 2 - x (2)) ^ 2 + (1 - x (1)) ^ 2)”)视图(-13,78)h1 = plot3 (1, - 1, 0.1,的r *,“MarkerSize”12);传奇(h1,“最低”,“位置”,“最佳”);持有

适应度函数的代码

simple_fitness函数文件实现。海涅的函数。

类型simple_fitness
函数y = simple_fitness (x) % simple_fitness为GA适应度函数%版权2004年MathWorks公司y = 100 * (x (1) ^ 2 - x (2)) ^ 2 + (1 - x (1)) ^ 2;

一个适应度函数必须采取一个输入x在哪里x是一个行向量和尽可能多的元素数量的变量的问题。函数的适应度函数计算值并返回标量值的返回参数之一y

尽量减少使用遗传算法

尽量减少使用适应度函数遗传算法适应度函数,通过函数句柄以及变量的数量问题。有遗传算法检查相关的区域,包括边界3 < = x (i) < = 3。通过边界作为第五和第六参数numberOfVariables。为遗传算法语法细节,请参阅遗传算法

遗传算法是一个随机算法。再现性,设置随机数流。

rng默认的%的再现性FitnessFunction = @simple_fitness;numberOfVariables = 2;磅= (3 3);乌兰巴托= (3 3);[x, fval] = ga (FitnessFunction numberOfVariables,[],[],[],[],磅,乌兰巴托)
优化终止:超过了一代又一代的最大数目。
x =1×21.5083 - 2.2781
fval = 0.2594

x返回的解算器是最好的点在最后人口计算遗传算法。的fval函数的值吗simple_fitness评估在点x遗传算法没有发现一个特别好的解决方案。如何改善解决方案,请参阅遗传算法选择的影响

适应度函数与其他参数

有时你的适应度函数有额外的参数作为常量在优化。例如,广义。海涅的函数可以有额外的参数表示常量100 - 1:

f ( x , 一个 , b ) = 一个 ( x 1 2 - - - - - - x 2 ) 2 + ( b - - - - - - x 1 ) 2

一个b对适应度函数作为参数常量在优化(他们并不像最小化的一部分)的变化。的parameterized_fitness.m文件实现了参数化的适应度函数。

类型parameterized_fitness
函数y = parameterized_fitness (x, p1, p2) % parameterized_fitness为GA适应度函数%版权2004年MathWorks公司y = p1 * (x (1) ^ 2 - x (2)) ^ 2 + (p2 - x (1)) ^ 2;

减少使用额外的参数

使用一个匿名函数来捕获附加参数的值,即常量一个b。创建一个函数处理FitnessFunction一个匿名函数,需要一个输入x,并调用parameterized_fitnessx,一个,b。匿名函数包含了a和b的值创建函数处理时存在的。

一个= 100;b = 1;%定义常量值FitnessFunction = @ (x) parameterized_fitness (x, a, b);[x, fval] = ga (FitnessFunction numberOfVariables,[],[],[],[],磅,乌兰巴托)
优化终止:超过了一代又一代的最大数目。
x =1×21.3198 - 1.7434
fval = 0.1025

看到传递额外的参数

矢量化适应度函数

获得速度,vectorize你的健身功能。健身的矢量化适应度函数计算点的集合,通常在评估这些点分别节省时间。写一个矢量化适应度函数,函数接受一个矩阵,矩阵的每一行代表一个点,适应度函数返回一个列向量的适应度函数值。

改变parameterized_fitness函数文件矢量化形式:

  • 改变每个变量x(我)x(:,我),这意味着变量对应的列向量x(我)

  • 改变每个向量乘法*。*并且每个取幂^。^element-wise指示操作。没有向量乘法在这段代码中,所以简单地改变指数。

类型vectorized_fitness
函数y = vectorized_fitness (x, p1, p2) % vectorized_fitness为GA适应度函数% 2004 - 2010版权MathWorks, inc . y = p1 * (x (: 1)。^ 2 - x (:, 2))。^2+(p2 - x(:,1)).^2;

向量化的适应度函数矩阵x与任意数量的点,意义和任意数量的行,并返回一个列向量y具有相同的行数x

告诉适应度函数的解算器的矢量化“UseVectorized”选择。

选择= optimoptions (@ga,“UseVectorized”,真正的);

包括选择作为最后一个参数遗传算法

VFitnessFunction = @ (x) vectorized_fitness (x, 100年,1);[x, fval] = ga (VFitnessFunction numberOfVariables,[],[],[],[],磅,乌兰巴托,[],选项)
优化终止:超过了一代又一代的最大数目。
x =1×21.6219 - 2.6334
fval = 0.3876

速度的差异是什么?时间的优化都有或没有向量化。

抽搐[x, fval] = ga (VFitnessFunction numberOfVariables,[],[],[],[],磅,乌兰巴托,[],选项);
优化终止:超过了一代又一代的最大数目。
v = toc;抽搐[x, fval] = ga (FitnessFunction numberOfVariables,[],[],[],[],磅,乌兰巴托);
优化终止:超过了一代又一代的最大数目。
nv = toc;流(“使用向量化了% f秒。没有向量化了% f秒。\ n ',v, nv)
使用向量化了0.153337秒。没有向量化了0.212880秒。

在这种情况下,通过向量化改进并不大,因为计算适应度函数需要很少的时间。然而,对于更费时的健身功能,向量化是很有帮助的。看到Vectorize健身功能

相关的话题

Baidu
map