我想在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中发现了什么问题?