比较单个向量中的值

时间:2016-04-07 02:13:44

标签: c++ class vector genetic-algorithm

我正在研究GA,似乎在比赛选择上遇到了问题。我认为这是因为我没有比较我想要比较的东西(在健康值方面)

srand(static_cast <unsigned> (time(0)));
    population Pop;
    vector<population> popvector;
    vector<population> survivors;

    population *ptrP;

    for (int i = 0; i <= 102; i++)
    {
        ptrP = new population;
        ptrP->generatefit;
        ptrP->findfit;
        popvector.push_back(*ptrP);
        //include finding the persons "overall".  WIP

    }
    cout << "The fit values of the population are listed here: " << endl;
    vector<population> ::iterator it; //iterator to print everything in the vector 
    for (it = popvector.begin(); it != popvector.end(); ++it)
    {
        it->printinfo();
    }

    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); // generate a seed for the shuffle process of the vector.

    cout << "Beggining selection process" << endl;

     shuffle(popvector.begin(), popvector.end(), std::default_random_engine(seed));

    //Shuffling done to randomize the parents I will be taking.     
    // I also want want to pick consecutive parents 
    for (int i = 0; i <= 102; i = i + 3)
    {
        if (popvector[i] >= popvector[i++]);

    }


}

现在我认为我的问题是,当我试图比较整体价值(尚未找到,正在研究如何正确建模它们以给我准确的整体健身价值)我不是在比较我应该是什么。

我想,一旦我找到“整体”的人,我应该将它存储在Float矢量中并从那里开始,但我不确定这是否是正确的方法,如果我想创建一个新的“ parent“pool,因为(我认为)”父池“必须是我的人口类的一部分。

感谢任何反馈。

1 个答案:

答案 0 :(得分:1)

  

srand(static_cast <unsigned> (time(0)));

这没用:您是以不基于std::rand的形式致电std::shuffle

shuffle(popvector.begin(), popvector.end(), std::default_random_engine(seed));

如果程序中的其他位置需要生成随机数,请通过random pseudo-random number generation library中的函数/发行版/引擎执行(不要使用std::rand)。

还要考虑到,出于调试目的,您应该有一种方法来使用固定种子初始化随机引擎(调试需要可重复的结果)。

  

for(int i = 0; i&lt; = 102; i ++)

请勿使用magic numbers

为什么选择102?如果是人口规模,将其存储在常量/变量(populationSize?)中,记录变量使用并“享受”当您需要更改值时,您不必记住它的位置使用(只是在这个简单的片段中有两个不同的使用点)。

还要考虑人口规模是您需要在GA中经常更改的参数之一。

ptrP = new population;
ptrP->generatefit;
ptrP->findfit;
popvector.push_back(*ptrP);

绝对考虑Sam Varshavchikpaddy的评论。

for (int i = 0; i <= 102; i = i + 3)
{
  if (popvector[i] >= popvector[i++]);
  // ...

通常,更改for循环体内的索引变量并不是一个好习惯(在某些语言中,而不是C / C ++中,循环变量在循环体的范围内是不可变的)。 / p>

此处您还有一个未定义的行为:

popvector[i] >= popvector[i++]

相当于

operator>=(popvector[i], popvector[i++])

未指定评估函数参数的顺序。所以你可能有:

auto a = popvector[i];
auto b = popvector[i++];
operator>=(a, b);  // i.e. popvector[i] >= popvector[i]

auto b = popvector[i++];
auto a = popvector[i];
operator>=(a, b);   // i.e. popvector[i + 1] >= popvector[i]

两种情况都是错误的。

在第一种情况下,您要比较相同的元素,表达式始终为真。

在第二种情况下,比较可能与您的想法相反。

看看:

并始终使用-Wall -Wextra(或等效的)编译源代码。

我不确定是否正确理解了班级population的作用。可能是该名称具有误导性。

您可能感兴趣的其他问题/答案: