作为遗传学习算法的一部分,c++对向量对进行快速排序



我有一个非常有趣的问题,我已经开始开发一种遗传学习算法,并成功地做到了这一点。这是一种简单的遗传算法,旨在通过随机选择要存储到字符串中的字符来找到短语,并使用标准的选择和突变方法来进行,直到它得到最终答案,有时这非常有效。

然而,有时有一个字符不正确。我认为这是由于排序算法太慢。这就是我目前拥有的

这是循环代码

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,使其在最终结果显示之前随机更改

相关内容

  • 没有找到相关文章