gpt4 book ai didi

c++ - 使用排序功能的应用程序崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:02 26 4
gpt4 key购买 nike

我有一个程序应该可以发展 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();
}

我期待获得一些建议,或了解导致应用崩溃的真正原因。

最佳答案

你的 operator<没有实现严格的弱排序。这部分意味着如果 A < B,则 !(B < A),如果 A < B 且 B < C,则 A < C。由于您的接线员调用 play ,它似乎更新了分数,元素连续比较的值因不同的比较而改变,并且编译器正在提示,因为它从比较中得到不一致的结果。

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com