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」は、バイナリ コード化された 2 つの染色体間の単一ポイント クロスオーバーが必要なポイントです。
  • 'popSize' は母集団のサイズであり、私のコードでは偶数である必要があります
  • 'isolate' は、互いに交換する必要がある 2 つの行のセクションを定義します
  • 「chromoParent」は、一点交叉によって変更する必要がある初期集団です
  • 'chromoChild' は、結果の母集団です。
  • 'chromoParent' と 'chromoChild' は両方とも、popSize x 25 バイナリ文字のサイズの配列で表されます

この問題について私が考えている方法に間違いを見つけられますか? 同じことを達成するための最も効率的な方法 (計算時間) は何ですか? ここで学んだ原則をコードの残りの部分に適用し始めることができるように、可能な限り広く教えていただけると助かります。

ありがとうございました。

4

1 に答える 1

2

あなたのコードは問題ないようです。必要に応じて、非常に単純なインデックス付けによって、ループ内の命令を 1 行に減らすことができます。

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 に答える