我有一个应该会发展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/