我想在 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 有问题?