我有一个应该发展IA的程序。我试图做一些遗传算法(主要步骤是: - 选择最佳种群, - 突变种群,品种种群)。为了选择最佳人口,我想对它们进行排序并考虑最佳(考虑订单功能)。
我使用了std::sort
功能,但有时只会崩溃,但我无法找到原因。
由于我在这个项目上受阻,我真的不知道我应该提供多少。以下是主要想法:
我定义了一个IA(带有一些参数):
IA ia = IA(100, { 6, 4, 1 });
然后我希望它做50个演变步骤:
ia.evolve(50);
深入研究排序功能(调试),我有时会进入以下状态:
"最后一个元素",只包含不可能的东西(意思是"意外(对我而言)的东西")。
由于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();
}
我期待获得一些建议或对实际导致应用程序崩溃的想法。
答案 0 :(得分:1)
您的operator<
未实施严格弱排序。部分意思是如果A&lt; B,然后!(B play,这似乎更新了分数,因此不同比较的元素连续比较值会发生变化,编译器会抱怨,因为比较结果不一致。
请勿从比较中调用play
,只需致电g.getScore()
并比较这些值。