GA中的BB-wise统一交叉算子

时间:2015-06-01 07:58:53

标签: genetic-algorithm evolutionary-algorithm genetic-programming

我在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

2 个答案:

答案 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)

Singlemulti-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

  • Uniform Crossover使用两个父母之间固定的混合比例。
  • 与单点和双点交叉不同,Uniform Crossover使父染色体能够贡献基因水平而非细分水平。
  • 如果混合比为0.5,则后代具有来自第一亲本的大约一半基因而来自第二亲本的另一半。

在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