使用OpenMPI分发GA算法

时间:2017-06-29 10:31:21

标签: c++ algorithm genetic-algorithm openmpi

我是OpenMPI的新工作......我构建了一个GA算法(c ++)来解决第n个变量方程,现在我试图通过使用OpenMPI并行化来提高其性能。

代码结构如下:

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 :(得分:0)

您可以使用MPI查看我们对遗传编程变体的实现:

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

我们的目的是为TSP问题训练启发式算法,但这需要花费很多时间,因此我们决定使用MPI在多台计算机上运行。我们还在同一处理器内部使用线程来减少MPI开销。

我们将我们的(超级)人口分成多个群体,在每一代末尾,我们在群体之间交换一些个体(参见MPI_Send / Recv部分)。