From f09597cccca78d9fe4d2ea57ddd5e25ffebefa97 Mon Sep 17 00:00:00 2001 From: boufaras Date: Fri, 28 Jan 2011 16:38:48 +0000 Subject: [PATCH] git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@2094 331e1502-861f-0410-8da2-ba01fb791d7f --- .../QAP_CPU/application/CMakeLists.txt | 4 +- .../QAP_CPU/application/testSimpleHC_CPU.cu | 189 ++++++++++++++++++ .../QAP_CPU/application/testSimpleTS_CPU.cu | 105 +++++----- ParadisEO-GPU/tutoriel/QAP_CPU/src/Problem.h | 12 +- ParadisEO-GPU/tutoriel/QAP_CPU/src/QapEval.h | 5 +- .../tutoriel/QAP_CPU/src/QapIncrEval.h | 15 +- ParadisEO-GPU/tutoriel/QAP_CPU/src/Solution.h | 4 +- 7 files changed, 255 insertions(+), 79 deletions(-) create mode 100755 ParadisEO-GPU/tutoriel/QAP_CPU/application/testSimpleHC_CPU.cu diff --git a/ParadisEO-GPU/tutoriel/QAP_CPU/application/CMakeLists.txt b/ParadisEO-GPU/tutoriel/QAP_CPU/application/CMakeLists.txt index ed1d0c500..4023f44f6 100644 --- a/ParadisEO-GPU/tutoriel/QAP_CPU/application/CMakeLists.txt +++ b/ParadisEO-GPU/tutoriel/QAP_CPU/application/CMakeLists.txt @@ -41,9 +41,11 @@ LINK_DIRECTORIES(${PARADISEO_EO_BIN_DIR}/lib ${NVIDIA_LIB_DIR} ${CUDA_LIB_DIR} ### 3) Define your targets and link the librairies ###################################################################################### -CUDA_ADD_EXECUTABLE(CutestSimpleTS_CPU testSimpleTS_CPU.cu) +CUDA_ADD_EXECUTABLE(CutestSimpleTS_CPU testSimpleTS_CPU.cu) +#CUDA_ADD_EXECUTABLE(CutestSimpleHC_CPU testSimpleHC_CPU.cu) TARGET_LINK_LIBRARIES(CutestSimpleTS_CPU eoutils ga eo libcutil.a) +#TARGET_LINK_LIBRARIES(CutestSimpleHC_CPU eoutils ga eo libcutil.a) diff --git a/ParadisEO-GPU/tutoriel/QAP_CPU/application/testSimpleHC_CPU.cu b/ParadisEO-GPU/tutoriel/QAP_CPU/application/testSimpleHC_CPU.cu new file mode 100755 index 000000000..efa65a9ae --- /dev/null +++ b/ParadisEO-GPU/tutoriel/QAP_CPU/application/testSimpleHC_CPU.cu @@ -0,0 +1,189 @@ +#include +#include +#include +using namespace std; + +int * a; +int * b; +int n; + +// The general include for eo +#include +#include +// Fitness function +#include +// Cuda Fitness function +#include +// QAP solution +#include +#include +//To compute execution time +#include +//QAP neighbor +#include +//QAP neighborhood +#include +//QAP data +#include +// The Solution and neighbor comparator +#include +#include +// The Iter continuator +#include +// Local search algorithm +#include +// The Tabou Search algorithm explorer +#include + + +typedef eoInt solution; +typedef moSwapNeighbor Neighbor; +typedef moSwapNeighborhood Neighborhood; + + +int main(int argc, char **argv) +{ + + /* ========================================================= + * + * Parameters + * + * ========================================================= */ + + // First define a parser from the command-line arguments + eoParser parser(argc, argv); + + // For each parameter, define Parameter, read it through the parser, + // and assign the value to the variable + + // seed + eoValueParam seedParam(time(0), "seed", "Random number seed", 'S'); + parser.processParam( seedParam ); + unsigned seed = seedParam.value(); + + // Iteration number + eoValueParam nbIterationParam(1, "nbIteration", "TS Iteration number", 'I'); + parser.processParam( nbIterationParam, "TS Iteration number" ); + unsigned nbIteration = nbIterationParam.value(); + + // the name of the "status" file where all actual parameter values will be saved + string str_status = parser.ProgramName() + ".status"; // default value + eoValueParam statusParam(str_status.c_str(), "status", "Status file"); + parser.processParam( statusParam, "Persistence" ); + + // do the following AFTER ALL PARAMETERS HAVE BEEN PROCESSED + // i.e. in case you need parameters somewhere else, postpone these + if (parser.userNeedsHelp()) { + parser.printHelp(cout); + exit(1); + } + if (statusParam.value() != "") { + ofstream os(statusParam.value().c_str()); + os << parser;// and you can use that file as parameter file + } + /* ========================================================= + * + * Random seed + * + * ========================================================= */ + + //reproducible random seed: if you don't change SEED above, + // you'll aways get the same result, NOT a random run + + rng.reseed(seed); + //srand(seed); + + /* ========================================================= + * + * Initilisation of QAP data + * + * ========================================================= */ + + load(argv[1]); + + /* ========================================================= + * + * Initilisation of the solution + * + * ========================================================= */ + + solution sol(n); + create(sol); + + /* ========================================================= + * + * Evaluation of a solution neighbor's + * + * ========================================================= */ + + QapEval eval; + QapIncrEval incr_eval; + + /* ========================================================= + * + * Comparator of solutions and neighbors + * + * ========================================================= */ + + moNeighborComparator comparator; + moSolNeighborComparator solComparator; + + /* ========================================================= + * + * a solution neighborhood + * + * ========================================================= */ + + Neighborhood neighborhood; + + /* ========================================================= + * + * continuator + * + * ========================================================= */ + + moIterContinuator continuator(nbIteration); + + /* ========================================================= + * + * An explorer of solution neighborhood's + * + * ========================================================= */ + + moSimpleHCexplorer explorer(neighborhood, incr_eval, comparator, solComparator); + + + /* ========================================================= + * + * the local search algorithm + * + * ========================================================= */ + + moLocalSearch localSearch(explorer, continuator, eval); + + /* ========================================================= + * + * Execute the local search from random sollution + * + * ========================================================= */ + + //Can be eval here, else it will be done at the beginning of the localSearch + eval(sol); + + std::cout << "initial: " << sol<< std::endl; + // Create timer for timing CUDA calculation + moCudaTimer timer; + timer.start(); + localSearch(sol); + timer.stop(); + std::cout << "final: " << sol << std::endl; + printf("CUDA execution time = %f ms\n",timer.getTime()); + timer.deleteTimer(); + + delete[] a; + delete[] b; + + +return 0; +} + diff --git a/ParadisEO-GPU/tutoriel/QAP_CPU/application/testSimpleTS_CPU.cu b/ParadisEO-GPU/tutoriel/QAP_CPU/application/testSimpleTS_CPU.cu index 280b3760a..c357ff7ce 100644 --- a/ParadisEO-GPU/tutoriel/QAP_CPU/application/testSimpleTS_CPU.cu +++ b/ParadisEO-GPU/tutoriel/QAP_CPU/application/testSimpleTS_CPU.cu @@ -3,8 +3,8 @@ #include using namespace std; -int ** a; -int ** b; +int * a; +int * b; int n; // The general include for eo @@ -20,9 +20,12 @@ int n; //To compute execution time #include //QAP neighbor -#include +#include //QAP neighborhood -#include +//#include +#include +//QAP data +#include // The Solution and neighbor comparator #include #include @@ -31,23 +34,25 @@ int n; // Local search algorithm #include // The Tabou Search algorithm explorer -#include +//#include //Algorithm and its components #include //Tabu list -#include +//#include +#include //Memories #include #include #include -#include -#include +//#include + typedef eoInt solution; -typedef moSwapNeighbor Neighbor; -typedef moSwapNeighborhood Neighborhood; - +//typedef moSwapNeighbor Neighbor; +typedef moIndexedSwapNeighbor Neighbor; +//typedef moSwapNeighborhood Neighborhood; +typedef moOrderNeighborhood Neighborhood; int main(int argc, char **argv) { @@ -69,11 +74,6 @@ int main(int argc, char **argv) parser.processParam( seedParam ); unsigned seed = seedParam.value(); - // Swap number - eoValueParam KSwapParam(1, "KSwap", "swap number", 'N'); - parser.processParam(KSwapParam, "KSwap" ); - unsigned KSwap = KSwapParam.value(); - // Iteration number eoValueParam nbIterationParam(1, "nbIteration", "TS Iteration number", 'I'); parser.processParam( nbIterationParam, "TS Iteration number" ); @@ -113,7 +113,7 @@ int main(int argc, char **argv) //reproducible random seed: if you don't change SEED above, // you'll aways get the same result, NOT a random run - rng.reseed(seed); +// rng.reseed(seed); srand(seed); /* ========================================================= @@ -121,59 +121,62 @@ int main(int argc, char **argv) * Initilisation of QAP data * * ========================================================= */ + load(argv[1]); + /* ========================================================= * * Initilisation of the solution * * ========================================================= */ - + solution sol(n); create(sol); - /* ========================================================= + + /*========================================================= * * Evaluation of a solution neighbor's * * ========================================================= */ - - QapEval eval; - QapIncrEval incr_eval; - + + QapEval eval; + QapIncrEval incr_eval; + /* ========================================================= * * Comparator of solutions and neighbors * * ========================================================= */ - moNeighborComparator comparator; - moSolNeighborComparator solComparator; + moNeighborComparator comparator; + moSolNeighborComparator solComparator; /* ========================================================= * * a solution neighborhood * * ========================================================= */ - - Neighborhood neighborhood; - /* ========================================================= + Neighborhood neighborhood(n*(n-1)/2); + + /* ========================================================= * * continuator * * ========================================================= */ - moIterContinuator continuator(nbIteration); + moIterContinuator continuator(nbIteration); - /* ========================================================= + /*========================================================= * - * tabu list + * Tabu list * * ========================================================= */ - sizeTabuList=(n*(n-1))/4; - duration=sizeTabuList/8; - // tabu list - moNeighborVectorTabuList tl(sizeTabuList,duration); + sizeTabuList=(n*(n-1))/2; + duration=sizeTabuList/8; + // tabu list + moIndexedVectorTabuList tl(sizeTabuList,duration); /* ========================================================= * @@ -181,29 +184,22 @@ int main(int argc, char **argv) * * ========================================================= */ - moDummyIntensification inten; - moDummyDiversification div; - moBestImprAspiration asp; + moDummyIntensification inten; + moDummyDiversification div; + moBestImprAspiration asp; /* ========================================================= * - * An explorer of solution neighborhood's + * the Tabu search algorithm * * ========================================================= */ - moTSexplorer explorer(neighborhood, incr_eval, comparator, solComparator, tl, inten, div, asp); + //General Constructor + moTS tabuSearch(neighborhood, eval, incr_eval, comparator, solComparator, continuator, tl, inten, div, asp); - /* ========================================================= * - * the local search algorithm - * - * ========================================================= */ - - moLocalSearch localSearch(explorer, continuator, eval); - /* ========================================================= - * - * Execute the local search from random sollution + * Execute the Tabu search from random sollution * * ========================================================= */ @@ -214,20 +210,15 @@ int main(int argc, char **argv) // Create timer for timing CUDA calculation moCudaTimer timer; timer.start(); - localSearch(sol); + tabuSearch(sol); timer.stop(); std::cout << "final: " << sol << std::endl; printf("CUDA execution time = %f ms\n",timer.getTime()); timer.deleteTimer(); - for(int i=0 ; i diff --git a/ParadisEO-GPU/tutoriel/QAP_CPU/src/QapEval.h b/ParadisEO-GPU/tutoriel/QAP_CPU/src/QapEval.h index 6d8d3c0ee..edf0ef100 100644 --- a/ParadisEO-GPU/tutoriel/QAP_CPU/src/QapEval.h +++ b/ParadisEO-GPU/tutoriel/QAP_CPU/src/QapEval.h @@ -13,12 +13,9 @@ class QapEval : public eoEvalFunc void operator() (EOT & _sol) { int cost=0; - for (int i=0; i{ int cost=0; unsigned i,j; - int neighborhoodsize = (n * (n - 1)) / 2; - _neighbor.getIndices(i,j); + _neighbor.getIndices(n,i,j); cost = _sol.fitness() +compute_delta(n,a,b,_sol,i,j); _neighbor.fitness(cost); } // specific to the QAP incremental evaluation (part of algorithmic) - int compute_delta(int n, int** a, int** b,EOT & _sol,int i,int j) + int compute_delta(int n, int* a, int* b,EOT & _sol,int i,int j) { int d; int k; - d = (a[i][i]-a[j][j])*(b[_sol[j]][_sol[j]]-b[_sol[i]][_sol[i]]) + - (a[i][j]-a[j][i])*(b[_sol[j]][_sol[i]]-b[_sol[i]][_sol[j]]); + d = (a[i*n+i]-a[j*n+j])*(b[_sol[j]*n+_sol[j]]-b[_sol[i]*n+_sol[i]]) + + (a[i*n+j]-a[j*n+i])*(b[_sol[j]*n+_sol[i]]-b[_sol[i]*n+_sol[j]]); for (k = 0; k < n; k = k + 1) if (k!=i && k!=j) - d = d + (a[k][i]-a[k][j])*(b[_sol[k]][_sol[j]]-b[_sol[k]][_sol[i]]) + - (a[i][k]-a[j][k])*(b[_sol[j]][_sol[k]]-b[_sol[i]][_sol[k]]); + d = d + (a[k*n+i]-a[k*n+j])*(b[_sol[k]*n+_sol[j]]-b[_sol[k]*n+_sol[i]]) + + (a[i*n+k]-a[j*n+k])*(b[_sol[j]*n+_sol[k]]-b[_sol[i]*n+_sol[k]]); return(d); } + + }; #endif diff --git a/ParadisEO-GPU/tutoriel/QAP_CPU/src/Solution.h b/ParadisEO-GPU/tutoriel/QAP_CPU/src/Solution.h index 0fb39fb52..c45109d17 100644 --- a/ParadisEO-GPU/tutoriel/QAP_CPU/src/Solution.h +++ b/ParadisEO-GPU/tutoriel/QAP_CPU/src/Solution.h @@ -1,9 +1,9 @@ #ifndef _SOLUTION_H_ #define _SOLUTION_H_ -#include // PARADISEO +#include -class Solution:public EO { // PARADISEO +class Solution:public EO { public: