c++交叉遗传算法push_back vector 覆盖旧的

标签 c++ algorithm vector push-back

我的代码有问题。我正在尝试对 4 个 parent 进行交叉。问题是如果 vector 中有相同的值,push_back vector 会不断覆盖上面的 vector 。

例如,

parent 1 = 101
parent 2 = 200
parent 3 = 101
parent 4 = 302

假设交叉点是 1,

1|01
2|00
1|01
3|02

child 会是

1|00
2|01
1|02
3|01

我没有得到上面的 child ,而是得到了一个不同的输出,它被 push_back vector 覆盖。

我得到的 child

1|02
2|01
1|02
3|01

如您所见,交叉完成后,父代 3 的交叉值被覆盖到父代 1。非常感谢任何帮助。对不起,如果我违反任何规则,我是这个论坛的新手。

代码如下:

void GA::Crossover()
{
    int i=0;
    int po=0;
    int po1=1;
    do
    {
        int point1 = 0;
        while (point1==0)
            point1=rand() % 3;

        std::ofstream log("log.txt", std::ios_base::app);
        log<<"---------------------------------"<<"\n";
        log<<"cross point: "<<point1<<std::endl;
        log.close();


        Chromosome* child1=parent.at(po);
        Chromosome* child2=parent.at(po1);

        for(int c1=0;c1<point1;c1++)
        {
            int one=parent.at(po1)->GetGene(c1);
            int two=parent.at(po)->GetGene(c1);

            child1->SetGene(c1,one);
            child2->SetAnonGene(c1,two);
        }

        /*for(int c1=2;c1>=point1;c1--)
        {
            int one=parent.at(po1)->GetGene(c1);
            int two=parent.at(po)->GetGene(c1);

            child1->SetGene(c1,one);
            child2->SetGene(c1,two);
        }*/

        Evaluate(child1);
        child.push_back(child1);
        Evaluate(child2);
        child.push_back(child2);

        po=2;
        po1=3;
        i++;
    }while(i<2);
    std::cout<<"child size:"<<child.size()<<std::endl;
    std::ofstream log("log.txt", std::ios_base::app);
    log<<"---------------------------------"<<"\n";
    log<<"Child:"<<std::endl;
    log.close();

    for(int p=0;p<(int)child.size();p++)
    {
        child.at(p)->Print();
    }
    log.open("log.txt", std::ios_base::app);
    log<<"---------------------------------"<<"\n";
    log.close();

    parent.clear();
    parent.shrink_to_fit();
}

最佳答案

在您的代码中, child 是指针:

Chromosome* child1=parent.at(po);

这些不是您以后可以自由修改的染色体拷贝,而是指向原始父项。所以当你改 rebase 因时:

child1->SetGene(c1,one);

你改变了 parent !然后,第二个 do-while 迭代适用于变异的父代。这就是为什么你没有得到你所期望的。

解决方案是复制 child 。有几种可能性。我没有你的类的定义,但是例如,如果 Chromosome 有一个复制构造函数,你可以这样做:

Chromosome* child1=new Chromosome(*parent.at(po));

关于c++交叉遗传算法push_back vector 覆盖旧的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29735522/

相关文章:

c++ - vector< vector<Point3f>> 中的最高值

algorithm - 大溪流水库采样

c++ - 指针 vector 的 Push_back 方法导致 C++ 崩溃

c++ - 想简化我的 std::vector push_back 用法

c++ - 将 std::endl 传递给 std::operator <<

c++ - 如何获取堆栈跟踪信息?

c++ - 单击鼠标时不需要的 SDL_QUIT 事件

Python二进制乘法算法?

html - rails/哈姆 : adding a parentclass every n iteration

python - matplotlib 中的动画箭头