我有一个应该会发展IA的程序。我尝试做类似遗传算法的事情(主要步骤是:-选择最佳种群,-变异种群,繁殖种群)。要选择最佳种群,我想对它们进行排序并考虑最佳种群(考虑顺序功能)。

我使用了std::sort函数,但有时它会崩溃,但我找不到原因。

由于我在这个项目上受阻,所以我真的不知道我应该介绍多少项目。以下是主要思想:

我定义了一个IA(带有一些参数):

IA ia = IA(100, { 6, 4, 1 });

然后,我希望它执行50个演变步骤:
ia.evolve(50);

在sort函数中进行更深入的研究(调试),有时会达到以下状态:

其中“最后一个元素”仅包含不可能的内容(意味着“对我来说是意外的内容”)。

由于它是g(游戏)对象,不包含正确的内容,因此,我提供了以下相关代码(即使可能根本不是原因):

这是我的g(游戏)构造函数:
Game::Game() {
     nextBarX = BAR_SPACING;
     speed = 0.;
     ySpacing = Y_SPA;
     currentY = GAME_HEIGHT / 2.0;

    passedBars = 0;
    //std::cout << "[Game] Default ctor" << std::endl;
    centerY = std::vector<double>(5);
    centerY[0] = 30.0;
    centerY[1] = 30.0;
    centerY[2] = 30.0;
    centerY[3] = 30.0;
    centerY[4] = 30.0;
}

我可以用这个:
Game& Game::operator=(Game rhs) {
    //std::cout << "[Game] Assignment operator" << std::endl;
        this->centerY = std::vector<double>(5);
    this->centerY = rhs.centerY;
    this->currentY = rhs.currentY;
    this->nextBarX = rhs.nextBarX;
    this->passedBars = rhs.passedBars;
    this->speed = rhs.speed;
    this->ySpacing = rhs.ySpacing;


    return *this;
}

然后:
void Game::reset(){
    nextBarX = BAR_SPACING;
    speed = 0.;
    ySpacing = Y_SPA;
    currentY = GAME_HEIGHT / 2.0;


    centerY = std::vector<double>(5);
    centerY[0] = 30.0;
    centerY[1] = 30.0;
    centerY[2] = 30.0;
    centerY[3] = 30.0;
    centerY[4] = 30.0;  passedBars = 0;
}

或者那个:
Game& Game::operator=(Game rhs) {
    //std::cout << "[Game] Assignment operator" << std::endl;
        this->centerY = std::vector<double>(5);
    this->centerY = rhs.centerY;
    this->currentY = rhs.currentY;
    this->nextBarX = rhs.nextBarX;
    this->passedBars = rhs.passedBars;
    this->speed = rhs.speed;
    this->ySpacing = rhs.ySpacing;


    return *this;
}

IA几乎仅包含模拟(我在此问题中对其进行了简化,实际上它包含其他内容):
class IA {
private:
    std::vector<Simul> sim_;
}

概括地说,IA::evolve做一个for循环,调用IA::getNewGen函数。那叫一个
void IA::sortIA() {
    std::sort(sim_.begin(), sim_.end());
}

在Simul中,我定义了以下内容:
bool operator<( Simul& v) ;

如:
bool Simul::operator<( Simul& v)
{
    if (play() > v.play()){
        return true;
    }
    else{
        return false;
    }
}

play()测试游戏(重置并计算分数):
int Simul::play(){
    bool stillPlaying = true;
    g.reset();

    while (stillPlaying){
        //g.display();
        bool pressed = ask_if_press();
        stillPlaying = !g.step(pressed);
        if (g.getScore() > 100){
            return g.getScore();
        }
    }
    return g.getScore();
}

我期待获得一些建议或想法,以真正导致应用程序崩溃的原因。

最佳答案

您的operator<没有执行严格的弱排序。这部分意味着如果A play,它似乎会更新分数,因此用于的连续比较的值元素针对不同的比较而更改,并且编译器抱怨,因为它从比较中获得不一致的结果。

不要从比较中调用play,只需调用g.getScore()并比较这些值即可。

关于c++ - 应用程序使用排序功能崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48254460/

10-09 02:50