私は自分の研究で遺伝的アルゴリズムを頻繁に使用していますが、ゲノムに対して遺伝的操作を実行する最善の方法について興味深い質問に出くわしました。f(x,y) = a x^n + b x^n-1 + ... + c y^m + d y^m-1 ...などで定義された関数があるとします。それは単なる多変数です計算するのにいくらかコストがかかる関数なので、遺伝的操作をできるだけ効率的にしようとしています。
ゲノムのバイナリ表現を使用している場合、遺伝操作を実行するには2つの合理的な方法があることがわかりました。クロスオーバーステージだけ見てみましょう。
以下は、Matlab でのベクトル化されたトーナメント選択のコードです (変数名のコンテキスト用)。
%% Tournament Selection
T = round(rand(2*popSize,S)*(popSize-1)+1); % Tournaments
[~,idx] = max(F(T),[],2); % Index of Winners
W = T(sub2ind(size(T),(1:2*popSize)',idx)); % Winners
したがって、最適化されている2つの異なる変数があり、私の質問は、遺伝的操作を分割して、各変数に個別にクロスオーバーを適用し、配列を連結して戻すことで、2点の場合は次のようになりますか?クロスオーバー:
%% 2 Point Crossover
Pop2 = Pop(W(1:2:end),:); % Set Pop2 = Pop Winners 1
P2A = Pop(W(2:2:end),:); % Assemble Pop2 Winners 2
% Split Pop2 for x and y genomes
xPop2 = Pop2(:,1:genome/2);
yPop2 = Pop2(:,genome/2 + 1:end);
% Split P2A for x and y genomes
xP2A = P2A(:,1:genome/2);
yP2A = P2A(:,genome/2+2:end);
% For x genome
Ref = ones(popSize,1)*(1:genome/2); % Reference Matrix
CP = sort(round(rand(popSize,2)*(genome/2-1)+1),2); % Crossover Points
xidx = CP(:,1)*ones(1,genome/2)<Ref & CP(:,2)*ones(1,genome/2)>Ref; % Logical Index
xPop2(xidx) = xP2A(xidx); % Recombine Winners
% For y genome
Ref = ones(popSize,1)*(1:genome/2); % Reference Matrix
CP = sort(round(rand(popSize,2)*(genome/2-1)+1),2); % Crossover Points
yidx = CP(:,1)*ones(1,genome/2)<Ref & CP(:,2)*ones(1,genome/2)>Ref; % Logical Index
yPop2(yidx) = yP2A(yidx); % Recombine Winners
Pop2 = horzcat(xPop2,yPop2);
P2A = horzcat(xP2A,yP2A);
または、ゲノムを単一のクロスオーバー操作として扱い、次のように単一の変数ゲノムであるかのように 2 点クロスオーバーを実行します。
Pop2 = Pop(W(1:2:end),:); % New Pop is Winners of old Pop
P2A = Pop(W(2:2:end),:); % Assemble Pop2 Winners 2
Ref = ones(popSize,1)*(1:genome); % Ones Matrix
CP = sort(round(rand(popSize,2)*(genome-1)+1),2); % Crossover Points
idx = CP(:,1)*ones(1,genome)<Ref&CP(:,2)*ones(1,genome)>Ref; % Index
Pop2(idx)=P2A(idx); % Recombine Winners
ゲノムを表す 2 つの異なる方法の違いを示す研究が行われたことを知っている人はいますか? それについて公開されているものを見つけることができませんでしたが、Googleで質問をインテリジェントに表現する方法を知らなかったためかもしれません.
ありがとう