c++ - 比较单个 vector 中的值

标签 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 vector 中并从那里开始,但我不确定如果我想创建一个新的“父池,因为(我认为)“父池”必须是我的人口类别的一部分。

欢迎任何反馈。

最佳答案

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

这是没用的:你正在调用 std::shuffle 以不基于 std::rand 的形式:

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

如果您需要在程序的其他地方生成随机数,请通过 random pseudo-random number generation library 中的函数/分布/引擎来完成(不要使用 std::rand )。

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


for (int i = 0; i <= 102; i++)

不要使用 magic numbers .

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

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


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

绝对考虑Sam Varshavchik的和paddy的言论。


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

通常,在 for 的正文中更改索引变量不是一个好的做法。循环(在某些语言中,不是 C/C++,循环变量在循环体范围内是不可变的)。

这里还有一个未定义的行为:

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 .可能是名字误导了。


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

关于c++ - 比较单个 vector 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36465518/

相关文章:

c++ - 线程安全并发调用C++中的外部命令

c++ - "Missing type specifier - int assumed"无法通过在主函数中添加 "return 0"来解决

c++ - RAII 捕获构造函数异常的方法

java - 如何检查当前方法的参数是否具有注释并在 Java 中检索该参数值?

c++ - 递归矩阵乘法算法计算失败

javascript - 试图理解 nodeJS 和 javascript 对象

java - 从终止当前面板的另一个类(方法)的面板调用方法

c++ - 将 cv::Mat 转换为 vector<int>

c++ - 使用整数参数定义 vector <string> 时 '{' 和 '(' 之间的差异?

vector - 如何对矢量或 map 中的所有值求和