首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >遗传算法中的BB方向一致交叉算子

遗传算法中的BB方向一致交叉算子
EN

Stack Overflow用户
提问于 2015-06-01 07:58:52
回答 2查看 219关注 0票数 1

我正在使用积木-明智的均匀交叉在遗传算法。我有个问题需要你帮忙。我假设我有两个人口,比如I1 and I2

代码语言:javascript
运行
复制
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

EN

回答 2

Stack Overflow用户

发布于 2015-08-09 13:25:37

交叉是在个体之间而不是群体之间进行的.对于每一个基因,你随机选择哪个后代去。就像这样:

代码语言:javascript
运行
复制
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

票数 2
EN

Stack Overflow用户

发布于 2016-01-26 13:52:52

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

  • 均匀杂交采用双亲之间固定的混合比例。
  • 与单点交叉和两点杂交不同的是,均匀交叉使父染色体能够贡献基因水平,而不是片段水平。
  • 如果混合比为0.5,后代大约有一半的基因来自第一亲本,另一半来自第二亲本。

的MatLab实现:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30568409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档