利用遗传算法对适应度函数进行编码和最小化
这个例子展示了如何为遗传算法求解器创建和最小化适应度函数遗传算法
使用三个技巧:
基本
包括附加参数
矢量化的速度
基本适应度函数
基本适应度函数是Rosenbrock函数,这是优化器常用的测试函数。函数是平方和:
函数在这一点上的最小值为零[1]
.因为Rosenbrock函数很陡,画出1加函数的对数。
fsurf(@(x,y)log(1 + 100*(x,y))^2-y).^2+(1-x).^2),[0,2]) title('log(1 + 100*(x(1)²- x(2))²+ (1 - x(1))²)')视图(-13,78)保持在H1 = plot3(1,1,0.1,的r *,“MarkerSize”12);传奇(h1,“最低”,“位置”,“最佳”);持有从
适应度函数代码
的simple_fitness
函数文件实现了Rosenbrock函数。
类型simple_fitness
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;Lb = [-3,-3];Ub = [3,3];[x, fval] = ga (FitnessFunction numberOfVariables ,[],[],[],[], 磅,乌兰巴托)
优化终止:超过最大代数。
x =1×21.5083 - 2.2781
Fval = 0.2594
的x
由求解器返回的是由计算的最终总体中的最佳点遗传算法
.的fval
函数的值是多少simple_fitness
在这一点上求值x
.遗传算法
没有找到特别好的解决办法。有关改进解决方案的方法,请参见遗传算法选项的影响.
附加参数的适应度函数
有时你的适应度函数有额外的参数,在优化过程中充当常数。例如,一个广义Rosenbrock函数可以有额外的参数来表示常数100和1:
一个
而且b
是适应度函数的参数,在优化过程中作为常数(它们不会作为最小化的一部分而变化)。的parameterized_fitness.m
文件实现了这个参数化适应度函数。
类型parameterized_fitness
版权所有2004 The MathWorks, Inc. y = p1 * (x(1)^2 - x(2)) ^2 + (p2 - x(1))^2;
尽量减少使用附加参数
使用匿名函数捕获附加参数的值,即常量一个
而且b
.创建一个函数句柄FitnessFunction
到接受一个输入的匿名函数x
,和呼叫parameterized_fitness
与x
,一个
,b
.匿名函数包含函数句柄创建时存在的值a和b。
A = 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(我)
.改变每个向量的乘法
*
来.*
每次取幂^
来.^
指示操作是按元素进行的。这段代码中没有矢量乘法,所以只需改变指数。
类型vectorized_fitness
函数y = vectorized_fitness(x,p1,p2) % vectorized_fitness fitness函数for GA %版权所有2004-2010 The 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秒。
在这种情况下,向量化的改进并不大,因为计算适应度函数所需的时间非常短。然而,对于更耗时的适应度函数,向量化是有用的。看到向量化适应度函数.