1

特定のタイプの最適化アルゴリズムである遺伝的アルゴリズムを使用してプログラムを作成しようとしています。「 EvolutionaryObjects 」と呼ばれるこのタスク用の無料のライブラリを見つけ、非常に単純な遺伝的アルゴリズムのインスタンスを実装しました。プログラムコード、netbeansが実装するビルドコマンド、そして最後に私が受け取るエラーメッセージは、以下の別々のブロックに掲載されています。あなたが私にあなたの助けを許すならば、あなたはcout機能で何かがうまくいかないのを見るでしょう。インターネットで同様の問題を検索したところ、gccではなくg ++を使用するだけで問題が修正されていたのに、ご覧のとおり、すでにg++を使用していることがわかりました。どんな助けもいただければ幸いです。

プログラムコードはすぐ下にあります:

#include <stdexcept>
#include <iostream>
#include <eo>
#include <ga.h>

typedef eoBit<double> Indi;

double binary_value(const Indi & _indi)
{
  double sum = 0;
  for (unsigned i = 0; i < _indi.size(); i++)
    sum += _indi[i];
  return sum;
}

void main_function(int argc, char **argv)
{

  const unsigned int SEED = 42;      // seed for random number generator
  const unsigned int T_SIZE = 3;     // size for tournament selection
  const unsigned int VEC_SIZE = 16;   // Number of bits in genotypes
  const unsigned int POP_SIZE = 100;  // Size of population
  const unsigned int MAX_GEN = 400;  // Maximum number of generation before STOP
  const float CROSS_RATE = 0.8;      // Crossover rate
  const double P_MUT_PER_BIT = 0.01; // probability of bit-flip mutation
  const float MUT_RATE = 1.0;        // mutation rate

  rng.reseed(SEED);

  eoEvalFuncPtr<Indi> eval(  binary_value );

  eoPop<Indi> pop;

  for (unsigned int igeno=0; igeno<POP_SIZE; igeno++)
    {
      Indi v;           // void individual, to be filled
      for (unsigned ivar=0; ivar<VEC_SIZE; ivar++)
    {
      bool r = rng.flip(); // new value, random in {0,1}
      v.push_back(r);      // append that random value to v
    }
      eval(v);                 // evaluate it
      pop.push_back(v);        // and put it in the population
    }

  pop.sort();

  cout << "Initial Population" << endl;
  cout << pop;

  eoDetTournamentSelect<Indi> select(T_SIZE);  // T_SIZE in [2,POP_SIZE]
  eo1PtBitXover<Indi> xover;
  eoBitMutation<Indi>  mutation(P_MUT_PER_BIT);

  eoGenContinue<Indi> continuator(MAX_GEN);

  eoSGA<Indi> gga(select, xover, CROSS_RATE, mutation, MUT_RATE, eval, continuator);

  gga(pop);

  pop.sort();
  cout << "FINAL Population\n" << pop << endl;
}

int main(int argc, char **argv)
{
main_function(argc, argv);
    return 1;
}
}

Netbeansは、ビルドを試行するときにこれを実行していることを示しています。

make[1]: Entering directory `/home/gregemerson/EO_GA/EO_GA'
rm -f -r build/Debug
rm -f dist/Debug/GNU-Linux-x86/eo_ga
make[1]: Leaving directory `/home/gregemerson/EO_GA/EO_GA'


CLEAN SUCCESSFUL (total time: 94ms)

"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory `/home/gregemerson/EO_GA/EO_GA'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/eo_ga
make[2]: Entering directory `/home/gregemerson/EO_GA/EO_GA'
mkdir -p build/Debug/GNU-Linux-x86
rm -f build/Debug/GNU-Linux-x86/main.o.d
g++    -c -g -I../../EO/EO/eo/src -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.cpp
mkdir -p dist/Debug/GNU-Linux-x86
g++     -o dist/Debug/GNU-Linux-x86/eo_ga build/Debug/GNU-Linux-x86/main.o -L../../EO/EO/eo/build/lib /home/gregemerson/EO/EO/eo/build/lib/libcma.a /home/gregemerson/EO/EO/eo/build/lib/libeoutils.a /home/gregemerson/EO/EO/eo/build/lib/libes.a /home/gregemerson/EO/EO/eo/build/lib/libga.a 

エラーメッセージはすぐ下にあります。

/home/gregemerson/EO_GA/EO_GA/main.cpp:94: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, eoPrintable const&)'
/home/gregemerson/EO_GA/EO_GA/main.cpp:99: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, eoPrintable const&)'
/home/gregemerson/EO_GA/EO_GA/main.cpp:149: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, eoPrintable const&)'
build/Debug/GNU-Linux-x86/main.o: In function `eoPop<eoBit<double> >::sortedPrintOn(std::basic_ostream<char, std::char_traits<char> >&) const':
/home/gregemerson/EO_GA/EO_GA/../../EO/EO/eo/src/eoPop.h:294: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, eoPrintable const&)'
build/Debug/GNU-Linux-x86/main.o: In function `std::ostream_iterator<eoBit<double>, char, std::char_traits<char> >::operator=(eoBit<double> const&)':
/usr/include/c++/4.6/bits/stream_iterator.h:198: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, eoPrintable const&)'
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/GNU-Linux-x86/eo_ga] Error 1
make[2]: Leaving directory `/home/gregemerson/EO_GA/EO_GA'
make[1]: *** [.build-conf] Error 2
make[1]: Leaving directory `/home/gregemerson/EO_GA/EO_GA'
make: *** [.build-impl] Error 2

あなたの応答は私のcout(pop)の問題を修正しました。ただし、現在使用している静的ライブラリの1つのヘッダーに、基本的なc++ライブラリの1つに関連しているように見えるものとともに同様のエラーが表示されています。私は次のようになります。これはあなたにとって意味がありますか?

build/Debug/GNU-Linux-x86/main.o: In function `std::ostream_iterator<eoBit<double>, char, std::char_traits<char> >::operator=(eoBit<double> const&)':
/usr/include/c++/4.6/bits/stream_iterator.h:198: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, eoPrintable const&)'
build/Debug/GNU-Linux-x86/main.o: In function `eoPop<eoBit<double> >::sortedPrintOn(std::basic_ostream<char, std::char_traits<char> >&) const':
/home/gregemerson/EO_GA/EO_GA/../../EO/EO/eo/src/eoPop.h:294: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, eoPrintable const&)'
4

2 に答える 2

3

問題は(たとえば)ここにあります:

cout << pop;

エラー、

/home/gregemerson/EO_GA/EO_GA/main.cpp:94: undefined reference to 
`operator<<(std::basic_ostream<char, std::char_traits<char> >&, eoPrintable const&)'

eoPrintableオブジェクトをにプッシュする方法を知っている基本的な関数がないことを意味しますostream

コメントで提供されたリンクに基づいて、このeoPopクラスは印刷用のいくつかのメソッドを定義しました:sortedPrintOnprintOn

それらの1つを使用してに印刷するcoutには、次のようにします。

pop.printOn(cout); //or pop.printOn(std::cout) if you remove using namespace std;
pop.printSortedOn(cout);
于 2012-06-29T18:40:29.083 に答える
1

EO C ++ libを初めて使用しようとすると、多くの人がこの問題を経験しています。私もこの問題に直面し、解決策を見つけることができました。問題は、リンカーがEOプログラムの構築中にリンクする必要のある静的ライブラリを見つけられないことです。これで、最初のチュートリアル、つまりFirstBitGA.cppFirstRealGA.cppをUbunut 10.04(LTS)のEO-1.3.1で正常にコンパイルして使用できるようになりました。

注:インストールから始まる完全な手順を書いているので、しばらくお待ちください。また、「username」という単語をユーザーアカウントに置き換えます。

<<解決策>>

  1. http://sourceforge.net/projects/eodev/files/latest/download?source=filesからEOLibをダウンロードします
  2. EOという名前のディレクトリを作成します。/ home /username/に作成します。
  3. EOZipファイルを/home/ username / EOにコピーし、解凍します。これにより、/ home / username/EOの下に「eo」という名前の別のディレクトリが作成されます。
  4. 次に、ターミナルの/ home / username / EO / eo / build_gcc_linux_releaseにあるビルドスクリプトを実行して、インストールファイルをビルドします。
  5. 手順4のビルドスクリプトは、/ home / username / EO/eoの下に「 release 」という名前のディレクトリを作成します。リリースディレクトリの「lib」フォルダには、EOプログラムのコンパイル中にリンクする必要のあるライブラリが含まれています。
  6. ここで、コンパイルを成功させるには、コンパイラに2つのパスを提供する必要があります。

    6.1。g ++へのコマンドライン引数としてファイルを含めるためのパス probjectの.proファイルのeo/src'。

    6.2。g++への-L引数を持つすべてのリンクライブラリへのパス

    -L/home/username/EO/eo/release/lib/libcma.a /home/username/EO/eo/release/lib/libeo.a /home/username/EO/eo/release/lib/libeoserial/home/username/EO/eo/release/lib/libeoutils.a /home/username/EO/eo/release/lib/libes.a /home/username/EO/eo/release/lib/libga.a
    

    Qt Creatorユーザーの場合、.proファイルに次の行を入力します。

    LIBS + = -L / home / username / EO / eo / release / lib / libcma.a /home/username/EO/eo/release/lib/libeo.a /home/username/EO/eo/release/lib/ libeoserial.a/home/username/EO/eo/release/lib/libeoutils.a/home/username/EO/eo/release/lib/libes.a/home/username/EO/eo/release/lib/libga。 a

  7. 楽しみ

于 2015-06-02T09:20:26.233 に答える