我正在使用积木-明智的均匀交叉在遗传算法。我有个问题需要你帮忙。我假设我有两个人口,比如I1 and I2
I1: 10010 11100 00110
I2: 00011 00011 11111
我认为我在两个种群中的积木是(粗体数)
I1: 10010 111 00 11
I2: 00011 00011 11111
我的问题是如何为I1 and I2
应用积木式的均匀交叉.据我所知,它将在两个人口中的每一个建筑块一起拍打,对吗?结果是(假设概率交叉为1)
I1: 10011 00011 11111
I2: 00010 11100 0011
发布于 2015-08-09 13:25:37
交叉是在个体之间而不是群体之间进行的.对于每一个基因,你随机选择哪个后代去。就像这样:
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
发布于 2016-01-26 13:52:52
Single
和multi-point
交叉将交叉点定义为个体可以分裂的位点之间的位置。Uniform crossover
推广了该方案,使每个轨迹都成为一个潜在的交叉点。交叉掩码,与单个结构相同的长度是随机创建的,掩码中位的奇偶性指示哪个父节点将为后代提供哪些位。这种方法与离散复合法是完全一致的。
考虑以下两个具有11个二进制变量的个体:
个体1: 0 1 1 1 0 0 1 0 1 0个人2: 1 0 1 0 1 0 0 0 1
对于每个变量,将其变量贡献给后代的父母是随机选择的,概率相等。在这里,如果对应的掩码位是1,则通过从父1获取位产生后代1,如果对应的掩码位是0,则从父2获取该位。通常,子代2是使用掩码的反面创建的。
示例1: 0 1 1 0 0 1 1 0 1 0 0 样本2: 1 0 0 1 1 1 0 0 1 0 1
在交叉之后,新个体被创建:
后代1: 1 1 1 0 1 1 1 后代2: 0 0 1 1 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
https://stackoverflow.com/questions/30568409
复制相似问题