我有一个非常有趣的问题,我已经开始开发一种遗传学习算法,并成功地做到了这一点。这是一种简单的遗传算法,旨在通过随机选择要存储到字符串中的字符来找到短语,并使用标准的选择和突变方法来进行,直到它得到最终答案,有时这非常有效。
然而,有时有一个字符不正确。我认为这是由于排序算法太慢。这就是我目前拥有的
这是循环代码
while (!word.Get_found())
{
generation++;
word.Calculate_fitness();
word.Selection(); //selection
word.Crossover(); //crossover
system("cls");
std::cout << "Generation: " << generation << " Highest fitness: " << word.get_fittest() << " with string: " << word.get_item() << "n";
}
这是适用性函数的代码
void Guess_word::Calculate_fitness()// calculates fittness based on guess
word against matching string;
{
for (int i = 0; i < population.size(); i++)
{
population.at(i).second = 0;
for (int j = 0; j < population.at(i).first.size(); j++)
{
if (population.at(i).first.at(j) == Phrase.at(j))
{
population.at(i).second += 1;//calculate fitness
}
}
if (population.at(i).second == Phrase.size() && population.at(i).first == Phrase)
{
found = true;
}
}
}
这就是的选择功能
void Guess_word::Selection()//determine highest fitness of population and make them parents
{
//i hate stable sort....
//it indicates to sort in pairs and keep them together
std::sort(population.begin(), population.end(), [](auto &a, auto &b) { return a.second > b.second; });
//select two random parent from mating pool
parents.clear();
parents.push_back(population.at(0));
parents.push_back(population.at(1));
}
总体实体是向量对,字符串和int分别表示猜测和适应度。调试代码后,我发现总体确实包含正确的猜测,但适应度错误,我认为排序算法移动int的速度比配对字符串更快。意味着在适应度函数期间,它选择一个字符不正确的项目作为答案。
我尝试过使用稳定排序并移动算法,看看时间是否有问题。然而,没有骰子。有没有一种方法可以让程序等待排序完成(这在时间上是低效的(,或者有没有一个方法可以让排序更快或实现更快的自定义排序算法,这将更有效,尤其是在旧硬件上。
如有任何建议,我们将不胜感激!
问题很简单,代码进行交叉并将其存储回总体的位置0,使其在最终结果显示之前随机更改