1

カスタム オブジェクトのベクトルを並べ替えようとすると、奇妙な問題が発生します。私はこのコードを持っています:

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

染色体4:0.858721

染色体5:0.192359

染色体6:0.582279

染色体7:0.202899

染色体8:0.205105

染色体9:0.187058

ソート後

クロモソーマ 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

問題はどこだ?

4

2 に答える 2

4

比較関数は厳密ではありません-2つの等しい染色体の場合、(順序に関係なく)を返しtrueますcompareChromosomes条件をstrict lessに置き換えます。

bool compareChromosomes(const Chromosome* l, const Chromosome* r) {
   return l->getFitness() < r->getFitness();
   //                     |
   //                  <, not <=
}
于 2012-11-27T17:58:05.373 に答える
1

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;
}
于 2012-11-29T10:58:01.130 に答える