Main Content

本页采用了机器翻译。点击此处可查看英文原文。

向量化适应度函数

向量化以提高速度

如果对适应度函数进行向量化,遗传算法通常运行得更快。这意味着遗传算法只调用一次适应度函数,但期望适应度函数一次计算当前种群中所有个体的适应度。要向量化适应度函数,

  • 编写计算函数的文件,使其接受具有任意多行的矩阵,对应于种群中的个体。例如,对函数进行向量化

    f(x1,x2)=x122x1x2+6x1+x226x2

    使用以下代码写入文件:

    z =x(:,1).^2 - 2*x(:,1).*x(:,2) + 6*x(:,1) + x(:,2).^2 - 6*x(:,2);

    x 第一个条目中的冒号表示 x 的所有行,因此 x(:, 1) 是一个向量。.^.* 运算符对向量执行逐元素运算。

  • 在命令行中,使用 optimoptionsUseVectorized 选项设置为 true

  • 优化实时编辑器任务中,确保算法设置 > 评估函数向量化设置有复选标记。

    Evaluate functions vectorized shows a check mark

注意

适应度函数和任何非线性约束函数必须接受任意数量的行才能使用 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 的对应向量是种群向量,它们始终是行。

相关主题