当我试图对自定义对象的向量排序时,我遇到了一个奇怪的问题。我有这样的代码:
class Chromosome {
public:
Chromosome(int c_w);
void setFitness(double fit);
double getFitness() const;
};并比较功能:
bool compareChromosomes(const Chromosome* l, const Chromosome* r) {
return l->getFitness() <= r->getFitness();
}我创造了染色体的载体:vector<Chromosome*> popv;和一些染色体。
当我尝试用sort(popv.begin(), popv.end(), compareChromosomes);对向量排序时
其结果是:
排序前:
文蛤瘤0: 0.205595
文蛤瘤1: 0.370121
文蛤瘤2: 0.363655
文蛤瘤3: 0.363655
cromosoma 4: 0.858721
文蛤瘤5: 0.192359
文蛤瘤6: 0.582279
文蛤瘤7: 0.202899
文蛤瘤8: 0.205105
文蛤瘤9: 0.187058
后排序
cromosoma 0:-0.474942
文蛤瘤1: 0.187058
文蛤瘤2: 0.192359
文蛤瘤3: 0.202899
文蛤瘤4: 0.205105
文蛤瘤5: 0.205595
文蛤瘤6: 0.363655
文蛤瘤7: 0.363655
文蛤瘤8: 0.370121
文蛤瘤9: 0.582279
问题出在哪里?
发布于 2012-11-27 17:58:05
您的比较函数并不严格-对于两个相同的染色体,它返回true的compareChromosomes (不管顺序)。用严格少替换您的条件
bool compareChromosomes(const Chromosome* l, const Chromosome* r) {
return l->getFitness() < r->getFitness();
// |
// <, not <=
}发布于 2012-11-29 10:58:01
0.858721改为-0.474942的原因不是因为您的比较函数。您没有发布的代码肯定还有其他原因。尝试下面的代码:输出正常。
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
class Chromosome {
public:
Chromosome(int c_w) :mCw(c_w) { }
void setFitness(double fit) { mFit = fit; }
double getFitness() const { return mFit; }
int getCW() const { return mCw; }
private:
int mCw;
double mFit;
};
bool compareChromosomes(const Chromosome* l, const Chromosome* r) {
return l->getFitness() <= r->getFitness();
}
int main( int argc, char *argv[] ) {
// init your data
vector<Chromosome *> popv;
popv.push_back( new Chromosome( 0 ) );
popv[ popv.size() - 1 ]->setFitness( 0.205595 );
popv.push_back( new Chromosome( 1 ) );
popv[ popv.size() - 1 ]->setFitness( 0.370121 );
popv.push_back( new Chromosome( 2 ) );
popv[ popv.size() - 1 ]->setFitness( 0.363655 );
popv.push_back( new Chromosome( 3 ) );
popv[ popv.size() - 1 ]->setFitness( 0.363655 );
popv.push_back( new Chromosome( 4 ) );
popv[ popv.size() - 1 ]->setFitness( 0.858721 );
popv.push_back( new Chromosome( 5 ) );
popv[ popv.size() - 1 ]->setFitness( 0.192359 );
popv.push_back( new Chromosome( 6 ) );
popv[ popv.size() - 1 ]->setFitness( 0.582279 );
popv.push_back( new Chromosome( 7 ) );
popv[ popv.size() - 1 ]->setFitness( 0.202899 );
popv.push_back( new Chromosome( 8 ) );
popv[ popv.size() - 1 ]->setFitness( 0.205105 );
popv.push_back( new Chromosome( 9 ) );
popv[ popv.size() - 1 ]->setFitness( 0.187058 );
// sort
sort( popv.begin(), popv.end(), compareChromosomes );
for( size_t i = 0; i < popv.size(); i++ ) {
cout << "cromosoma " << popv[i]->getCW() << ":" << popv[i]->getFitness() << endl;
}
return 0;
}https://stackoverflow.com/questions/13590214
复制相似问题