这个例子展示了如何为遗传算法求解器创建和最小化适应度函数遗传算法
使用三种技术:
基本
包括额外的参数
矢量化的速度
基本适应度函数是Rosenbrock函数,这是优化器常用的测试函数。函数是平方和:
函数在这一点上的最小值为零[1]
.因为罗森布罗克函数很陡峭,画出1加函数的对数。
fsurf (@ (x, y)日志(1 + 100 * (x。^2-y).^2+(1-x).^2),[0,2]) title(log(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
函数文件实现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;磅= (3 3);乌兰巴托= (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
MathWorks, Inc. y = p1 * (x(1)^2 - x(2)) ^2 + (p2 - x(1))^2;
使用匿名函数来捕获附加参数的值,即常量一个
和b
.创建一个函数句柄FitnessFunction
到接受一个输入的匿名函数x
,并调用parameterized_fitness
与x
,一个
,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(我)
.
改变每个向量乘法*
来.*
并且每个取幂^
来.^
指示操作是按元素进行的。这段代码中没有向量乘法,所以只需更改指数。
类型vectorized_fitness
function y = vectorized_fitness(x,p1,p2) % vectorized_fitness fitness function for GA %^ 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秒。
在这种情况下,矢量化的改进并不大,因为计算适应度函数的时间非常短。然而,对于更耗时的适应度函数,矢量化是有帮助的。看到向适应度函数向量化.