我在GA中使用Building Block-wise统一交叉。我有一个需要你帮助的问题。我假设我有两个人口,例如I1 and I2
I1: 10010 11100 00110
I2: 00011 00011 11111
我认为我的两个人群中的Building Block是(粗体数)
I1:10010 111 00 00 11 0
I2:000 11 000 11 11111
我的问题是如何为I1 and I2
应用Building Block-wise统一交叉。据我所知,它将两个人群中的每个积木打在一起,是不是?所以结果是(假设概率交叉是1)
I1:100 11 000 11 11111
I2:000 10 111 00 00 11 0
答案 0 :(得分:2)
在不在人群之间的个体之间进行交叉... 对于每个基因,你随机选择去哪个后代。像这样:
void uniform_crossover(chromosome parent1, chromosome parent2, chromosome offspring1, chromosome offspring2, int num_dims)
{
// for each gene we decide randomly where it goes
// (to the first or second offspring)
for (int i = 0; i < num_dims; i++) {
if (rand() % 2) {// flip
offspring1.x[i] = parent2.x[i];
offspring2.x[i] = parent1.x[i];
}
else {
offspring1.x[i] = parent1.x[i];
offspring2.x[i] = parent2.x[i];
}
}
}
完整的源代码在这里:http://create-technology.blogspot.ro/2015/03/a-genetic-algorithm-for-solving.html
答案 1 :(得分:0)
Single
和multi-point
交叉将交叉点定义为可以拆分个体的基因座之间的位置。 Uniform crossover
概括了这个方案,使每个基因座成为潜在的交叉点。交叉掩码,与单个结构的长度相同,是随机创建的,掩码中位的奇偶校验表示哪个父节点将为后代提供哪些位。该方法与离散重组相同。
考虑以下两个人,每个人有11个二进制变量:
个人1: 0 1 1 1 0 0 1 1 0 1 0
个人2: 1 0 1 0 1 1 0 0 1 0 1
对于每个变量,将其变量贡献给后代的父母以相等的概率随机选择。这里,如果对应的掩码位为1,则通过从父1获取位来产生后代1,或者如果相应的掩码位为0,则从父2获取位。通常,使用掩码的逆来创建后代2。 p>
样本1: 0 1 1 0 0 0 1 1 0 1 0
样本2: 1 0 0 1 1 1 0 0 1 0 1
在交叉之后创建新个人:
后代1: 1 1 1 0 1 1 1 1 1 1 1 后代2: 0 0 1 1 0 0 0 0 0 0 0
在MatLab中实施:
for i=1:2:lengthCross
% mask1=round(rand(1,IndLength));
mask1=randperm(IndLength)>(IndLength/2);
mask2=not(mask1);
child1=round(rand(1,IndLength));
child2=round(rand(1,IndLength));
for j=1:IndLength
if mask1(j)==1
child1(j)=SelectedPop(CrossInd(i,1),j:j);
child2(j)=SelectedPop(CrossInd(i+1,1),j:j);
else
child1(j)=SelectedPop(CrossInd(i+1,1),j:j);
child2(j)=SelectedPop(CrossInd(i,1),j:j);
end
end
SelectedPop(CrossInd(i,1),1:IndLength)=child1;
SelectedPop(CrossInd(i+1,1),1:IndLength)=child2;
end