independant ParadisEO-GPU
git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@2583 331e1502-861f-0410-8da2-ba01fb791d7f
This commit is contained in:
parent
6186d4dafc
commit
a491982731
19 changed files with 2388 additions and 0 deletions
5
branches/ParadisEO-GPU/paradiseo-gpu/AUTHORS
Normal file
5
branches/ParadisEO-GPU/paradiseo-gpu/AUTHORS
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
Authors:
|
||||||
|
Boufaras Karima
|
||||||
|
Thé Van Luong
|
||||||
|
|
||||||
|
|
||||||
131
branches/ParadisEO-GPU/paradiseo-gpu/CMakeLists.txt
Normal file
131
branches/ParadisEO-GPU/paradiseo-gpu/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,131 @@
|
||||||
|
######################################################################################
|
||||||
|
### 0) Set your application properties
|
||||||
|
######################################################################################
|
||||||
|
# check cmake version compatibility
|
||||||
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
|
||||||
|
|
||||||
|
# Here define your project name
|
||||||
|
PROJECT(Paradiseo-GPU)
|
||||||
|
|
||||||
|
SET(PACKAGE_BUGREPORT "paradiseo-help@lists.gforge.inria.fr" CACHE STRING "Package bug report" FORCE)
|
||||||
|
SET(PACKAGE_NAME "ParadisEO-GPU - Moving Objects GPU" CACHE STRING "Package name" FORCE)
|
||||||
|
SET(PACKAGE_STRING "ParadisEO-GPU 1.0" CACHE STRING "GPU Package string full name" FORCE)
|
||||||
|
SET(PACKAGE_VERSION "1.0" CACHE STRING "Package version" FORCE)
|
||||||
|
SET(GLOBAL_VERSION "1.0" CACHE STRING "Global version" FORCE)
|
||||||
|
SET(VERSION "1.0.0" CACHE STRING "Version" FORCE)
|
||||||
|
|
||||||
|
# regular expression checking
|
||||||
|
INCLUDE_REGULAR_EXPRESSION("^.*$" "^$")
|
||||||
|
|
||||||
|
# set a language for the entire project.
|
||||||
|
ENABLE_LANGUAGE(CXX)
|
||||||
|
ENABLE_LANGUAGE(C)
|
||||||
|
|
||||||
|
######################################################################################
|
||||||
|
|
||||||
|
##########################################
|
||||||
|
# Find Cuda package #
|
||||||
|
##########################################
|
||||||
|
|
||||||
|
|
||||||
|
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMake/cuda" ${CMAKE_MODULE_PATH})
|
||||||
|
find_package(CUDA QUIET REQUIRED)
|
||||||
|
|
||||||
|
# Check if CUDA was found
|
||||||
|
if (CUDA_FOUND)
|
||||||
|
message("CUDA found")
|
||||||
|
else()
|
||||||
|
message("CUDA not found")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
######################################################################################
|
||||||
|
### 1) Include the install configuration file where are defined the main variables
|
||||||
|
######################################################################################
|
||||||
|
|
||||||
|
INCLUDE(${CMAKE_SOURCE_DIR}/install.cmake)
|
||||||
|
|
||||||
|
######################################################################################
|
||||||
|
|
||||||
|
######################################################################################
|
||||||
|
### 2) Include the sources
|
||||||
|
######################################################################################
|
||||||
|
|
||||||
|
##########################################
|
||||||
|
# Include required modules & utilities #
|
||||||
|
##########################################
|
||||||
|
|
||||||
|
INCLUDE(CMakeBackwardCompatibilityCXX)
|
||||||
|
|
||||||
|
INCLUDE(FindDoxygen)
|
||||||
|
|
||||||
|
INCLUDE(CheckLibraryExists)
|
||||||
|
|
||||||
|
INCLUDE(Dart OPTIONAL)
|
||||||
|
|
||||||
|
# Set a special flag if the environment is windows (should do the same in a config.g file)
|
||||||
|
IF (WIN32)
|
||||||
|
ADD_DEFINITIONS(-D_WINDOWS=1)
|
||||||
|
ENDIF (WIN32)
|
||||||
|
|
||||||
|
######################################################################################
|
||||||
|
|
||||||
|
#########################
|
||||||
|
# Manage the build type #
|
||||||
|
#########################
|
||||||
|
|
||||||
|
# the user should choose the build type on windows environments,excepted under cygwin (default=none)
|
||||||
|
SET(CMAKE_DEFAULT_BUILD_TYPE "Release" CACHE STRING "Variable that stores the default CMake build type" FORCE)
|
||||||
|
|
||||||
|
FIND_PROGRAM(MEMORYCHECK_COMMAND
|
||||||
|
NAMES purify valgrind
|
||||||
|
PATHS
|
||||||
|
"/usr/local/bin /usr/bin [HKEY_LOCAL_MACHINE\\SOFTWARE\\Rational Software\\Purify\\Setup;InstallFolder]"
|
||||||
|
DOC "Path to the memory checking command, used for memory error detection.")
|
||||||
|
|
||||||
|
IF(NOT CMAKE_BUILD_TYPE)
|
||||||
|
SET( CMAKE_BUILD_TYPE
|
||||||
|
${CMAKE_DEFAULT_BUILD_TYPE} CACHE STRING
|
||||||
|
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
|
||||||
|
FORCE)
|
||||||
|
ENDIF(NOT CMAKE_BUILD_TYPE)
|
||||||
|
|
||||||
|
IF(WIN32 AND NOT CYGWIN)
|
||||||
|
IF(CMAKE_CXX_COMPILER MATCHES cl)
|
||||||
|
IF(NOT WITH_SHARED_LIBS)
|
||||||
|
IF(CMAKE_GENERATOR STREQUAL "Visual Studio 8 2005" OR CMAKE_GENERATOR STREQUAL "Visual Studio 9 2008")
|
||||||
|
SET(CMAKE_CXX_FLAGS "/nologo /Gy")
|
||||||
|
SET(CMAKE_CXX_FLAGS_DEBUG "/W3 /MTd /Z7 /Od")
|
||||||
|
SET(CMAKE_CXX_FLAGS_RELEASE "/w /MT /O2 /wd4530")
|
||||||
|
SET(CMAKE_CXX_FLAGS_MINSIZEREL "/MT /O2")
|
||||||
|
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MTd /Z7 /Od")
|
||||||
|
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:CONSOLE")
|
||||||
|
ENDIF(CMAKE_GENERATOR STREQUAL "Visual Studio 8 2005" OR CMAKE_GENERATOR STREQUAL "Visual Studio 9 2008")
|
||||||
|
ENDIF(NOT WITH_SHARED_LIBS)
|
||||||
|
ENDIF(CMAKE_CXX_COMPILER MATCHES cl)
|
||||||
|
ELSE(WIN32 AND NOT CYGWIN)
|
||||||
|
IF(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
|
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O2 -g -pg -fprofile-arcs -ftest-coverage -Wall -Wextra -Wno-unused-parameter")
|
||||||
|
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2")
|
||||||
|
SET(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -O6")
|
||||||
|
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
|
ENDIF(WIN32 AND NOT CYGWIN)
|
||||||
|
|
||||||
|
IF(CMAKE_BUILD_TYPE MATCHES Debug)
|
||||||
|
ADD_DEFINITIONS(-DCMAKE_VERBOSE_MAKEFILE=ON)
|
||||||
|
ENDIF(CMAKE_BUILD_TYPE MATCHES Debug)
|
||||||
|
|
||||||
|
EXECUTE_PROCESS(
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||||
|
${PARADISEO_GPU_SRC_DIR}/CTestCustom.cmake
|
||||||
|
${PARADISEO_GPU_BIN_DIR}/CTestCustom.cmake)
|
||||||
|
##########################################################################################################################################
|
||||||
|
######################################################################################
|
||||||
|
### 3) Link the librairies for your executable
|
||||||
|
######################################################################################
|
||||||
|
|
||||||
|
ADD_SUBDIRECTORY(doc)
|
||||||
|
ADD_SUBDIRECTORY(test)
|
||||||
|
ADD_SUBDIRECTORY(tutorial)
|
||||||
|
|
||||||
|
######################################################################################
|
||||||
|
|
||||||
7
branches/ParadisEO-GPU/paradiseo-gpu/CTestConfig.cmake
Normal file
7
branches/ParadisEO-GPU/paradiseo-gpu/CTestConfig.cmake
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
set(CTEST_PROJECT_NAME "ParadisEO")
|
||||||
|
set(CTEST_NIGHTLY_START_TIME "00:00:00 EST")
|
||||||
|
|
||||||
|
set(CTEST_DROP_METHOD "http")
|
||||||
|
set(CTEST_DROP_SITE "cdash.inria.fr")
|
||||||
|
set(CTEST_DROP_LOCATION "/CDash/submit.php?project=ParadisEO")
|
||||||
|
set(CTEST_DROP_SITE_CDASH TRUE)
|
||||||
8
branches/ParadisEO-GPU/paradiseo-gpu/CTestCustom.cmake
Normal file
8
branches/ParadisEO-GPU/paradiseo-gpu/CTestCustom.cmake
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
SET(CTEST_CUSTOM_COVERAGE_EXCLUDE
|
||||||
|
${CTEST_CUSTOM_COVERAGE_EXCLUDE}
|
||||||
|
"test/"
|
||||||
|
"paradiseo-eo/"
|
||||||
|
"paradiseo-mo/"
|
||||||
|
"paradiseo-gpu/"
|
||||||
|
"problems/"
|
||||||
|
)
|
||||||
81
branches/ParadisEO-GPU/paradiseo-gpu/README.txt
Normal file
81
branches/ParadisEO-GPU/paradiseo-gpu/README.txt
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
PARADISEO-GPU README FILE
|
||||||
|
=======================================================================
|
||||||
|
check latest news at http://paradiseo.gforge.inria.fr/
|
||||||
|
=======================================================================
|
||||||
|
|
||||||
|
Welcome to ParadisEO-GPU, the reusable design and implementation of parallel meta-
|
||||||
|
heuristics on Graphics Processing Units (GPU).
|
||||||
|
The latest news about ParadisEO-GPU can be found on the gforge repository at
|
||||||
|
http://paradiseo.gforge.inria.fr/index.php?n=Doc.API
|
||||||
|
In case of any problem, please e-mail us at
|
||||||
|
paradiseo-help@lists.gforge.inria.fr
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=======================================================================
|
||||||
|
BUILDING PARADISEO-PEO
|
||||||
|
=======================================================================
|
||||||
|
The basic installation procedure goes the following.
|
||||||
|
|
||||||
|
To compile paradiseo-gpu in the default directory,
|
||||||
|
go to paradiseo-gpu/build/ and run:
|
||||||
|
> cmake ..
|
||||||
|
> make
|
||||||
|
// for an easy-use of the provided lessons
|
||||||
|
> make install
|
||||||
|
// optional (if the documentation is not already available)
|
||||||
|
> make doc
|
||||||
|
|
||||||
|
To compile paradiseo-peo anywhere else, simply run:
|
||||||
|
> cmake $(GPU) -Dconfig=<path to the install.cmake file>
|
||||||
|
> make
|
||||||
|
// for an easy-use of the provided lessons
|
||||||
|
> make install
|
||||||
|
// optional (if the documentation is not already available)
|
||||||
|
> make doc
|
||||||
|
|
||||||
|
To clean everything, simply run
|
||||||
|
> make clean
|
||||||
|
|
||||||
|
|
||||||
|
===================================================================
|
||||||
|
DIRECTORY STRUCTURE
|
||||||
|
===================================================================
|
||||||
|
After unpacking the archive file, you should end up with the following
|
||||||
|
structure:
|
||||||
|
|
||||||
|
.../ The main PARADISEO-GPU directory, created when unpacking.
|
||||||
|
|
|
||||||
|
+-- build BUILD directory that contains libraries and executable files.
|
||||||
|
|
|
||||||
|
+-- src SOURCE directory Contains most PARADISEO-GPU .h files.
|
||||||
|
|
|
||||||
|
+-- doc DOCUMENTATION directory (generated by Doxygen).
|
||||||
|
| |
|
||||||
|
| +- html HTML files - start at index.html.
|
||||||
|
| |
|
||||||
|
| +- latex latex files - use to generate Postcript doc.
|
||||||
|
| |
|
||||||
|
| +- man Unix man format documentation.
|
||||||
|
|
|
||||||
|
|
|
||||||
|
+-- tutorial APPLICATIONS
|
||||||
|
|
|
||||||
|
+-- INSTANCES The instances problem directory (QAP instances ...)
|
||||||
|
|
|
||||||
|
+-- OneMax How make One max problem with parallel evalution of neighborhood(bit flipping) with hamming distances =1
|
||||||
|
|
|
||||||
|
+-- KswapOneMax How make One max problem with parallel evalution of neighborhood(bit flipping) with hamming distances >=1
|
||||||
|
|
|
||||||
|
+-- PPP_GPU How make Permuted Perceptron Problem with parallel evalution of neighborhood on GPU
|
||||||
|
|
|
||||||
|
+-- QAP_GPU How make Quadratic Assignement Problem with parallel evaluation of neighborhood on GPU
|
||||||
|
|
|
||||||
|
+-- QAP_CPU How make Quadratic Assignement Problem with sequentiel evaluation of neighborhood on CPU
|
||||||
|
|
||||||
|
|
||||||
|
===================================================================
|
||||||
|
NOTES
|
||||||
|
===================================================================
|
||||||
|
|
||||||
|
Mailing list : paradiseo-help@lists.gforge.inria.fr
|
||||||
18
branches/ParadisEO-GPU/paradiseo-gpu/install.cmake
Normal file
18
branches/ParadisEO-GPU/paradiseo-gpu/install.cmake
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
#######################################################################################
|
||||||
|
### Paths to EO, MO, GPU, MOEO and CUDA must be specified above.
|
||||||
|
#######################################################################################
|
||||||
|
|
||||||
|
SET(EO_SRC_DIR "${CMAKE_SOURCE_DIR}/../paradiseo-eo" CACHE PATH "ParadisEO-EO source directory" FORCE)
|
||||||
|
SET(EO_BIN_DIR "${CMAKE_BINARY_DIR}/../../paradiseo-eo/build" CACHE PATH "ParadisEO-EO binary directory" FORCE)
|
||||||
|
|
||||||
|
SET(MO_SRC_DIR "${CMAKE_SOURCE_DIR}/../paradiseo-mo" CACHE PATH "ParadisMO-MO source directory" FORCE)
|
||||||
|
SET(MO_BIN_DIR "${CMAKE_BINARY_DIR}/../../paradiseo-mo/build" CACHE PATH "ParadisMO-MO binary directory" FORCE)
|
||||||
|
|
||||||
|
SET(GPU_SRC_DIR "${CMAKE_SOURCE_DIR}/../paradiseo-gpu" CACHE PATH "ParadisEO-GPU source directory" FORCE)
|
||||||
|
SET(GPU_BIN_DIR "${CMAKE_BINARY_DIR}/../../paradiseo-gpu/build" CACHE PATH "ParadisEO-GPU binary directory" FORCE)
|
||||||
|
|
||||||
|
SET(PROBLEMS_SRC_DIR "${CMAKE_SOURCE_DIR}/../problems" CACHE PATH "Problems dependant source directory" FORCE)
|
||||||
|
|
||||||
|
SET(CUDA_DIR "/usr/local/cuda" CACHE PATH "cuda directory" FORCE)
|
||||||
|
|
||||||
|
|
||||||
129
branches/ParadisEO-GPU/problems/eval/bbRoyalRoadEval.h
Normal file
129
branches/ParadisEO-GPU/problems/eval/bbRoyalRoadEval.h
Normal file
|
|
@ -0,0 +1,129 @@
|
||||||
|
/*
|
||||||
|
<bbRoyalRoadEval.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010
|
||||||
|
|
||||||
|
Sebastien Verel, Arnaud Liefooghe, Jeremie Humeau
|
||||||
|
|
||||||
|
This software is governed by the CeCILL license under French law and
|
||||||
|
abiding by the rules of distribution of free software. You can ue,
|
||||||
|
modify and/ or redistribute the software under the terms of the CeCILL
|
||||||
|
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||||
|
"http://www.cecill.info".
|
||||||
|
|
||||||
|
In this respect, the user's attention is drawn to the risks associated
|
||||||
|
with loading, using, modifying and/or developing or reproducing the
|
||||||
|
software by the user in light of its specific status of free software,
|
||||||
|
that may mean that it is complicated to manipulate, and that also
|
||||||
|
therefore means that it is reserved for developers and experienced
|
||||||
|
professionals having in-depth computer knowledge. Users are therefore
|
||||||
|
encouraged to load and test the software's suitability as regards their
|
||||||
|
requirements in conditions enabling the security of their systems and/or
|
||||||
|
data to be ensured and, more generally, to use and operate it in the
|
||||||
|
same conditions as regards security.
|
||||||
|
The fact that you are presently reading this means that you have had
|
||||||
|
knowledge of the CeCILL license and that you accept its terms.
|
||||||
|
|
||||||
|
ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||||
|
Contact: paradiseo-help@lists.gforge.inria.fr
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _bbRoyalRoadEval_h
|
||||||
|
#define _bbRoyalRoadEval_h
|
||||||
|
|
||||||
|
#include <eoEvalFunc.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Full evaluation Function for Building-Block Royal Road problem:
|
||||||
|
* Richard A. Watson & Thomas Jansen, "A building-block royal road where crossover is provably essential", GECCO 07.
|
||||||
|
*/
|
||||||
|
template< class EOT >
|
||||||
|
class BBRoyalRoadEval : public eoEvalFunc<EOT>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Default constructor
|
||||||
|
* @param _b number of blocks
|
||||||
|
* @param _k size of a block
|
||||||
|
*/
|
||||||
|
BBRoyalRoadEval(unsigned int _b, unsigned int _k) : k(_k), b(_b) { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* add a target to sub-objective functions
|
||||||
|
*
|
||||||
|
* @param target target vector of boolean (of size k)
|
||||||
|
* @param w weights of this target
|
||||||
|
*/
|
||||||
|
void addTarget(vector<bool> & target, double w) {
|
||||||
|
targets.push_back(target);
|
||||||
|
weights.push_back(w);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Count the number of complete blocks in the bit string
|
||||||
|
* @param _sol the solution to evaluate
|
||||||
|
*/
|
||||||
|
void operator() (EOT& _solution) {
|
||||||
|
double sum = 0;
|
||||||
|
|
||||||
|
unsigned int i, j, t;
|
||||||
|
unsigned int offset;
|
||||||
|
|
||||||
|
// Hamming distance
|
||||||
|
double d;
|
||||||
|
|
||||||
|
for(i = 0; i < b; i++) {
|
||||||
|
offset = i * k;
|
||||||
|
|
||||||
|
for(t = 0; t < targets.size(); t++) {
|
||||||
|
d = 0;
|
||||||
|
for(j = 0; j < k; j++)
|
||||||
|
if (_solution[offset + j] != targets[t][j])
|
||||||
|
d++;
|
||||||
|
|
||||||
|
if (d == 0)
|
||||||
|
sum += weights[t];
|
||||||
|
else
|
||||||
|
sum += 1.0 / ( 1.0 + d );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_solution.fitness(sum);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the size of a block
|
||||||
|
* @return block size
|
||||||
|
*/
|
||||||
|
unsigned int blockSize() {
|
||||||
|
return k;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the number of blocks
|
||||||
|
* @return the number of blocks
|
||||||
|
*/
|
||||||
|
unsigned int nbBlocks() {
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the targets
|
||||||
|
* @return the vector of targets which is a boolean vector
|
||||||
|
*/
|
||||||
|
vector<vector<bool> > & getTargets() {
|
||||||
|
return targets;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// number of blocks
|
||||||
|
unsigned int b;
|
||||||
|
|
||||||
|
// size of a block
|
||||||
|
unsigned int k;
|
||||||
|
|
||||||
|
vector<vector<bool> > targets;
|
||||||
|
vector<double> weights;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
189
branches/ParadisEO-GPU/problems/eval/longKPathEval.h
Normal file
189
branches/ParadisEO-GPU/problems/eval/longKPathEval.h
Normal file
|
|
@ -0,0 +1,189 @@
|
||||||
|
/*
|
||||||
|
<longKPathEval.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010
|
||||||
|
|
||||||
|
Sébastien Verel
|
||||||
|
|
||||||
|
This software is governed by the CeCILL license under French law and
|
||||||
|
abiding by the rules of distribution of free software. You can ue,
|
||||||
|
modify and/ or redistribute the software under the terms of the CeCILL
|
||||||
|
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||||
|
"http://www.cecill.info".
|
||||||
|
|
||||||
|
In this respect, the user's attention is drawn to the risks associated
|
||||||
|
with loading, using, modifying and/or developing or reproducing the
|
||||||
|
software by the user in light of its specific status of free software,
|
||||||
|
that may mean that it is complicated to manipulate, and that also
|
||||||
|
therefore means that it is reserved for developers and experienced
|
||||||
|
professionals having in-depth computer knowledge. Users are therefore
|
||||||
|
encouraged to load and test the software's suitability as regards their
|
||||||
|
requirements in conditions enabling the security of their systems and/or
|
||||||
|
data to be ensured and, more generally, to use and operate it in the
|
||||||
|
same conditions as regards security.
|
||||||
|
The fact that you are presently reading this means that you have had
|
||||||
|
knowledge of the CeCILL license and that you accept its terms.
|
||||||
|
|
||||||
|
ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||||
|
Contact: paradiseo-help@lists.gforge.inria.fr
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __longKPathEval_h
|
||||||
|
#define __longKPathEval_h
|
||||||
|
|
||||||
|
#include <eoEvalFunc.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Full evaluation function for long k-path problem
|
||||||
|
*/
|
||||||
|
template< class EOT >
|
||||||
|
class LongKPathEval : public eoEvalFunc<EOT>
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
// parameter k of the problem
|
||||||
|
unsigned k;
|
||||||
|
|
||||||
|
// tempory variable if the solution is in the long path
|
||||||
|
bool inPath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* compute the number k j in solution = u1^kO^jw between i and i - k + 1 with |u1^kO^j| = i and k+j <= k
|
||||||
|
*
|
||||||
|
* @param solution the solution to evaluate
|
||||||
|
* @param l last position in the bit string
|
||||||
|
* @param n0 number of consecutive 0
|
||||||
|
* @param n1 number of consecutive 1
|
||||||
|
*/
|
||||||
|
void nbOnesZeros(EOT & solution, unsigned l, unsigned & n0, unsigned & n1) {
|
||||||
|
n0 = 0;
|
||||||
|
|
||||||
|
unsigned ind = l - 1;
|
||||||
|
|
||||||
|
while (n0 < k && solution[ind - n0] == 0)
|
||||||
|
n0++;
|
||||||
|
|
||||||
|
n1 = 0;
|
||||||
|
|
||||||
|
ind = ind - n0;
|
||||||
|
while (n0 + n1 < k && solution[ind - n1] == 1)
|
||||||
|
n1++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* true if the solution is the last solution of the path of bitstring length l
|
||||||
|
*
|
||||||
|
* @param solution the solution to evaluate
|
||||||
|
* @param l size of the path, last position in the bit string
|
||||||
|
* @return true if the solution is the solution of the path
|
||||||
|
*/
|
||||||
|
bool final(EOT & solution, unsigned l) {
|
||||||
|
if (l == 1)
|
||||||
|
return (solution[0] == 1);
|
||||||
|
else {
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
while (i < l - k && solution[i] == 0)
|
||||||
|
i++;
|
||||||
|
|
||||||
|
if (i < l - k)
|
||||||
|
return false;
|
||||||
|
else {
|
||||||
|
while (i < l && solution[i] == 1)
|
||||||
|
i++;
|
||||||
|
|
||||||
|
return (i == l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* position in the long path
|
||||||
|
*
|
||||||
|
* @param solution the solution to evaluate
|
||||||
|
* @param l size of the path, last position in the bit string
|
||||||
|
* @return position in the path
|
||||||
|
*/
|
||||||
|
unsigned rank(EOT & solution, unsigned int l) {
|
||||||
|
if (l == 1) { // long path l = 1
|
||||||
|
inPath = true;
|
||||||
|
|
||||||
|
if (solution[0] == 0)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return 1;
|
||||||
|
} else { // long path for l>1
|
||||||
|
unsigned n0, n1;
|
||||||
|
|
||||||
|
// read the k last bits, and count the number of last successive 0 follow by the last successive 1
|
||||||
|
nbOnesZeros(solution, l, n0, n1);
|
||||||
|
|
||||||
|
if (n0 == k) // first part of the path
|
||||||
|
return rank(solution, l - k);
|
||||||
|
else
|
||||||
|
if (n1 == k) { // last part of the path
|
||||||
|
return (k+1) * (1 << ((l-1) / k)) - k - rank(solution, l - k);
|
||||||
|
} else
|
||||||
|
if (n0 + n1 == k) {
|
||||||
|
if (final(solution, l - k)) {
|
||||||
|
inPath = true;
|
||||||
|
return (k+1) * (1 << ((l-k-1) / k)) - k + n1;
|
||||||
|
} else {
|
||||||
|
inPath = false;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
inPath = false;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* compute the number of zero of the bit string
|
||||||
|
*
|
||||||
|
* @param solution the solution to evaluate
|
||||||
|
* @return number of zero in the bit string
|
||||||
|
*/
|
||||||
|
unsigned int nbZero(EOT & solution){
|
||||||
|
unsigned int res = 0;
|
||||||
|
|
||||||
|
for(unsigned int i=0; i < solution.size(); i++)
|
||||||
|
if (solution[i] == 0)
|
||||||
|
res++;
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Default constructor
|
||||||
|
*
|
||||||
|
* @param _k parameter k of the long K-path problem
|
||||||
|
*/
|
||||||
|
LongKPathEval(unsigned _k) : k(_k) {
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* default destructor
|
||||||
|
*/
|
||||||
|
~LongKPathEval(void) {} ;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* compute the fitnes of the solution
|
||||||
|
*
|
||||||
|
* @param solution the solution to evaluate
|
||||||
|
* @return fitness of the solution
|
||||||
|
*/
|
||||||
|
void operator()(EOT & solution) {
|
||||||
|
inPath = true;
|
||||||
|
|
||||||
|
unsigned r = rank(solution, solution.size());
|
||||||
|
|
||||||
|
if (inPath)
|
||||||
|
solution.fitness(solution.size() + r);
|
||||||
|
else
|
||||||
|
solution.fitness(nbZero(solution));
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
277
branches/ParadisEO-GPU/problems/eval/maxSATeval.h
Normal file
277
branches/ParadisEO-GPU/problems/eval/maxSATeval.h
Normal file
|
|
@ -0,0 +1,277 @@
|
||||||
|
/*
|
||||||
|
<maxSATeval.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010
|
||||||
|
|
||||||
|
Sebastien Verel, Arnaud Liefooghe, Jeremie Humeau
|
||||||
|
|
||||||
|
This software is governed by the CeCILL license under French law and
|
||||||
|
abiding by the rules of distribution of free software. You can ue,
|
||||||
|
modify and/ or redistribute the software under the terms of the CeCILL
|
||||||
|
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||||
|
"http://www.cecill.info".
|
||||||
|
|
||||||
|
In this respect, the user's attention is drawn to the risks associated
|
||||||
|
with loading, using, modifying and/or developing or reproducing the
|
||||||
|
software by the user in light of its specific status of free software,
|
||||||
|
that may mean that it is complicated to manipulate, and that also
|
||||||
|
therefore means that it is reserved for developers and experienced
|
||||||
|
professionals having in-depth computer knowledge. Users are therefore
|
||||||
|
encouraged to load and test the software's suitability as regards their
|
||||||
|
requirements in conditions enabling the security of their systems and/or
|
||||||
|
data to be ensured and, more generally, to use and operate it in the
|
||||||
|
same conditions as regards security.
|
||||||
|
The fact that you are presently reading this means that you have had
|
||||||
|
knowledge of the CeCILL license and that you accept its terms.
|
||||||
|
|
||||||
|
ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||||
|
Contact: paradiseo-help@lists.gforge.inria.fr
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _maxSATeval_h
|
||||||
|
#define _maxSATeval_h
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <eoEvalFunc.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Full evaluation Function for max-SAT problem
|
||||||
|
*/
|
||||||
|
template< class EOT >
|
||||||
|
class MaxSATeval : public eoEvalFunc<EOT>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* generate a random instance of max k-SAT problem
|
||||||
|
*
|
||||||
|
* @param _n number of variables
|
||||||
|
* @param _m number of clauses
|
||||||
|
* @param _k of litteral by clause
|
||||||
|
*/
|
||||||
|
MaxSATeval(unsigned _n, unsigned _m, unsigned _k) {
|
||||||
|
nbVar = _n;
|
||||||
|
nbClauses = _m;
|
||||||
|
nbLitteral = _k;
|
||||||
|
|
||||||
|
// creation of the clauses
|
||||||
|
clauses = new std::vector<int>[nbClauses];
|
||||||
|
|
||||||
|
// the variables are numbered from 1 to nbVar
|
||||||
|
variables = new std::vector<int>[nbVar + 1];
|
||||||
|
|
||||||
|
//int var[nbVar];
|
||||||
|
std::vector<int> var;
|
||||||
|
var.resize(nbVar);
|
||||||
|
unsigned i, j, ind;
|
||||||
|
|
||||||
|
// to selected nbLitteral different variables in the clauses
|
||||||
|
for(i = 0; i < nbVar; i++)
|
||||||
|
var[i] = i + 1;
|
||||||
|
|
||||||
|
int number, tmp;
|
||||||
|
|
||||||
|
// generation of the clauses
|
||||||
|
for(i = 0; i < nbClauses; i++) {
|
||||||
|
for(j = 0 ; j < nbLitteral; j++) {
|
||||||
|
// selection of the variable
|
||||||
|
ind = rng.random(nbVar - j);
|
||||||
|
number = var[ind];
|
||||||
|
|
||||||
|
// permutation for forbidd identical variables
|
||||||
|
tmp = var[ind];
|
||||||
|
var[ind] = var[nbVar - j - 1];
|
||||||
|
var[nbVar - j - 1] = tmp;
|
||||||
|
|
||||||
|
// litteral = (variable) or (not variable) ?
|
||||||
|
// negative value means not variable
|
||||||
|
if (rng.flip())
|
||||||
|
number = -number;
|
||||||
|
|
||||||
|
// variable number belong to clause i
|
||||||
|
if (number < 0)
|
||||||
|
variables[-number].push_back(-i);
|
||||||
|
else
|
||||||
|
variables[number].push_back(i);
|
||||||
|
|
||||||
|
// clause i has got the litteral number
|
||||||
|
clauses[i].push_back(number);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* instance is given in the cnf format (see dimacs)
|
||||||
|
*
|
||||||
|
* @param _fileName file name of the instance in cnf format
|
||||||
|
*/
|
||||||
|
MaxSATeval(std::string & _fileName) {
|
||||||
|
std::fstream file(_fileName.c_str(), std::ios::in);
|
||||||
|
|
||||||
|
if (!file) {
|
||||||
|
std::string str = "MaxSATeval: Could not open file [" + _fileName + "]." ;
|
||||||
|
throw std::runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string s;
|
||||||
|
|
||||||
|
// commentaries
|
||||||
|
std::string line;
|
||||||
|
file >> s;
|
||||||
|
while (s[0] == 'c') {
|
||||||
|
getline(file,line,'\n');
|
||||||
|
file >> s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// parameters
|
||||||
|
if (s[0] != 'p') {
|
||||||
|
std::string str = "MaxSATeval: could not read the parameters of the instance from file [" + _fileName + "]." ;
|
||||||
|
throw std::runtime_error(str);
|
||||||
|
}
|
||||||
|
file >> s;
|
||||||
|
if (s != "cnf") {
|
||||||
|
std::string str = "MaxSATeval: " + _fileName + " is not a file in cnf format.";
|
||||||
|
throw std::runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
file >> nbVar >> nbClauses;
|
||||||
|
nbLitteral = 0; // could be different from one clause to antoher, so no value
|
||||||
|
|
||||||
|
// creation of the clauses
|
||||||
|
clauses = new std::vector<int>[nbClauses];
|
||||||
|
|
||||||
|
// the variables are numbered from 1 to nbVar
|
||||||
|
variables = new std::vector<int>[nbVar + 1];
|
||||||
|
|
||||||
|
// read the clauses
|
||||||
|
int number;
|
||||||
|
for(unsigned i = 0; i < nbClauses; i++) {
|
||||||
|
do {
|
||||||
|
file >> number;
|
||||||
|
if (number != 0) {
|
||||||
|
clauses[i].push_back(number);
|
||||||
|
if (number < 0)
|
||||||
|
number = -number;
|
||||||
|
|
||||||
|
if (number < 0)
|
||||||
|
variables[-number].push_back(-i);
|
||||||
|
else
|
||||||
|
variables[number].push_back(i);
|
||||||
|
}
|
||||||
|
} while (number != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destructor
|
||||||
|
*/
|
||||||
|
~MaxSATeval() {
|
||||||
|
// delete the clauses
|
||||||
|
delete[] clauses;
|
||||||
|
|
||||||
|
// delete the variables
|
||||||
|
delete[] variables;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* export the instance to a file in cnf format
|
||||||
|
*
|
||||||
|
* @param _fileName file name to export the instance
|
||||||
|
*/
|
||||||
|
void save(std::string & _fileName) {
|
||||||
|
std::fstream file(_fileName.c_str(), std::ios::out);
|
||||||
|
|
||||||
|
if (!file) {
|
||||||
|
std::string str = "MaxSATeval: Could not open " + _fileName;
|
||||||
|
throw std::runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// write some commentaries
|
||||||
|
file << "c random max k-SAT generated by maxSATeval from paradisEO framework on sourceForge" << std::endl;
|
||||||
|
file << "c "<< std::endl;
|
||||||
|
|
||||||
|
// write the parameters
|
||||||
|
file << "p cnf " << nbVar << " " << nbClauses << std::endl;
|
||||||
|
|
||||||
|
// write the clauses
|
||||||
|
unsigned int i, j;
|
||||||
|
|
||||||
|
for(i = 0; i < nbClauses; i++) {
|
||||||
|
j = 0;
|
||||||
|
while (j < clauses[i].size()) {
|
||||||
|
file << clauses[i][j] << " ";
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
file << "0" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* evaluation the clause
|
||||||
|
*
|
||||||
|
* @param _n number of the given clause
|
||||||
|
* @param _solution the solution to evaluation
|
||||||
|
* @return true when the clause is true
|
||||||
|
*/
|
||||||
|
bool clauseEval(unsigned int _n, EOT & _solution) {
|
||||||
|
unsigned nLitteral = clauses[_n].size();
|
||||||
|
int litteral;
|
||||||
|
|
||||||
|
bool clause = false;
|
||||||
|
|
||||||
|
unsigned int j = 0;
|
||||||
|
while (j < nLitteral && !clause) {
|
||||||
|
litteral = clauses[_n][j];
|
||||||
|
clause = ((litteral > 0) && _solution[litteral - 1]) || ((litteral < 0) && !(_solution[-litteral - 1]));
|
||||||
|
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return clause;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fitness evaluation of the solution
|
||||||
|
*
|
||||||
|
* @param _solution the solution to evaluation
|
||||||
|
*/
|
||||||
|
virtual void operator()(EOT & _solution) {
|
||||||
|
unsigned int fit = 0;
|
||||||
|
|
||||||
|
for(unsigned i = 0; i < nbClauses; i++)
|
||||||
|
if (clauseEval(i, _solution))
|
||||||
|
fit++;
|
||||||
|
|
||||||
|
_solution.fitness(fit);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Public variables (used in incremental evaluation)
|
||||||
|
*/
|
||||||
|
|
||||||
|
// number of variables
|
||||||
|
unsigned int nbVar;
|
||||||
|
// number of clauses
|
||||||
|
unsigned int nbClauses;
|
||||||
|
// number of litteral by clause (0 when the instance is read from file)
|
||||||
|
unsigned int nbLitteral;
|
||||||
|
|
||||||
|
// list of clauses:
|
||||||
|
// each clause has the number of the variable (from 1 to nbVar)
|
||||||
|
// when the value is negative, litteral = not(variable)
|
||||||
|
std::vector<int> * clauses;
|
||||||
|
|
||||||
|
// list of variables:
|
||||||
|
// for each variable, the list of clauses
|
||||||
|
// when the value is negative, litteral = not(variable) in this clause
|
||||||
|
std::vector<int> * variables;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
82
branches/ParadisEO-GPU/problems/eval/moPopSolEval.h
Normal file
82
branches/ParadisEO-GPU/problems/eval/moPopSolEval.h
Normal file
|
|
@ -0,0 +1,82 @@
|
||||||
|
/*
|
||||||
|
<moPopSolEval.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010
|
||||||
|
|
||||||
|
Sébastien Verel, Arnaud Liefooghe, Jérémie Humeau
|
||||||
|
|
||||||
|
This software is governed by the CeCILL license under French law and
|
||||||
|
abiding by the rules of distribution of free software. You can ue,
|
||||||
|
modify and/ or redistribute the software under the terms of the CeCILL
|
||||||
|
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||||
|
"http://www.cecill.info".
|
||||||
|
|
||||||
|
In this respect, the user's attention is drawn to the risks associated
|
||||||
|
with loading, using, modifying and/or developing or reproducing the
|
||||||
|
software by the user in light of its specific status of free software,
|
||||||
|
that may mean that it is complicated to manipulate, and that also
|
||||||
|
therefore means that it is reserved for developers and experienced
|
||||||
|
professionals having in-depth computer knowledge. Users are therefore
|
||||||
|
encouraged to load and test the software's suitability as regards their
|
||||||
|
requirements in conditions enabling the security of their systems and/or
|
||||||
|
data to be ensured and, more generally, to use and operate it in the
|
||||||
|
same conditions as regards security.
|
||||||
|
The fact that you are presently reading this means that you have had
|
||||||
|
knowledge of the CeCILL license and that you accept its terms.
|
||||||
|
|
||||||
|
ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||||
|
Contact: paradiseo-help@lists.gforge.inria.fr
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _moPopSolEval_h
|
||||||
|
#define _moPopSolEval_h
|
||||||
|
|
||||||
|
#include <problems/bitString/moPopSol.h>
|
||||||
|
#include <eoEvalFunc.h>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To compute the fitness of a pop-based solution
|
||||||
|
*/
|
||||||
|
template< class EOT >
|
||||||
|
class moPopSolEval : public eoEvalFunc<EOT>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef typename EOT::SUBEOT SUBEOT;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* default constructor
|
||||||
|
*
|
||||||
|
* @param _eval evaluation function of the solution
|
||||||
|
* @param _p the exponent of the p-norm to compute the population based fitness
|
||||||
|
*/
|
||||||
|
moPopSolEval(eoEvalFunc<SUBEOT>& _eval, unsigned int _p): eval(_eval), p(_p){}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* to compute the fitness of a population-based solution
|
||||||
|
* which is the norm p of the fitness of solutions: ( sigma_{i} f(s_i)^p )^(1/p)
|
||||||
|
*
|
||||||
|
* re-compute the fitness of solution which are invalid
|
||||||
|
*
|
||||||
|
* @param _sol the population-based solution to evaluate
|
||||||
|
*/
|
||||||
|
void operator() (EOT& _sol) {
|
||||||
|
double fit = 0;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < _sol.size(); i++) {
|
||||||
|
if(_sol[i].invalid())
|
||||||
|
eval(_sol[i]);
|
||||||
|
|
||||||
|
fit += pow((double) _sol[i].fitness(), (int) p);
|
||||||
|
}
|
||||||
|
|
||||||
|
fit = pow((double) fit, (double)1/p);
|
||||||
|
|
||||||
|
_sol.fitness(fit);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
eoEvalFunc<SUBEOT>& eval;
|
||||||
|
unsigned int p;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
414
branches/ParadisEO-GPU/problems/eval/nkLandscapesEval.h
Normal file
414
branches/ParadisEO-GPU/problems/eval/nkLandscapesEval.h
Normal file
|
|
@ -0,0 +1,414 @@
|
||||||
|
/*
|
||||||
|
<nkLandscapesEval.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010
|
||||||
|
|
||||||
|
Sebastien Verel
|
||||||
|
|
||||||
|
This software is governed by the CeCILL license under French law and
|
||||||
|
abiding by the rules of distribution of free software. You can ue,
|
||||||
|
modify and/ or redistribute the software under the terms of the CeCILL
|
||||||
|
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||||
|
"http://www.cecill.info".
|
||||||
|
|
||||||
|
In this respect, the user's attention is drawn to the risks associated
|
||||||
|
with loading, using, modifying and/or developing or reproducing the
|
||||||
|
software by the user in light of its specific status of free software,
|
||||||
|
that may mean that it is complicated to manipulate, and that also
|
||||||
|
therefore means that it is reserved for developers and experienced
|
||||||
|
professionals having in-depth computer knowledge. Users are therefore
|
||||||
|
encouraged to load and test the software's suitability as regards their
|
||||||
|
requirements in conditions enabling the security of their systems and/or
|
||||||
|
data to be ensured and, more generally, to use and operate it in the
|
||||||
|
same conditions as regards security.
|
||||||
|
The fact that you are presently reading this means that you have had
|
||||||
|
knowledge of the CeCILL license and that you accept its terms.
|
||||||
|
|
||||||
|
ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||||
|
Contact: paradiseo-help@lists.gforge.inria.fr
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __nkLandscapesEval_H
|
||||||
|
#define __nkLandscapesEval_H
|
||||||
|
|
||||||
|
#include <eoEvalFunc.h>
|
||||||
|
|
||||||
|
template< class EOT >
|
||||||
|
class nkLandscapesEval : public eoEvalFunc<EOT> {
|
||||||
|
public:
|
||||||
|
// parameter N : size of the bit string
|
||||||
|
unsigned N;
|
||||||
|
|
||||||
|
// parameter K : number of epistatic links
|
||||||
|
unsigned K;
|
||||||
|
|
||||||
|
// Table of contributions
|
||||||
|
double ** tables;
|
||||||
|
|
||||||
|
// Links between each bit
|
||||||
|
// links[i][0], ..., links[i][K] : the (K+1) links to the bit i
|
||||||
|
unsigned ** links;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty constructor
|
||||||
|
*/
|
||||||
|
nkLandscapesEval() : N(0), K(0)
|
||||||
|
{
|
||||||
|
tables = NULL;
|
||||||
|
links = NULL;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor of random instance
|
||||||
|
*
|
||||||
|
* @param _N size of the bit string
|
||||||
|
* @param _K number of the epistatic links
|
||||||
|
* @param consecutive : if true then the links are consecutive (i, i+1, i+2, ..., i+K), else the links are randomly choose from (1..N)
|
||||||
|
*/
|
||||||
|
nkLandscapesEval(int _N, int _K, bool consecutive = false) : N(_N), K(_K)
|
||||||
|
{
|
||||||
|
if (consecutive)
|
||||||
|
consecutiveTables();
|
||||||
|
else
|
||||||
|
randomTables();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor from a file instance
|
||||||
|
*
|
||||||
|
* @param _fileName the name of the file of the instance
|
||||||
|
*/
|
||||||
|
nkLandscapesEval(const char * _fileName)
|
||||||
|
{
|
||||||
|
string fname(_fileName);
|
||||||
|
load(fname);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default destructor of the table contribution and the links
|
||||||
|
*/
|
||||||
|
~nkLandscapesEval()
|
||||||
|
{
|
||||||
|
deleteTables();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reserve the space memory for the links and the table
|
||||||
|
*/
|
||||||
|
void buildTables()
|
||||||
|
{
|
||||||
|
links = new unsigned*[N];
|
||||||
|
tables = new double*[N];
|
||||||
|
|
||||||
|
for(unsigned i = 0; i < N; i++) {
|
||||||
|
tables[i] = new double[1<<(K+1)];
|
||||||
|
links[i] = new unsigned[K+1];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free the space memory of the table contributions and the links
|
||||||
|
*/
|
||||||
|
void deleteTables()
|
||||||
|
{
|
||||||
|
if (links != NULL) {
|
||||||
|
for(int i = 0; i < N; i++) {
|
||||||
|
delete [] (links[i]);
|
||||||
|
}
|
||||||
|
delete [] links;
|
||||||
|
links = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tables != NULL) {
|
||||||
|
for(int i = 0; i < N; i++) {
|
||||||
|
delete [] (tables[i]);
|
||||||
|
}
|
||||||
|
delete [] tables;
|
||||||
|
tables = NULL;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the instance from a file
|
||||||
|
*
|
||||||
|
* @param _fileName file name of the instance
|
||||||
|
*/
|
||||||
|
virtual void load(const string _fileName)
|
||||||
|
{
|
||||||
|
fstream file;
|
||||||
|
file.open(_fileName.c_str(), ios::in);
|
||||||
|
|
||||||
|
if (file.is_open()) {
|
||||||
|
string s;
|
||||||
|
|
||||||
|
// Read the commentairies
|
||||||
|
string line;
|
||||||
|
file >> s;
|
||||||
|
while (s[0] == 'c') {
|
||||||
|
getline(file,line,'\n');
|
||||||
|
file >> s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read the parameters
|
||||||
|
if (s[0] != 'p') {
|
||||||
|
string str = "nkLandscapesEval.load: -- p -- expected in [" + _fileName + "] at the begining." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
file >> s;
|
||||||
|
if (s != "NK") {
|
||||||
|
string str = "nkLandscapesEval.load: -- NK -- expected in [" + _fileName + "] at the begining." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// read parameters N and K
|
||||||
|
file >> N >> K;
|
||||||
|
buildTables();
|
||||||
|
|
||||||
|
// read the links
|
||||||
|
if (s[0] != 'p') {
|
||||||
|
string str = "nkLandscapesEval.load: -- p -- expected in [" + _fileName + "] after the parameters N and K." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
file >> s;
|
||||||
|
if (s == "links") {
|
||||||
|
loadLinks(file);
|
||||||
|
} else {
|
||||||
|
string str = "nkLandscapesEval.load: -- links -- expected in [" + _fileName + "] after the parameters N and K." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// lecture des tables
|
||||||
|
if (s[0] != 'p') {
|
||||||
|
string str = "nkLandscapesEval.load: -- p -- expected in [" + _fileName + "] after the links." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
file >> s;
|
||||||
|
|
||||||
|
if (s == "tables") {
|
||||||
|
loadTables(file);
|
||||||
|
} else {
|
||||||
|
string str = "nkLandscapesEval.load: -- tables -- expected in [" + _fileName + "] after the links." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
} else {
|
||||||
|
string str = "nkLandscapesEval.load: Could not open file [" + _fileName + "]." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the links from the file
|
||||||
|
*
|
||||||
|
* @param file the file to read
|
||||||
|
*/
|
||||||
|
void loadLinks(fstream & file) {
|
||||||
|
for(int j = 0; j < K+1; j++)
|
||||||
|
for(int i = 0; i < N; i++) {
|
||||||
|
file >> links[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the tables from the file
|
||||||
|
*
|
||||||
|
* @param file the file to read
|
||||||
|
*/
|
||||||
|
void loadTables(fstream & file) {
|
||||||
|
for(int j = 0; j < (1<<(K+1)); j++)
|
||||||
|
for(int i = 0; i < N; i++)
|
||||||
|
file >> tables[i][j];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save the current intance into a file
|
||||||
|
*
|
||||||
|
* @param _fileName the file name of instance
|
||||||
|
*/
|
||||||
|
virtual void save(const char * _fileName) {
|
||||||
|
fstream file;
|
||||||
|
file.open(_fileName, ios::out);
|
||||||
|
|
||||||
|
if (file.is_open()) {
|
||||||
|
file << "c name of the file : " << _fileName << endl;
|
||||||
|
file << "p NK " << N << " " << K <<endl;
|
||||||
|
|
||||||
|
file << "p links" << endl;
|
||||||
|
for(int j=0; j<K+1; j++)
|
||||||
|
for(int i=0; i<N; i++)
|
||||||
|
file << links[i][j] << endl;
|
||||||
|
|
||||||
|
file << "p tables" << endl;
|
||||||
|
for(int j=0; j<(1<<(K+1)); j++) {
|
||||||
|
for(int i=0; i<N; i++)
|
||||||
|
file << tables[i][j] << " ";
|
||||||
|
file << endl;
|
||||||
|
}
|
||||||
|
file.close();
|
||||||
|
} else {
|
||||||
|
string fname(_fileName);
|
||||||
|
string str = "nkLandscapesEval.save: Could not open file [" + fname + "]." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Print the instance to the screen
|
||||||
|
*/
|
||||||
|
void print() {
|
||||||
|
int j;
|
||||||
|
for(int i=0; i<N; i++) {
|
||||||
|
std::cout <<"link " <<i <<" : ";
|
||||||
|
for(j = 0; j <= K; j++)
|
||||||
|
std::cout <<links[i][j] <<" ";
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
for(int i=0; i<N; i++) {
|
||||||
|
std::cout <<"table " << i << std::endl;
|
||||||
|
for(j=0; j<(1<<(K+1)); j++)
|
||||||
|
std::cout << tables[i][j] << std::endl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compute the fitness value
|
||||||
|
*
|
||||||
|
* @param _solution the solution to evaluate
|
||||||
|
*/
|
||||||
|
virtual void operator() (EOT & _solution) {
|
||||||
|
double accu = 0.0;
|
||||||
|
|
||||||
|
for(int i = 0; i < N; i++)
|
||||||
|
accu += tables[ i ][ sigma(_solution, i) ];
|
||||||
|
|
||||||
|
_solution.fitness( accu / (double) N );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compute the mask of the linked bits
|
||||||
|
*
|
||||||
|
* @param _solution the solution to evaluate
|
||||||
|
* @param i the bit of the contribution
|
||||||
|
*/
|
||||||
|
unsigned int sigma(EOT & _solution, int i) {
|
||||||
|
unsigned int n = 1;
|
||||||
|
unsigned int accu = 0;
|
||||||
|
|
||||||
|
for(int j = 0; j < K+1; j++) {
|
||||||
|
if (_solution[ links[i][j] ] == 1)
|
||||||
|
accu = accu | n;
|
||||||
|
n = n << 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return accu;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To generate random instance without replacement : initialization
|
||||||
|
*
|
||||||
|
* @param tabTirage the table to initialize
|
||||||
|
*/
|
||||||
|
void initTirage(int tabTirage[]) {
|
||||||
|
for(int i = 0; i<N; i++)
|
||||||
|
tabTirage[i] = i;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To generate random instance without replacement : swap
|
||||||
|
*
|
||||||
|
* @param tabTirage the table of bits
|
||||||
|
* @param i first indice to swap
|
||||||
|
* @param j second indice to swap
|
||||||
|
*/
|
||||||
|
void perm(int tabTirage[],int i, int j) {
|
||||||
|
int k = tabTirage[i];
|
||||||
|
tabTirage[i] = tabTirage[j];
|
||||||
|
tabTirage[j] = k;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To generate random instance without replacement
|
||||||
|
* choose the linked bit without replacement
|
||||||
|
*
|
||||||
|
* @param i the bit of contribution
|
||||||
|
* @param tabTirage the table of bits
|
||||||
|
*/
|
||||||
|
void choose(int i, int tabTirage[]) {
|
||||||
|
int t[K+1];
|
||||||
|
for(int j=0; j<K+1; j++) {
|
||||||
|
if (j==0) t[j]=i;
|
||||||
|
else t[j] = rng.random(N-j);
|
||||||
|
links[i][j] = tabTirage[t[j]];
|
||||||
|
perm(tabTirage, t[j], N-1-j);
|
||||||
|
}
|
||||||
|
for(int j=K; j>=0; j--)
|
||||||
|
perm(tabTirage, t[j], N-1-j);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To generate an instance with no-random links
|
||||||
|
*
|
||||||
|
* @param i the bit of contribution
|
||||||
|
*/
|
||||||
|
void consecutiveLinks(int i) {
|
||||||
|
for(int j = 0; j < K+1; j++) {
|
||||||
|
links[i][j] = (i + j) % N;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To generate a contribution in the table f_i
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
virtual double contribution() {
|
||||||
|
return rng.uniform();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To generate instance with random (without replacement) links
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
virtual void randomTables() {
|
||||||
|
buildTables();
|
||||||
|
|
||||||
|
int tabTirage[N];
|
||||||
|
initTirage(tabTirage);
|
||||||
|
|
||||||
|
for(int i = 0; i < N; i++) {
|
||||||
|
// random links to the bit
|
||||||
|
choose(i, tabTirage);
|
||||||
|
|
||||||
|
// table of contribution with random numbers from [0,1)
|
||||||
|
for(int j = 0; j < (1<<(K+1)); j++)
|
||||||
|
tables[i][j] = contribution();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To generate instance with consecutive links
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
virtual void consecutiveTables() {
|
||||||
|
buildTables();
|
||||||
|
|
||||||
|
for(int i = 0; i < N; i++) {
|
||||||
|
// consecutive link to bit i
|
||||||
|
consecutiveLinks(i);
|
||||||
|
|
||||||
|
// table of contribution with random numbers from [0,1)
|
||||||
|
for(int j = 0; j < (1<<(K+1)); j++)
|
||||||
|
tables[i][j] = contribution();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
213
branches/ParadisEO-GPU/problems/eval/nkpLandscapesEval.h
Normal file
213
branches/ParadisEO-GPU/problems/eval/nkpLandscapesEval.h
Normal file
|
|
@ -0,0 +1,213 @@
|
||||||
|
/*
|
||||||
|
<nkpLandscapesEval.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010
|
||||||
|
|
||||||
|
Sebastien Verel
|
||||||
|
|
||||||
|
This software is governed by the CeCILL license under French law and
|
||||||
|
abiding by the rules of distribution of free software. You can ue,
|
||||||
|
modify and/ or redistribute the software under the terms of the CeCILL
|
||||||
|
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||||
|
"http://www.cecill.info".
|
||||||
|
|
||||||
|
In this respect, the user's attention is drawn to the risks associated
|
||||||
|
with loading, using, modifying and/or developing or reproducing the
|
||||||
|
software by the user in light of its specific status of free software,
|
||||||
|
that may mean that it is complicated to manipulate, and that also
|
||||||
|
therefore means that it is reserved for developers and experienced
|
||||||
|
professionals having in-depth computer knowledge. Users are therefore
|
||||||
|
encouraged to load and test the software's suitability as regards their
|
||||||
|
requirements in conditions enabling the security of their systems and/or
|
||||||
|
data to be ensured and, more generally, to use and operate it in the
|
||||||
|
same conditions as regards security.
|
||||||
|
The fact that you are presently reading this means that you have had
|
||||||
|
knowledge of the CeCILL license and that you accept its terms.
|
||||||
|
|
||||||
|
ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||||
|
Contact: paradiseo-help@lists.gforge.inria.fr
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __nkpLandscapesEval_H
|
||||||
|
#define __nkpLandscapesEval_H
|
||||||
|
|
||||||
|
#include <eval/nkLandscapesEval.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Neutral version of NK landscapes: the 'probabilistic' NK
|
||||||
|
* see work of L. Barnett "Ruggedness and Neutrality - The NKp family of Fitness Landscapes" (1998)
|
||||||
|
*/
|
||||||
|
template< class EOT >
|
||||||
|
class nkpLandscapesEval : public nkLandscapesEval<EOT> {
|
||||||
|
public:
|
||||||
|
// parameter N : size of the bit string
|
||||||
|
using nkLandscapesEval<EOT>::N;
|
||||||
|
// parameter K : number of epistatic links
|
||||||
|
using nkLandscapesEval<EOT>::K;
|
||||||
|
// Table of contributions
|
||||||
|
using nkLandscapesEval<EOT>::tables;
|
||||||
|
// Links between each bit
|
||||||
|
using nkLandscapesEval<EOT>::links;
|
||||||
|
|
||||||
|
using nkLandscapesEval<EOT>::buildTables;
|
||||||
|
using nkLandscapesEval<EOT>::loadLinks;
|
||||||
|
using nkLandscapesEval<EOT>::loadTables;
|
||||||
|
using nkLandscapesEval<EOT>::consecutiveTables;
|
||||||
|
using nkLandscapesEval<EOT>::randomTables;
|
||||||
|
|
||||||
|
// parameter p : probability to have the contribution to zero, otherwise random number from [0,1)
|
||||||
|
double p;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty constructor
|
||||||
|
*/
|
||||||
|
nkpLandscapesEval() : nkLandscapesEval<EOT>(), p(0.0) { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor of random instance
|
||||||
|
*
|
||||||
|
* @param _N size of the bit string
|
||||||
|
* @param _K number of the epistatic links
|
||||||
|
* @param _p probability to have a contribution equals to zero
|
||||||
|
* @param consecutive : if true then the links are consecutive (i, i+1, i+2, ..., i+K), else the links are randomly choose from (1..N)
|
||||||
|
*/
|
||||||
|
nkpLandscapesEval(int _N, int _K, double _p, bool consecutive = false) : nkLandscapesEval<EOT>() {
|
||||||
|
N = _N;
|
||||||
|
K = _K;
|
||||||
|
p = _p;
|
||||||
|
|
||||||
|
if (consecutive)
|
||||||
|
consecutiveTables();
|
||||||
|
else
|
||||||
|
randomTables();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor from a file instance
|
||||||
|
*
|
||||||
|
* @param _fileName the name of the file of the instance
|
||||||
|
*/
|
||||||
|
nkpLandscapesEval(const char * _fileName) : nkLandscapesEval<EOT>(_fileName) { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the instance from a file
|
||||||
|
*
|
||||||
|
* @param _fileName file name of the instance
|
||||||
|
*/
|
||||||
|
virtual void load(const string _fileName)
|
||||||
|
{
|
||||||
|
fstream file;
|
||||||
|
file.open(_fileName.c_str(), ios::in);
|
||||||
|
|
||||||
|
if (file.is_open()) {
|
||||||
|
string s;
|
||||||
|
|
||||||
|
// Read the commentairies
|
||||||
|
string line;
|
||||||
|
file >> s;
|
||||||
|
while (s[0] == 'c') {
|
||||||
|
getline(file,line,'\n');
|
||||||
|
file >> s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read the parameters
|
||||||
|
if (s[0] != 'p') {
|
||||||
|
string str = "nkLandscapesEval.load: -- p -- expected in [" + _fileName + "] at the begining." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
file >> s;
|
||||||
|
if (s != "NKp") {
|
||||||
|
string str = "nkpLandscapesEval.load: -- NKp -- expected in [" + _fileName + "] at the begining." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// read parameters N, K and p
|
||||||
|
file >> N >> K >> p;
|
||||||
|
buildTables();
|
||||||
|
|
||||||
|
// read the links
|
||||||
|
if (s[0] != 'p') {
|
||||||
|
string str = "nkpLandscapesEval.load: -- p -- expected in [" + _fileName + "] after the parameters N, K, and p." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
file >> s;
|
||||||
|
if (s == "links") {
|
||||||
|
loadLinks(file);
|
||||||
|
} else {
|
||||||
|
string str = "nkpLandscapesEval.load: -- links -- expected in [" + _fileName + "] after the parameters N, K, and q." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// lecture des tables
|
||||||
|
if (s[0] != 'p') {
|
||||||
|
string str = "nkpLandscapesEval.load: -- p -- expected in [" + _fileName + "] after the links." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
file >> s;
|
||||||
|
|
||||||
|
if (s == "tables") {
|
||||||
|
loadTables(file);
|
||||||
|
} else {
|
||||||
|
string str = "nkpLandscapesEval.load: -- tables -- expected in [" + _fileName + "] after the links." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
} else {
|
||||||
|
string str = "nkpLandscapesEval.load: Could not open file [" + _fileName + "]." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save the current intance into a file
|
||||||
|
*
|
||||||
|
* @param _fileName the file name of instance
|
||||||
|
*/
|
||||||
|
virtual void save(const char * _fileName) {
|
||||||
|
fstream file;
|
||||||
|
file.open(_fileName, ios::out);
|
||||||
|
|
||||||
|
if (file.is_open()) {
|
||||||
|
file << "c name of the file : " << _fileName << endl;
|
||||||
|
file << "p NKp " << N << " " << K << " " << p << endl;
|
||||||
|
|
||||||
|
file << "p links" << endl;
|
||||||
|
for(int j=0; j<K+1; j++)
|
||||||
|
for(int i=0; i<N; i++)
|
||||||
|
file << links[i][j] << endl;
|
||||||
|
|
||||||
|
file << "p tables" << endl;
|
||||||
|
for(int j=0; j<(1<<(K+1)); j++) {
|
||||||
|
for(int i=0; i<N; i++)
|
||||||
|
file << tables[i][j] << " ";
|
||||||
|
file << endl;
|
||||||
|
}
|
||||||
|
file.close();
|
||||||
|
} else {
|
||||||
|
string fname(_fileName);
|
||||||
|
string str = "nkpLandscapesEval.save: Could not open file [" + fname + "]." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To generate a contribution in the table f_i
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
virtual double contribution() {
|
||||||
|
if (rng.uniform() < p)
|
||||||
|
return 0.0;
|
||||||
|
else
|
||||||
|
return rng.uniform();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
209
branches/ParadisEO-GPU/problems/eval/nkqLandscapesEval.h
Normal file
209
branches/ParadisEO-GPU/problems/eval/nkqLandscapesEval.h
Normal file
|
|
@ -0,0 +1,209 @@
|
||||||
|
/*
|
||||||
|
<nkqLandscapesEval.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010
|
||||||
|
|
||||||
|
Sebastien Verel
|
||||||
|
|
||||||
|
This software is governed by the CeCILL license under French law and
|
||||||
|
abiding by the rules of distribution of free software. You can ue,
|
||||||
|
modify and/ or redistribute the software under the terms of the CeCILL
|
||||||
|
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||||
|
"http://www.cecill.info".
|
||||||
|
|
||||||
|
In this respect, the user's attention is drawn to the risks associated
|
||||||
|
with loading, using, modifying and/or developing or reproducing the
|
||||||
|
software by the user in light of its specific status of free software,
|
||||||
|
that may mean that it is complicated to manipulate, and that also
|
||||||
|
therefore means that it is reserved for developers and experienced
|
||||||
|
professionals having in-depth computer knowledge. Users are therefore
|
||||||
|
encouraged to load and test the software's suitability as regards their
|
||||||
|
requirements in conditions enabling the security of their systems and/or
|
||||||
|
data to be ensured and, more generally, to use and operate it in the
|
||||||
|
same conditions as regards security.
|
||||||
|
The fact that you are presently reading this means that you have had
|
||||||
|
knowledge of the CeCILL license and that you accept its terms.
|
||||||
|
|
||||||
|
ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||||
|
Contact: paradiseo-help@lists.gforge.inria.fr
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __nkqLandscapesEval_H
|
||||||
|
#define __nkqLandscapesEval_H
|
||||||
|
|
||||||
|
#include <eval/nkLandscapesEval.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Neutral version of NK landscapes: the 'quantised' NK
|
||||||
|
* see work of E. J. Newman, and R. Engelhardt "Effects of Neutral Selection on the Evolution of Molecular Species" (1998)
|
||||||
|
*/
|
||||||
|
template< class EOT >
|
||||||
|
class nkqLandscapesEval : public nkLandscapesEval<EOT> {
|
||||||
|
public:
|
||||||
|
// parameter N : size of the bit string
|
||||||
|
using nkLandscapesEval<EOT>::N;
|
||||||
|
// parameter K : number of epistatic links
|
||||||
|
using nkLandscapesEval<EOT>::K;
|
||||||
|
// Table of contributions
|
||||||
|
using nkLandscapesEval<EOT>::tables;
|
||||||
|
// Links between each bit
|
||||||
|
using nkLandscapesEval<EOT>::links;
|
||||||
|
|
||||||
|
using nkLandscapesEval<EOT>::buildTables;
|
||||||
|
using nkLandscapesEval<EOT>::loadLinks;
|
||||||
|
using nkLandscapesEval<EOT>::loadTables;
|
||||||
|
using nkLandscapesEval<EOT>::consecutiveTables;
|
||||||
|
using nkLandscapesEval<EOT>::randomTables;
|
||||||
|
|
||||||
|
// parameter q : number of different integer values in the table: [0..q[
|
||||||
|
unsigned q;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty constructor
|
||||||
|
*/
|
||||||
|
nkqLandscapesEval() : nkLandscapesEval<EOT>(), q(0) { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor of random instance
|
||||||
|
*
|
||||||
|
* @param _N size of the bit string
|
||||||
|
* @param _K number of the epistatic links
|
||||||
|
* @param consecutive : if true then the links are consecutive (i, i+1, i+2, ..., i+K), else the links are randomly choose from (1..N)
|
||||||
|
*/
|
||||||
|
nkqLandscapesEval(unsigned _N, unsigned _K, unsigned _q, bool consecutive = false) : nkLandscapesEval<EOT>() {
|
||||||
|
N = _N;
|
||||||
|
K = _K;
|
||||||
|
q = _q;
|
||||||
|
|
||||||
|
if (consecutive)
|
||||||
|
consecutiveTables();
|
||||||
|
else
|
||||||
|
randomTables();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor from a file instance
|
||||||
|
*
|
||||||
|
* @param _fileName the name of the file of the instance
|
||||||
|
*/
|
||||||
|
nkqLandscapesEval(const char * _fileName) : nkLandscapesEval<EOT>(_fileName) { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the instance from a file
|
||||||
|
*
|
||||||
|
* @param _fileName file name of the instance
|
||||||
|
*/
|
||||||
|
virtual void load(const string _fileName)
|
||||||
|
{
|
||||||
|
fstream file;
|
||||||
|
file.open(_fileName.c_str(), ios::in);
|
||||||
|
|
||||||
|
if (file.is_open()) {
|
||||||
|
string s;
|
||||||
|
|
||||||
|
// Read the commentairies
|
||||||
|
string line;
|
||||||
|
file >> s;
|
||||||
|
while (s[0] == 'c') {
|
||||||
|
getline(file,line,'\n');
|
||||||
|
file >> s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read the parameters
|
||||||
|
if (s[0] != 'p') {
|
||||||
|
string str = "nkLandscapesEval.load: -- p -- expected in [" + _fileName + "] at the begining." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
file >> s;
|
||||||
|
if (s != "NKq") {
|
||||||
|
string str = "nkqLandscapesEval.load: -- NKq -- expected in [" + _fileName + "] at the begining." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// read parameters N, K and q
|
||||||
|
file >> N >> K >> q;
|
||||||
|
buildTables();
|
||||||
|
|
||||||
|
// read the links
|
||||||
|
if (s[0] != 'p') {
|
||||||
|
string str = "nkqLandscapesEval.load: -- p -- expected in [" + _fileName + "] after the parameters N, K, and q." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
file >> s;
|
||||||
|
if (s == "links") {
|
||||||
|
loadLinks(file);
|
||||||
|
} else {
|
||||||
|
string str = "nkqLandscapesEval.load: -- links -- expected in [" + _fileName + "] after the parameters N, K, and q." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// lecture des tables
|
||||||
|
if (s[0] != 'p') {
|
||||||
|
string str = "nkqLandscapesEval.load: -- p -- expected in [" + _fileName + "] after the links." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
file >> s;
|
||||||
|
|
||||||
|
if (s == "tables") {
|
||||||
|
loadTables(file);
|
||||||
|
} else {
|
||||||
|
string str = "nkqLandscapesEval.load: -- tables -- expected in [" + _fileName + "] after the links." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
} else {
|
||||||
|
string str = "nkqLandscapesEval.load: Could not open file [" + _fileName + "]." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save the current intance into a file
|
||||||
|
*
|
||||||
|
* @param _fileName the file name of instance
|
||||||
|
*/
|
||||||
|
virtual void save(const char * _fileName) {
|
||||||
|
fstream file;
|
||||||
|
file.open(_fileName, ios::out);
|
||||||
|
|
||||||
|
if (file.is_open()) {
|
||||||
|
file << "c name of the file : " << _fileName << endl;
|
||||||
|
file << "p NKq " << N << " " << K << " " << q << endl;
|
||||||
|
|
||||||
|
file << "p links" << endl;
|
||||||
|
for(int j=0; j<K+1; j++)
|
||||||
|
for(int i=0; i<N; i++)
|
||||||
|
file << links[i][j] << endl;
|
||||||
|
|
||||||
|
file << "p tables" << endl;
|
||||||
|
for(int j=0; j<(1<<(K+1)); j++) {
|
||||||
|
for(int i=0; i<N; i++)
|
||||||
|
file << tables[i][j] << " ";
|
||||||
|
file << endl;
|
||||||
|
}
|
||||||
|
file.close();
|
||||||
|
} else {
|
||||||
|
string fname(_fileName);
|
||||||
|
string str = "nkqLandscapesEval.save: Could not open file [" + fname + "]." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To generate a contribution in the table f_i
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
virtual double contribution() {
|
||||||
|
return ((double) rng.random(q)) / (double) (q-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
55
branches/ParadisEO-GPU/problems/eval/oneMaxEval.h
Normal file
55
branches/ParadisEO-GPU/problems/eval/oneMaxEval.h
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
<oneMaxEval.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010
|
||||||
|
|
||||||
|
Sébastien Verel, Arnaud Liefooghe, Jérémie Humeau
|
||||||
|
|
||||||
|
This software is governed by the CeCILL license under French law and
|
||||||
|
abiding by the rules of distribution of free software. You can ue,
|
||||||
|
modify and/ or redistribute the software under the terms of the CeCILL
|
||||||
|
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||||
|
"http://www.cecill.info".
|
||||||
|
|
||||||
|
In this respect, the user's attention is drawn to the risks associated
|
||||||
|
with loading, using, modifying and/or developing or reproducing the
|
||||||
|
software by the user in light of its specific status of free software,
|
||||||
|
that may mean that it is complicated to manipulate, and that also
|
||||||
|
therefore means that it is reserved for developers and experienced
|
||||||
|
professionals having in-depth computer knowledge. Users are therefore
|
||||||
|
encouraged to load and test the software's suitability as regards their
|
||||||
|
requirements in conditions enabling the security of their systems and/or
|
||||||
|
data to be ensured and, more generally, to use and operate it in the
|
||||||
|
same conditions as regards security.
|
||||||
|
The fact that you are presently reading this means that you have had
|
||||||
|
knowledge of the CeCILL license and that you accept its terms.
|
||||||
|
|
||||||
|
ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||||
|
Contact: paradiseo-help@lists.gforge.inria.fr
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _oneMaxEval_h
|
||||||
|
#define _oneMaxEval_h
|
||||||
|
|
||||||
|
#include <eoEvalFunc.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Full evaluation Function for OneMax problem
|
||||||
|
*/
|
||||||
|
template< class EOT >
|
||||||
|
class oneMaxEval : public eoEvalFunc<EOT>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Count the number of 1 in a bitString
|
||||||
|
* @param _sol the solution to evaluate
|
||||||
|
*/
|
||||||
|
void operator() (EOT& _sol) {
|
||||||
|
unsigned int sum = 0;
|
||||||
|
for (unsigned int i = 0; i < _sol.size(); i++)
|
||||||
|
sum += _sol[i];
|
||||||
|
_sol.fitness(sum);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
63
branches/ParadisEO-GPU/problems/eval/oneMaxPopEval.h
Normal file
63
branches/ParadisEO-GPU/problems/eval/oneMaxPopEval.h
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
<oneMaxPopEval.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010
|
||||||
|
|
||||||
|
Sébastien Verel, Arnaud Liefooghe, Jérémie Humeau
|
||||||
|
|
||||||
|
This software is governed by the CeCILL license under French law and
|
||||||
|
abiding by the rules of distribution of free software. You can ue,
|
||||||
|
modify and/ or redistribute the software under the terms of the CeCILL
|
||||||
|
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||||
|
"http://www.cecill.info".
|
||||||
|
|
||||||
|
In this respect, the user's attention is drawn to the risks associated
|
||||||
|
with loading, using, modifying and/or developing or reproducing the
|
||||||
|
software by the user in light of its specific status of free software,
|
||||||
|
that may mean that it is complicated to manipulate, and that also
|
||||||
|
therefore means that it is reserved for developers and experienced
|
||||||
|
professionals having in-depth computer knowledge. Users are therefore
|
||||||
|
encouraged to load and test the software's suitability as regards their
|
||||||
|
requirements in conditions enabling the security of their systems and/or
|
||||||
|
data to be ensured and, more generally, to use and operate it in the
|
||||||
|
same conditions as regards security.
|
||||||
|
The fact that you are presently reading this means that you have had
|
||||||
|
knowledge of the CeCILL license and that you accept its terms.
|
||||||
|
|
||||||
|
ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||||
|
Contact: paradiseo-help@lists.gforge.inria.fr
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _oneMaxPopEval_h
|
||||||
|
#define _oneMaxPopEval_h
|
||||||
|
|
||||||
|
#include <problems/bitString/moPopSol.h>
|
||||||
|
#include <eval/oneMaxEval.h>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
template< class EOT >
|
||||||
|
class oneMaxPopEval : public eoEvalFunc< moPopSol<EOT> >
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
oneMaxPopEval(oneMaxEval<EOT>& _eval, unsigned int _p): eval(_eval), p(_p){}
|
||||||
|
/**
|
||||||
|
* Count the number of 1 in a bitString
|
||||||
|
* @param _sol the solution to evaluate
|
||||||
|
*/
|
||||||
|
void operator() (moPopSol<EOT>& _sol) {
|
||||||
|
double fit=0;
|
||||||
|
for (unsigned int i = 0; i < _sol.size(); i++){
|
||||||
|
if(_sol[i].invalid())
|
||||||
|
eval(_sol[i]);
|
||||||
|
fit+=pow((double) _sol[i].fitness(), (int) p);
|
||||||
|
}
|
||||||
|
fit=pow((double) fit, (double)1/p);
|
||||||
|
_sol.fitness(fit);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
oneMaxEval<EOT>& eval;
|
||||||
|
unsigned int p;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
151
branches/ParadisEO-GPU/problems/eval/qapEval.h
Normal file
151
branches/ParadisEO-GPU/problems/eval/qapEval.h
Normal file
|
|
@ -0,0 +1,151 @@
|
||||||
|
/*
|
||||||
|
<qapEval.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010
|
||||||
|
|
||||||
|
Sébastien Verel, Arnaud Liefooghe, Jérémie Humeau
|
||||||
|
|
||||||
|
This software is governed by the CeCILL license under French law and
|
||||||
|
abiding by the rules of distribution of free software. You can ue,
|
||||||
|
modify and/ or redistribute the software under the terms of the CeCILL
|
||||||
|
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||||
|
"http://www.cecill.info".
|
||||||
|
|
||||||
|
In this respect, the user's attention is drawn to the risks associated
|
||||||
|
with loading, using, modifying and/or developing or reproducing the
|
||||||
|
software by the user in light of its specific status of free software,
|
||||||
|
that may mean that it is complicated to manipulate, and that also
|
||||||
|
therefore means that it is reserved for developers and experienced
|
||||||
|
professionals having in-depth computer knowledge. Users are therefore
|
||||||
|
encouraged to load and test the software's suitability as regards their
|
||||||
|
requirements in conditions enabling the security of their systems and/or
|
||||||
|
data to be ensured and, more generally, to use and operate it in the
|
||||||
|
same conditions as regards security.
|
||||||
|
The fact that you are presently reading this means that you have had
|
||||||
|
knowledge of the CeCILL license and that you accept its terms.
|
||||||
|
|
||||||
|
ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||||
|
Contact: paradiseo-help@lists.gforge.inria.fr
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _qapEval_h
|
||||||
|
#define _qapEval_h
|
||||||
|
|
||||||
|
#include <eoEvalFunc.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Full evaluation Function for QAP problem
|
||||||
|
*/
|
||||||
|
template< class EOT >
|
||||||
|
class QAPeval : public eoEvalFunc<EOT>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Constructor from instance file
|
||||||
|
*
|
||||||
|
* @param _fileData the file name which contains the instance of QAP from QAPlib
|
||||||
|
*/
|
||||||
|
QAPeval(string & _fileData) {
|
||||||
|
fstream file(_fileData.c_str(), ios::in);
|
||||||
|
|
||||||
|
if (!file) {
|
||||||
|
string str = "QAPeval: Could not open file [" + _fileData + "]." ;
|
||||||
|
throw runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned i, j;
|
||||||
|
|
||||||
|
file >> n;
|
||||||
|
A = new int *[n];
|
||||||
|
B = new int *[n];
|
||||||
|
|
||||||
|
for(i = 0; i < n; i++) {
|
||||||
|
A[i] = new int[n];
|
||||||
|
for(j = 0; j < n; j++) {
|
||||||
|
file >> A[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < n; i++) {
|
||||||
|
B[i] = new int[n];
|
||||||
|
for(j = 0; j < n; j++)
|
||||||
|
file >> B[i][j];
|
||||||
|
}
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* default destructor
|
||||||
|
*/
|
||||||
|
~QAPeval() {
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
if (A != NULL) {
|
||||||
|
for(i = 0; i < n; i++)
|
||||||
|
delete[] A[i];
|
||||||
|
delete[] A;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (B != NULL) {
|
||||||
|
for(i = 0; i < n; i++)
|
||||||
|
delete[] B[i];
|
||||||
|
delete[] B;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* full evaluation for QAP
|
||||||
|
*
|
||||||
|
* @param _solution the solution to evaluate
|
||||||
|
*/
|
||||||
|
void operator()(EOT & _solution) {
|
||||||
|
int cost = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
for (int j = 0; j < n; j++)
|
||||||
|
cost += A[i][j] * B[_solution[i]][_solution[j]];
|
||||||
|
|
||||||
|
_solution.fitness(cost);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* to get the matrix A
|
||||||
|
*
|
||||||
|
* @return matrix A
|
||||||
|
*/
|
||||||
|
int** getA() {
|
||||||
|
return A;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* to get the matrix B
|
||||||
|
*
|
||||||
|
* @return matrix B
|
||||||
|
*/
|
||||||
|
int** getB() {
|
||||||
|
return B;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* to get the number of objects, of variables
|
||||||
|
*
|
||||||
|
* @return number of objects
|
||||||
|
*/
|
||||||
|
int getNbVar() {
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// number of variables
|
||||||
|
int n;
|
||||||
|
|
||||||
|
// matrix A
|
||||||
|
int ** A;
|
||||||
|
|
||||||
|
// matrix B
|
||||||
|
int ** B;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
57
branches/ParadisEO-GPU/problems/eval/queenEval.h
Normal file
57
branches/ParadisEO-GPU/problems/eval/queenEval.h
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
<queenEval.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010
|
||||||
|
|
||||||
|
Sébastien Verel, Arnaud Liefooghe, Jérémie Humeau
|
||||||
|
|
||||||
|
This software is governed by the CeCILL license under French law and
|
||||||
|
abiding by the rules of distribution of free software. You can ue,
|
||||||
|
modify and/ or redistribute the software under the terms of the CeCILL
|
||||||
|
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||||
|
"http://www.cecill.info".
|
||||||
|
|
||||||
|
In this respect, the user's attention is drawn to the risks associated
|
||||||
|
with loading, using, modifying and/or developing or reproducing the
|
||||||
|
software by the user in light of its specific status of free software,
|
||||||
|
that may mean that it is complicated to manipulate, and that also
|
||||||
|
therefore means that it is reserved for developers and experienced
|
||||||
|
professionals having in-depth computer knowledge. Users are therefore
|
||||||
|
encouraged to load and test the software's suitability as regards their
|
||||||
|
requirements in conditions enabling the security of their systems and/or
|
||||||
|
data to be ensured and, more generally, to use and operate it in the
|
||||||
|
same conditions as regards security.
|
||||||
|
The fact that you are presently reading this means that you have had
|
||||||
|
knowledge of the CeCILL license and that you accept its terms.
|
||||||
|
|
||||||
|
ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||||
|
Contact: paradiseo-help@lists.gforge.inria.fr
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _queenEval_h
|
||||||
|
#define _queenEval_h
|
||||||
|
|
||||||
|
#include <eoEvalFunc.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Full evaluation function for QUEEN problem
|
||||||
|
*/
|
||||||
|
template< class EOT >
|
||||||
|
class queenEval : public eoEvalFunc<EOT>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Count number of threat
|
||||||
|
* @param _queen a solution
|
||||||
|
*/
|
||||||
|
void operator()(EOT& _queen){
|
||||||
|
unsigned int fit=0;
|
||||||
|
for(unsigned int i=0; i<_queen.size()-1; i++)
|
||||||
|
for(unsigned int j=i+1; j< _queen.size(); j++)
|
||||||
|
if(((unsigned int)_queen[i]+j-i == (unsigned int)_queen[j]) || ((unsigned int)_queen[i]+i-j == (unsigned int)_queen[j]))
|
||||||
|
fit++;
|
||||||
|
_queen.fitness(fit);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
87
branches/ParadisEO-GPU/problems/eval/royalRoadEval.h
Normal file
87
branches/ParadisEO-GPU/problems/eval/royalRoadEval.h
Normal file
|
|
@ -0,0 +1,87 @@
|
||||||
|
/*
|
||||||
|
<royalRoadEval.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010
|
||||||
|
|
||||||
|
Sebastien Verel, Arnaud Liefooghe, Jeremie Humeau
|
||||||
|
|
||||||
|
This software is governed by the CeCILL license under French law and
|
||||||
|
abiding by the rules of distribution of free software. You can ue,
|
||||||
|
modify and/ or redistribute the software under the terms of the CeCILL
|
||||||
|
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||||
|
"http://www.cecill.info".
|
||||||
|
|
||||||
|
In this respect, the user's attention is drawn to the risks associated
|
||||||
|
with loading, using, modifying and/or developing or reproducing the
|
||||||
|
software by the user in light of its specific status of free software,
|
||||||
|
that may mean that it is complicated to manipulate, and that also
|
||||||
|
therefore means that it is reserved for developers and experienced
|
||||||
|
professionals having in-depth computer knowledge. Users are therefore
|
||||||
|
encouraged to load and test the software's suitability as regards their
|
||||||
|
requirements in conditions enabling the security of their systems and/or
|
||||||
|
data to be ensured and, more generally, to use and operate it in the
|
||||||
|
same conditions as regards security.
|
||||||
|
The fact that you are presently reading this means that you have had
|
||||||
|
knowledge of the CeCILL license and that you accept its terms.
|
||||||
|
|
||||||
|
ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||||
|
Contact: paradiseo-help@lists.gforge.inria.fr
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _RoyalRoadEval_h
|
||||||
|
#define _RoyalRoadEval_h
|
||||||
|
|
||||||
|
#include <eoEvalFunc.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Full evaluation Function for Royal Road problem
|
||||||
|
*/
|
||||||
|
template< class EOT >
|
||||||
|
class RoyalRoadEval : public eoEvalFunc<EOT>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Default constructor
|
||||||
|
* @param _k size of a block
|
||||||
|
*/
|
||||||
|
RoyalRoadEval(unsigned int _k) : k(_k) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Count the number of complete blocks in the bit string
|
||||||
|
* @param _sol the solution to evaluate
|
||||||
|
*/
|
||||||
|
void operator() (EOT& _solution) {
|
||||||
|
unsigned int sum = 0;
|
||||||
|
unsigned int i, j;
|
||||||
|
unsigned int offset;
|
||||||
|
|
||||||
|
// number of blocks
|
||||||
|
unsigned int n = _solution.size() / k;
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
offset = i * k;
|
||||||
|
|
||||||
|
j = 0;
|
||||||
|
while (j < k && _solution[offset + j]) j++;
|
||||||
|
|
||||||
|
if (j == k)
|
||||||
|
sum++;
|
||||||
|
}
|
||||||
|
|
||||||
|
_solution.fitness(sum);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the size of a block
|
||||||
|
* @return block size
|
||||||
|
*/
|
||||||
|
unsigned int blockSize() {
|
||||||
|
return k;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// size of a block
|
||||||
|
unsigned int k;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
212
branches/ParadisEO-GPU/problems/eval/ubqpEval.h
Normal file
212
branches/ParadisEO-GPU/problems/eval/ubqpEval.h
Normal file
|
|
@ -0,0 +1,212 @@
|
||||||
|
/*
|
||||||
|
<ubqpEval.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010
|
||||||
|
|
||||||
|
Sebastien Verel
|
||||||
|
|
||||||
|
This software is governed by the CeCILL license under French law and
|
||||||
|
abiding by the rules of distribution of free software. You can ue,
|
||||||
|
modify and/ or redistribute the software under the terms of the CeCILL
|
||||||
|
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||||
|
"http://www.cecill.info".
|
||||||
|
|
||||||
|
In this respect, the user's attention is drawn to the risks associated
|
||||||
|
with loading, using, modifying and/or developing or reproducing the
|
||||||
|
software by the user in light of its specific status of free software,
|
||||||
|
that may mean that it is complicated to manipulate, and that also
|
||||||
|
therefore means that it is reserved for developers and experienced
|
||||||
|
professionals having in-depth computer knowledge. Users are therefore
|
||||||
|
encouraged to load and test the software's suitability as regards their
|
||||||
|
requirements in conditions enabling the security of their systems and/or
|
||||||
|
data to be ensured and, more generally, to use and operate it in the
|
||||||
|
same conditions as regards security.
|
||||||
|
The fact that you are presently reading this means that you have had
|
||||||
|
knowledge of the CeCILL license and that you accept its terms.
|
||||||
|
|
||||||
|
ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||||
|
Contact: paradiseo-help@lists.gforge.inria.fr
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ubqpEval_h
|
||||||
|
#define _ubqpEval_h
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <eoEvalFunc.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Full evaluation Function
|
||||||
|
* for unconstrainted binary quadratic programming problem
|
||||||
|
*/
|
||||||
|
template< class EOT >
|
||||||
|
class UbqpEval : public eoEvalFunc<EOT>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* instance is given in the ORLIB format (0) or matrix format (1):
|
||||||
|
* The format of these data files is:
|
||||||
|
* number of test problem in the serie
|
||||||
|
* for each test problem in turn:
|
||||||
|
* - Format 0:
|
||||||
|
* number of variables (n), number of non-zero elements in the q(i,j) matrix
|
||||||
|
* for each non-zero element in turn:
|
||||||
|
* i, j, q(i,j) {=q(j,i) as the matrix is symmetric}
|
||||||
|
* - Format 1:
|
||||||
|
* number of variables (n)
|
||||||
|
* for each line i
|
||||||
|
* for each columm j
|
||||||
|
* q(i,j)
|
||||||
|
* @param _fileName file name of the instance in ORLIB format
|
||||||
|
* @param format id of the file format (0 or 1)
|
||||||
|
* @param _numInstance the number of the given instance to solve
|
||||||
|
*/
|
||||||
|
UbqpEval(std::string & _fileName, unsigned format = 0, unsigned int _numInstance = 0) {
|
||||||
|
std::fstream file(_fileName.c_str(), std::ios::in);
|
||||||
|
|
||||||
|
if (!file) {
|
||||||
|
std::string str = "UbqpEval: Could not open file [" + _fileName + "]." ;
|
||||||
|
throw std::runtime_error(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int nbInstances;
|
||||||
|
file >> nbInstances;
|
||||||
|
|
||||||
|
// number of non zero in the matrix
|
||||||
|
unsigned int nbNonZero = 0;
|
||||||
|
|
||||||
|
unsigned int i, j;
|
||||||
|
int v;
|
||||||
|
|
||||||
|
for(unsigned k = 0; k < _numInstance; k++) {
|
||||||
|
if (format == 0) {
|
||||||
|
file >> nbVar >> nbNonZero ;
|
||||||
|
|
||||||
|
for(unsigned kk = 0; kk < nbNonZero; kk++)
|
||||||
|
file >> i >> j >> v;
|
||||||
|
} else {
|
||||||
|
file >> nbVar ;
|
||||||
|
|
||||||
|
for(unsigned int i = 0; i < nbVar; i++) {
|
||||||
|
for(unsigned int j = 0; j < nbVar; j++) {
|
||||||
|
file >> v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// the chosen instance
|
||||||
|
if (format == 0)
|
||||||
|
file >> nbVar >> nbNonZero ;
|
||||||
|
else
|
||||||
|
file >> nbVar ;
|
||||||
|
|
||||||
|
// creation of the matrix
|
||||||
|
Q = new int*[nbVar];
|
||||||
|
|
||||||
|
for(unsigned int i = 0; i < nbVar; i++) {
|
||||||
|
Q[i] = new int[nbVar];
|
||||||
|
for(unsigned int j = 0; j < nbVar; j++)
|
||||||
|
Q[i][j] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// read the matrix
|
||||||
|
if (format == 0) {
|
||||||
|
for(unsigned int k = 0; k < nbNonZero; k++) {
|
||||||
|
file >> i >> j >> v;
|
||||||
|
Q[i][j] = v;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for(unsigned int i = 0; i < nbVar; i++) {
|
||||||
|
for(unsigned int j = 0; j < nbVar; j++) {
|
||||||
|
file >> v;
|
||||||
|
Q[i][j] = v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
// put the matrix in lower triangular form
|
||||||
|
for(unsigned i = 1; i < nbVar; i++)
|
||||||
|
for(unsigned int j = 0; j < i; j++) {
|
||||||
|
Q[i][j] = Q[i][j] + Q[j][i];
|
||||||
|
Q[j][i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destructor
|
||||||
|
*/
|
||||||
|
~UbqpEval() {
|
||||||
|
if (Q != NULL) {
|
||||||
|
for(unsigned i = 0; i < nbVar; i++)
|
||||||
|
delete[] Q[i];
|
||||||
|
|
||||||
|
// delete the matrix
|
||||||
|
delete[] Q;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fitness evaluation of the solution
|
||||||
|
*
|
||||||
|
* @param _solution the solution to evaluation
|
||||||
|
*/
|
||||||
|
virtual void operator()(EOT & _solution) {
|
||||||
|
int fit = 0;
|
||||||
|
unsigned int j;
|
||||||
|
|
||||||
|
for(unsigned i = 0; i < nbVar; i++)
|
||||||
|
if (_solution[i] == 1)
|
||||||
|
for(j = 0; j <= i; j++)
|
||||||
|
if (_solution[j] == 1)
|
||||||
|
fit += Q[i][j];
|
||||||
|
|
||||||
|
_solution.fitness(fit);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* to get the matrix Q
|
||||||
|
*
|
||||||
|
* @return matrix Q
|
||||||
|
*/
|
||||||
|
int** getQ() {
|
||||||
|
return Q;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* to get the number of variable (bit string length)
|
||||||
|
*
|
||||||
|
* @return bit string length
|
||||||
|
*/
|
||||||
|
int getNbVar() {
|
||||||
|
return nbVar;
|
||||||
|
}
|
||||||
|
|
||||||
|
void print() {
|
||||||
|
std::cout << nbVar << std::endl;
|
||||||
|
for(unsigned int i = 0; i < nbVar; i++) {
|
||||||
|
for(unsigned int j = 0; j < nbVar; j++) {
|
||||||
|
std::cout << Q[i][j] << " ";
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* variables (used in incremental evaluation)
|
||||||
|
*/
|
||||||
|
|
||||||
|
// number of variable
|
||||||
|
unsigned int nbVar;
|
||||||
|
|
||||||
|
// matrix of flux:
|
||||||
|
// the matrix is put in lower triangular form: for i<j Q[i][j] = 0
|
||||||
|
int ** Q;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
Loading…
Add table
Add a link
Reference in a new issue