如何在阵列中交换行的一部分?

时间:2013-02-13 20:16:58

标签: matlab for-loop swap genetic-algorithm memory-efficient

我正在编写一个简单的Genetic Algorithm(GA)代码。可能有无数区域我不必要地使用for循环。我想了解一些如何提高MATLAB效率以及回答我的问题的技巧。据我所知,我已经成功,但我不确定。此代码定义的区域是单点crossover

这是我尝试过的......

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'是单点交叉的点 两个二进制编码chromosomes之间是必需的。
  • 'popSize'是我的代码所需的population的大小 是一个偶数
  • 'isolate'定义了需要交换的2行部分 彼此
  • 'chromoParent'是必需的初始人口 由单点交叉改变
  • 'chromoChild'是由此产生的人口
  • 'chromoParent'和'chromoChild'都由数组表示 size,popSize x 25二进制字符

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

谢谢。

1 个答案:

答案 0 :(得分:2)

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

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

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