2017-06-29 53 views
0

我是新的OpenMPI工作...我构建了一个GA算法(C++)来解决第n个变量方程,现在我试图通过使用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; 
} 

我的目标是再大的人口和大量的变量执行此计算。

谁能告诉我什么是最好的办法,如果可能的话给我一些代码的例子吗?我一直在为此奋斗了一个星期,至今没有取得任何进展......

在此先感谢...任何帮助是一个巨大的帮助。

回答

0

可以使用MPI看看我们的实现中的遗传程序变种:

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

我们的目的是培养启发式的TSP问题,但是这需要花费大量的时间,所以我们决定使用MPI在多台电脑上运行。我们还使用线程,同一处理器内部,以减少MPI开销。

我们已经将我们的(超)人口划分为多个人口,并且在每一代人结束时我们会在人口之间交换一些人(参见MPI_Send/Recv部分)。

+0

感谢您的答复!我在外面检查代码,让你知道它是否尽快解决我的问题,因为可能! – Bernardo

+0

谢谢!这种为个人传球的方式为我工作! – Bernardo