1

MATLAB で簡単な BB-BC を実装したいのですが、問題があります。
初期集団を生成するコードは次のとおりです。

pop = zeros(N,m);
for j = 1:m
    % formula used to generate random number between a and b
    %   a + (b-a) .* rand(N,1)
   pop(:,j) = const(j,1) + (const(j,2) - const(j,1)) .* rand(N,1);
end  

const(mx2)制御変数の制約を保持する行列です。mは制御変数の数です。ランダムな初期集団が生成されます。
これは、各反復で重心を計算するコードです

sum = zeros(1,m);
sum_f = 0;
for i = 1:N
    f = fitness(new_pop(i,:));
    %keyboard
    sum = sum + (1 / f) * new_pop(i,:);
    %keyboard
    sum_f = sum_f + 1/f;
    %keyboard
end
CM = sum / sum_f;

new_popは、反復ごとに新しく生成された母集団を保持し、 で初期化されpopます。行列です
CM。生成中の各粒子の適合値を与える関数です。適合度を下げると、粒子が良くなります。 各反復で新しい母集団を生成するコードは次のとおりです。1xm
fitness

for i=1:N
    new_pop(i,:) = CM + rand(1) * alpha1 / (n_itr+1) .* ( const(:,2)' - const(:,1)');
end

alpha1です0.9

問題は、反復のためにコードを実行することです100が、フィットネスが減少して負になることです。すべての粒子が検索空間にあり、そこにもあるはずなので、まったく起こらないはずですがCM、限界をはるかに超えています。
たとえば、これが限界 ( m=4) の場合:

const = [1 10;
     1 9;
     0 5;
     1 4];

次に実行すると、次のようになりCMます。

57.6955   -2.7598   15.3098   20.8473

これはすべての限界を超えています。私は自分のコードで
制限しようとしましたが、その後、すべての上部境界に固執し、この例では=を与えますCMCM

10     9     5     4

私は混乱しています。私の実装に何か問題がありますか、それとも BB-BC に何か問題があることを理解していますか?

4

0 に答える 0