我应该如何并行化我的遗传算法适应度评估?

时间:2021-01-16 20:18:28

标签: matlab parallel-processing

我有自己开发的 GA 代码。由于我是编码新手,我的代码并不快。我有一个双核 CPU 2.6GHz。 唯一需要很长时间运行的代码行是适应度函数。我不熟悉 GA 工具箱,我的适应度函数非常复杂,所以我假设即使我知道如何使用 GA 工具箱,我也必须自己编写适应度函数。 该算法的结构如下: 在生成初始代并评估适应度值(这需要很长时间但并不重要,因为这只运行一次)后,它会启动一个循环,最多可迭代 10000 次。在每次迭代中,我们都有一个需要计算适应度值的新一代。所以当新一代 50 个人产生时,整代人都被喂给了适应度函数。在这个函数中有一个 for 循环,它计算每 50 个个体的适应度值(因此 for 循环迭代 50 次)。这是我的问题。我应该如何使用parfor,以便一个CPU内核评估25个人,而另一个内核评估其他25个人,从而使计算时间减少到几乎一半。我已经从这里知道了

我尝试将 Fitness_function 中的 for 循环直接更改为 parfor,但收到以下错误:“由于使用变量“Z”的方式,PARFOR 循环无法运行。和“变量 z 以不同的方式索引。可能会导致迭代之间的依赖关系。”变量 Z 是一个 50*3 的矩阵,用于存储每个个体的适应度值。

1 个答案:

答案 0 :(得分:0)

您对 Z 赋值的问题在于您有三个不同的赋值语句,这是不允许的。您需要使分配到 Z 满足 "sliced" variable 的要求。最简单的方法是创建一个临时变量 Zrow 来存储 i 的第 Z 行的值,然后进行一次赋值,就像这样

parfor i = 1:50
    Zrow = zeros(1, 3); % allocate to ensure parfor knows this is a temporary
    ...
    Zrow(1) = TTT;
    ...
    Zrow(2) = sum(FSL,1);
    Zrow(3) = 0.5*Z(i,1)+0.5*Z(i,2);
    % Finally, make a single sliced assignment into Z
    Z(i, :) = Zrow;
end

此外,一般来说,最好将 parfor 循环放在最外面的循环。此外,parfor 是否真的给您带来任何加速在很大程度上取决于循环体是否已经通过 MATLAB 的内置多线程功能进行了多线程处理。 (如果是,那么 parfor 仅使用您的本地机器无法加快速度,因为在这种情况下,多线程代码已经充分利用了您的计算机资源)。

相关问题