使用排序功能的应用程序崩溃
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()
并比较这些值。
我有一个应该发展 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()
并比较这些值。