2017-06-29 4 views
0

OpenMPIで新しく働いています... n番目の変数方程式を解くGAアルゴリズム(C++)を作成しましたが、現在はOpenMPI並列化を使用してその性能を向上させようとしています。 OpenMPIを使用したGAアルゴリズムの分散

int main(int argc, char *argv[]){ 
    int i=1; 
    int print=0; 
    int fitness_check; 

    if (argc < 2) print=1; 


    //initialize rand parameter 
    srand(time(0)); 
    //start counting clock 
    auto start_time = std::chrono::high_resolution_clock::now(); 
    //start GA 
    population *pop=new population(); 
    pop->calcPopFitness(); 
    pop->popSort(); 

    fitness_check=pop->getElement(0).getFitness(); 
    while(pop->getElement(0).getFitness()!=0){ 
     pop->evolvePop(); 

     pop->calcPopFitness(); 

     pop->popSort(); 


     if(fitness_check<(pop->getElement(0).getFitness())){ 
      cout<<"Error in elitism\n"; 
      cout<<"---------------------------\nPrinting after sort...\n"; 
      pop->printPopulation(); 
      cout<<"\n-------------------------------------------\n"; 
      exit(1); 
     }else{ 
      if(fitness_check>(pop->getElement(0).getFitness())) 
       fitness_check=(pop->getElement(0).getFitness()); 
     } 
     if(print==1)cout<<"\nBest string fit in ("+to_string(i)+") iteration: "+string(pop->getElement(0).getString())+"\n"; 
     i++; 
    } 
    if(print==1)cout<<"\nGA algorithms work!\n"; 
    //end of GA algorithm and stop counting time 
    auto end_time = std::chrono::high_resolution_clock::now(); 
    auto time = end_time - start_time; 
    if(print==1)std::cout << "It took " << 
    std::chrono::duration_cast<std::chrono::milliseconds>(time).count() << " milliseconds to run.\n"; 
    writeFile(pop->getElement(0).getValues(), to_string(std::chrono::duration_cast<std::chrono::milliseconds>(time).count())); 
    pop->cleanup(); 
    delete pop; 
    return 0; 
} 

私のクラス

は以下のとおりです:次のように

コードの構造は行く

class chromossome{ 
    private: 
     int * values; 


    public: 
     unsigned int fitness; 
     //constructor 
     chromossome(); 
     chromossome(int *vector); 
     void deleteVector(); 

     bool operator<(const chromossome& other) const { 
      return fitness < other.fitness; 
     } 
     unsigned int getFitness(); 
     int* getValues(); 
     void calcFitness(); 
     void setGene(int i, int gene); 
     int getGene(int i); 
     //int constgetGene(int i) const; 
     void mutate(); 
     string getString() const; 
}; 

と私はちょうど配布しようとしている最初のアプローチとして

class population{ 
    private: 
     int population_size; 
     vector<chromossome> ChromoPopulation; 
    public: 
     population(); 
     population(bool newIteration); 
     int getSize(); 
     void printPopulation(); 
     void removeChromossome(); 
     chromossome getElement(int position); 
     void calcPopFitness(); 
     void popSort(); 
     void addChromossome(chromossome individual); 
     chromossome *tournamentSelection(); 
     chromossome* crossover(chromossome a, chromossome b); 
     void mutate(); 
     chromossome * cloneChromossome(chromossome c); 
     vector<chromossome> getList(); 
     void evolvePop(); 
     void cleanup(); 
}; 

各プロセスが母集団の一部の適合度を計算するようにする。私は、範囲内の計算を実行するためにインデックスを渡すことで(これはすべてのプロセスが同じ母集団にアクセスすることを必要とする)、または母集団要素を送信することによって達成できると考えました。

void population::calcPopFitness(){ 
    for_each(ChromoPopulation.begin(), ChromoPopulation.end(), [=](chromossome & n) 
     {n.calcFitness();}); 
    return; 
} 

void chromossome::calcFitness(){ 
    int result=0; 
    for(int i=0; i<NUMBERVARIABLES; i++){ 
     result+=values[i]*(i+1); 
    } 
    result-=1024; 
    fitness=result; 
    return; 
} 

私の目標は、大きな集団と多数の変数でこの計算を実行することです。

誰かが最善のアプローチを教えてくれますか、可能であれば、私にいくつかのコード例を教えてください。私はこれについて1週間問題を抱えていて、これまでにこの問題を解決していません...

ありがとうございました。

答えて

0

あなたはMPIを使用して遺伝的プログラミングバリアントの私達の実装を見てすることができます

https://github.com/mihaioltean/evolve-tsp-heuristics/tree/master/train/mpi

私たちの目的は、TSPの問題のためのヒューリスティックを訓練することですが、これは多くの時間を要するので、我々 MPIを使用して複数のコンピュータで実行することに決めました。同じプロセッサ内にあるスレッドも使用して、MPIのオーバーヘッドを削減しました。

私たちは(スーパー)集団を複数の集団に分け、各世代の終わりに集団間で個体を交換します(MPI_Send/Recvの部分を参照)。

+0

返信いただきありがとうございます!私はコードをチェックアウトし、可能な限り速やかに問題を解決したかどうかをお知らせします。 – Bernardo

+0

ありがとう!私のために働いた人のためのこのアプローチはうまくいった! – Bernardo

関連する問題