使用排序功能的应用程序崩溃

Application crashes using the sort function

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

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

因为我在这个项目上受阻,所以我真的不知道我应该展示多少。以下是主要观点:

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

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

然后我想让它做50个进化步骤:

ia.evolve(50);

深入查看排序功能(调试),我有时会进入以下状态:

其中 "last element" 包含不可能的东西(意味着 "unexpected (for me) stuff")。

由于 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 执行调用 IA::getNewGen 函数的 for 循环。那叫

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 < B,则 !(B < A),如果 A < B 且 B < C,则 A < C。由于您的操作员调用 play,这似乎更新了分数,因此值对于不同比较的元素变化的连续比较,编译器抱怨因为它从比较中得到不一致的结果。

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