int main(int argc, char** argv) { //parparser parser(argc, argv); //long inititalPosition = parser.get("x").asLong(); srand(time(0)); //----------------------------------------------------------------------------- MPICHECK(MPI_Init(&argc, &argv)); //----------------------------------------------------------------------------- int commSize = 0; int rank = 0; MPICHECK(MPI_Comm_size(MPI_COMM_WORLD, &commSize)); MPICHECK(MPI_Comm_rank(MPI_COMM_WORLD, &rank)); const int nextProc = rank == commSize - 1 ? 0 : rank + 1; const int prevProc = rank == 0 ? commSize - 1 : rank - 1; vector<Individ> population(islandSize); for (int i = 0; i < islandSize; ++i) { population[i].init(problemSize); } for (int i = 1; i <= iterationsThreshold; ++i) { select(population); crossoverPopulation(population); mutatePopulation(population); if (i % migrationFreq == 0) { migrate(population, nextProc, prevProc); } cout << getBestFitness(population, rank, commSize) << "\n"; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- MPICHECK(MPI_Finalize()); return 0; }
int main(int argc, char **argv){ tspsMap_t map; tspsConfig_t config; tspsPopulation_t population; unsigned long int numGenerations = 0; int mpiNumProcs = 0; double start, end; //starting MPI directives MPI_Init(NULL,NULL); MPI_Comm_size(MPI_COMM_WORLD,&mpiNumProcs); MPI_Comm_rank(MPI_COMM_WORLD,&mpiId); logg("* Starting tspgen...\n"); // parse the command line args if(readConfig(&config, argc, argv) != TSPS_RC_SUCCESS){ return TSPS_RC_FAILURE; } // parse the map logg("* Parsing map...\n"); if(parseMap(&map) != TSPS_RC_SUCCESS){ logg("Error! Unable to read map 'maps/brazil58.tsp'!\n"); return TSPS_RC_FAILURE; } // initialize random seed: srand ( time(NULL)*mpiId ); logg("* Generating population...\n"); if(generatePopulation(&population, &config) != TSPS_RC_SUCCESS){ logg("Error! Failed to create a new random population!"); return TSPS_RC_FAILURE; } // start a timer (mpi_barrier + mpi_wtime) MPI_Barrier(MPI_COMM_WORLD); start = MPI_Wtime(); logg("* Initializing reproduction loop...\n"); while(1){ numGenerations++; calculateFitnessPopulation(&population, &map); if(numGenerations % 500 == 0){ logg("- Generation %d...\n", numGenerations); printIndividual(&population.individuals[0], "Current Top Individual"); } sortPopulation(&population); if(config.numGenerations > 0 && numGenerations == config.numGenerations){ logg("* Max number of generations [%d] reached!\n", config.numGenerations); break; } crossoverPopulation(&population, &config); mutatePopulation(&population, &config); // migrate population at every n generation if(numGenerations % config.migrationRate == 0){ migrateIndividuals(&population, mpiId, mpiNumProcs, &config); } } // join all the populations joinPopulations(&population, mpiId, mpiNumProcs); sortPopulation(&population); // get the best inidividual and print it printIndividual(&population.individuals[0], "Top Individual"); printIndividual(&population.individuals[config.populationSize-1], "Worst (of the top ones) Individual"); // stop the timer MPI_Barrier(MPI_COMM_WORLD); /* IMPORTANT */ end = MPI_Wtime(); if(mpiId == 0) { /* use time on master node */ printf("* Runtime = %f\n", end-start); } logg("* tspgen finished!\n"); free(population.individuals); free(map.nodes); MPI_Finalize(); return TSPS_RC_SUCCESS; }