我正在研究 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]
两种情况都是错误的。
在第一种情况下,您正在比较相同的元素并且表达式始终为真。
在第二种情况下,比较可能与您的想法相反。
看看:
- Undefined behavior and sequence points
- What are all the common undefined behaviours that a C++ programmer should know about?
并始终使用 -Wall -Wextra
编译源代码(或它们的等价物)。
我不确定是否正确理解类的作用population
.可能是名字误导了。
您可能会感兴趣的其他问题/答案:
关于c++ - 比较单个 vector 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36465518/