【问题标题】:How can I swap a section of a row with another within an array?如何将行的一部分与数组中的另一部分交换?
【发布时间】:2013-02-13 20:16:58
【问题描述】:

我正在编写一个简单的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”都由一个数组表示 大小,popSize x 25 个二进制字符

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 不确定“您应该先对其进行分析”是什么意思。如果这是一个简单的概念,你能告诉我吗?或者,如果涉及更多,也许您可​​以向我指出一个很好的资源。谢谢。
    • @DeanKayton:当您分析代码时,您会测量每行的执行时间,这使您可以识别代码中的瓶颈。 Here's the documentation link to Matlab's profiler
    猜你喜欢
    • 2019-07-29
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多