我正在研究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,因为(我认为)”父池“必须是我的人口类的一部分。
感谢任何反馈。
答案 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 Varshavchik和paddy的评论。
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
的作用。可能是该名称具有误导性。
您可能感兴趣的其他问题/答案: