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
これはすべての限界を超えています。私は自分のコードで
制限しようとしましたが、その後、すべての上部境界に固執し、この例では=を与えますCM
CM
10 9 5 4
私は混乱しています。私の実装に何か問題がありますか、それとも BB-BC に何か問題があることを理解していますか?