应用程序使用sort函数崩溃

时间:2018-01-14 21:42:53

标签: c++ sorting crash genetic-algorithm

我有一个应该发展IA的程序。我试图做一些遗传算法(主要步骤是: - 选择最佳种群, - 突变种群,品种种群)。为了选择最佳人口,我想对它们进行排序并考虑最佳(考虑订单功能)。

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

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

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

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

然后我希望它做50个演变步骤:

ia.evolve(50);

Visual S. crashing at execution

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

enter image description here

"最后一个元素",只包含不可能的东西(意思是"意外(对我而言)的东西")。

由于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();
}

我期待获得一些建议或对实际导致应用程序崩溃的想法。

1 个答案:

答案 0 :(得分:1)

您的operator<未实施严格弱排序。部分意思是如果A&lt; B,然后!(B play,这似乎更新了分数,因此不同比较的元素连续比较值会发生变化,编译器会抱怨,因为比较结果不一致。

请勿从比较中调用play,只需致电g.getScore()并比较这些值。