向量化适应度函数
向量化以提高速度
如果对适应度函数进行向量化,遗传算法通常运行得更快。这意味着遗传算法只调用一次适应度函数,但期望适应度函数一次计算当前种群中所有个体的适应度。要向量化适应度函数,
编写计算函数的文件,使其接受具有任意多行的矩阵,对应于种群中的个体。例如,对函数进行向量化
使用以下代码写入文件:
z =x(:,1).^2 - 2*x(:,1).*x(:,2) + 6*x(:,1) + x(:,2).^2 - 6*x(:,2);
x
第一个条目中的冒号表示x
的所有行,因此x(:, 1)
是一个向量。.^
和.*
运算符对向量执行逐元素运算。在命令行中,使用
optimoptions
将UseVectorized
选项设置为true
。在优化实时编辑器任务中,确保算法设置 > 评估函数向量化设置有复选标记。
注意
适应度函数和任何非线性约束函数必须接受任意数量的行才能使用 Vectorize 选项。即使在向量化计算期间,ga
有时也会评估单行。
以下在命令行运行的比较显示了向量化带来的速度的提高。函数 fun
是拉斯特里金函数的向量化版本;请参阅 最小化拉斯特里金函数。
fun = @(pop)10.0 * size(pop,2) + sum(pop .^2 - 10.0*cos(2*pi.*pop),2); options = optimoptions('ga','PopulationSize',2000); tic ga(fun,20,[],[],[],[],[],[],[],options); toc
Optimization terminated: maximum number of generations exceeded. Elapsed time is 2.511456 seconds.
options = optimoptions(options,'UseVectorized',true);
tic;
ga(fun,20,[],[],[],[],[],[],[],options);
toc
Optimization terminated: maximum number of generations exceeded. Elapsed time is 1.451496 seconds.
向量化约束
如果存在非线性约束,目标函数和非线性约束都需要向量化,以便算法以向量化的方式计算。
向量化目标和约束函数 包含如何为求解器 patternsearch
对两者进行向量化的示例。对于 ga
来说,语法几乎相同。唯一的区别是 patternsearch
的模式可以作为行或列向量出现;ga
的对应向量是种群向量,它们始终是行。