0

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個必要です。

今はそれが理にかなっていることを願っています。><

4

1 に答える 1

1

randi([min,max],n,m)を使用する必要があります。randint廃止予定です。

>> r = randi([1,4],3,2)

r =

     3     3
     2     2
     4     4
于 2013-03-27T19:41:53.187 に答える