matlab で NSGA-II を使用した多目的最適化の初期母集団として行列を使用しています。私の染色体ベクトル (C) のサイズは であり1x192
、各遺伝子は範囲内に0<=gene<=40
あり、遺伝子は整数でなければなりません。ルールは、6 つの遺伝子のグループの合計が 40 以下でなければならないということです。つまり:
sum(reshape(6,[]))<=40
次のコードを使用しましたが、すべてゼロの人口行列 (人口行列 = 500 染色体の垂直連結) または規則を満たさない行列のいずれかを出力します。
X=zeros(500,192);
while i<501
r=randi(40,6,32);
if nnz(((sum(r))./40)>1)==0
X(i,:)=reshape(r,1,[]);
i=i+1;
clear r;
else
clear r;
end
end
また、while ループを終了するのにも時間がかかります。ここで何が間違っていますか?上記を行う別の方法はありますか?
私もこれを試しました:
i=1;
while i<17500
r=randi([1,40],6,1);
s=sum(r);
if s<=40
X(:,i)=r;
i=i+1;
else
clear r;
end
end
X=unique(X','rows')';
A=X(:,randperm(size(X,2)));
A=X(randperm(size(X,1)),:);
上記は、人口行列に再形成されるランダムな列を作成しようとします。しかし、数字は繰り返されています。つまり、17500 (重複した列を削除した後は 16448) の列には、37 と 40 の数字はありません。生成された乱数の拡散を最適化する方法はありますか?
@ 0x90 サイズの「染色体」と呼ばれるベクトルがあり、1x192
連続する 6 メンバーの各グループ (表現型と呼ばれる) の合計は 40 以下でなければなりません。より明確にするために:
つまり、各 P は 0 から 40 までの範囲の整数でなければならず、各表現型の合計は <=40 でなければなりません。このような染色体が500個必要です。
今はそれが理にかなっていることを願っています。><