1

我正在编写一个简单的遗传算法(GA)。可能有无数地方我不必要地使用了for循环。我想要一些关于如何提高 MATLAB 效率的提示以及我的问题的答案。据我所知,我已经成功了,但我不确定。这段代码定义的区域是单点交叉

这是我尝试过的...

crossPoints=randi([1 24],popSize/2,1);

for popNo=2:2:popSize
    isolate=chromoParent(popNo-1:popNo,crossPoints(popNo/2,1)+1:end);
    isolate([1 2],:)=isolate([2 1],:);
    chromoParent(popNo-1:popNo,crossPoints(popNo/2,1)+1:end)=isolate;
end

chromoChild=chromoParent;
  • 其中,“crossPoints”是两个二进制编码染色体之间需要单点交叉的点。
  • 'popSize' 是人口的大小,我的代码要求为偶数
  • 'isolate' 定义了需要相互交换的 2 行的部分
  • 'chromoParent' 是需要通过单点交叉改变的初始种群
  • 'chromoChild' 是结果人口
  • 'chromoParent' 和 'chromoChild' 都由一个大小为 popSize x 25 二进制字符的数组表示

你能在我思考这个问题的方式中发现一个错误吗?什么是最有效的方式(在计算时间)来实现同样的事情?如果您可以尽可能广泛,这将有所帮助,以便我可以开始将我在这里学到的原则应用到我的其余代码中。

谢谢你。

4

1 回答 1

2

你的代码看起来不错。如果需要,可以通过一些非常简单的索引将循环中的指令减少到一行:

chromoParent(   popNo-1:popNo,   crossPoints(popNo/2,1)+1:end) = ...
   chromoParent(popNo:-1:popNo-1,crossPoints(popNo/2,1)+1:end);

这可能会稍微快一些,但与任何优化一样,您应该首先对其进行分析(我的猜测是这些行对整体 CPU 时间的贡献很小)。

于 2013-02-13T22:07:16.373 回答