added practices to version control

git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@1002 331e1502-861f-0410-8da2-ba01fb791d7f
This commit is contained in:
legrand 2008-02-25 13:56:53 +00:00
commit 22c6962aa2
72 changed files with 25134 additions and 0 deletions

View file

@ -0,0 +1,64 @@
######################################################################################
### 1) Project properties
######################################################################################
# set the project name
PROJECT(paradisEO-practices)
# check cmake version compatibility
CMAKE_MINIMUM_REQUIRED(VERSION 2.4 FATAL_ERROR)
# regular expression checking
INCLUDE_REGULAR_EXPRESSION("^.*$" "^$")
# set a language
ENABLE_LANGUAGE(CXX)
ENABLE_LANGUAGE(C)
#####################################################################################
######################################################################################
### 2) Include the main configuration variables
######################################################################################
# Need the config file whose full path is given thanks to the "config" variable
INCLUDE("install.cmake")
######################################################################################
######################################################################################
### 3) Paths checking
######################################################################################
IF(WIN32)
SET (ABSOLUTE_PATH_REGEX "^[A-Z]:|^[a-z]:")
ELSE(WIN32)
SET (ABSOLUTE_PATH_REGEX "^/")
ENDIF(WIN32)
SET(REQUIRED_PATHS "EO_SRC_DIR" "EO_BIN_DIR" "MO_SRC_DIR" "MO_BIN_DIR")
FOREACH (path ${REQUIRED_PATHS})
IF(EXISTS ${${path}})
MESSAGE (STATUS "Using ${path}=${${path}}")
ELSE(EXISTS ${${path}})
MESSAGE (FATAL_ERROR "\n Cannot find \"${${path}}\". Please, fill \"${config}\" with a correct value")
ENDIF(EXISTS ${${path}})
IF(NOT ${${path}} MATCHES "${ABSOLUTE_PATH_REGEX}")
MESSAGE (FATAL_ERROR "${${path}} MUST BE an absolute path")
ENDIF(NOT ${${path}} MATCHES "${ABSOLUTE_PATH_REGEX}")
ENDFOREACH (path ${REQUIRED_PATHS})
######################################################################################
######################################################################################
### 6) Where must cmake go now ?
######################################################################################
SUBDIRS(tsp lesson2 lesson3 lesson4 lesson5)
######################################################################################

View file

@ -0,0 +1,7 @@
PARADISEO (PARallel and DIStributed Evolving Objects) is a white-box object-oriented framework dedicated to the flexible design of metaheursitics. Based on EO, this template-based, ANSI-C++ compliant computation library is portable across both Windows system and sequential platforms (Unix, Linux, MacOS, etc.).
WEBSITE: http://paradiseo.gforge.inria.fr

View file

@ -0,0 +1,61 @@
#####################################################################################
### 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")
SET(CMAKE_CXX_FLAGS "/nologo /W3 /Gy")
SET(CMAKE_CXX_FLAGS_DEBUG "/MTd /Z7 /Od")
SET(CMAKE_CXX_FLAGS_RELEASE "/MT /O2")
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")
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} -O0 -g -Wall -Wextra")
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)
#####################################################################################
##########################################################################################################################################
### ParadisEO Install Configuration
### The path to the modules EO and MO must be specified above.
##########################################################################################################################################
SET(EO_SRC_DIR "E:\\temp\\ParadisEO\\paradiseo-eo" CACHE PATH "ParadisEO-EO source directory" FORCE)
SET(EO_BIN_DIR "E:\\temp\\ParadisEO\\paradiseo-eo\\build" CACHE PATH "ParadisEO-EO binary directory" FORCE)
SET(MO_SRC_DIR "E:\\temp\\ParadisEO\\paradiseo-mo" CACHE PATH "ParadisMO-MO source directory" FORCE)
SET(MO_BIN_DIR "E:\\temp\\ParadisEO\\paradiseo-mo\\build" CACHE PATH "ParadisMO-MO binary directory" FORCE)
###########################################################################################################################################

View file

@ -0,0 +1,216 @@
\documentclass[a4paper]{article}
\usepackage[english]{babel}
\usepackage{epsf}
\usepackage{amssymb}
\usepackage{here}
\usepackage{comment}
\usepackage{graphicx}
\topmargin -2.5cm
\textheight 25,5cm
\textwidth 16cm
\oddsidemargin 0cm
\evensidemargin 0cm
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Fichier entete
%\input /usr/local/home/gisEns/fseynhae/Ens/Entete.tex
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\textbf{ParadisEO Practices} {\copyright Franck Seynhaeve,
Jean-Charles Boisson, Thomas Legrand} \Large{\textbf{\\\\
Lesson 1: Install ParadisEO and the practices}}
\normalsize
\vspace{-0,3cm}
\section{The ParadisEO platform}
\medskip
ParadisEO\footnote{http$\,:$//paradiseo.gforge.inria.fr/} (PARallel and DIStributed Evolving Objects) is a white-box
object-oriented framework dedicated to the flexible design of metaheuristics.
Based on EO\footnote{\tt http$\,:$//eodev.sourceforge.net/} (Evolutionary Computation Framework),
this template-based,
ANSI-C++ compliant computation library is portable across both Windows
system and sequential platforms (Unix, Linux, MacOS, etc.).
\smallskip
ParadisEO can be used under several environments as the build process (CMake)
is able to generate:
\begin{itemize}
\item[$\bullet$] Visual Studio 8 2005 (Win32 + Win64) projects
\item[$\bullet$] Visual Studio 7 .NET 2003 projects
\item[$\bullet$] Visual Studio 7 and 6 projects
\item[$\bullet$] NMake Makefiles
\item[$\bullet$] MinGW Makefiles
\item[$\bullet$] Borland Makefiles
\item[$\bullet$] KDevelop projects
\item[$\bullet$] Unix Makefiles
\item[$\bullet$] Xcode Projects
\item[$\bullet$] MSYS Makefiles
\item[$\bullet$] WMake Makefiles
\end{itemize}
\smallskip
Paradiseo is composed of several packages that constitute a global framework.
\begin{center}
\end{center}
\begin{itemize}
\item[$\bullet$] Paradiseo-EO provides tools for the development of population-based metaheuristic:
\begin{itemize}
\item[$\ast$] Genetic algorithm
\item[$\ast$] Genetic programming
\item[$\ast$] Particle Swarm Optimization
\item[$\ast$] ...
\end{itemize}
\item[$\bullet$] Paradiseo-MO provides tools for the development of single solution-based metaheuristics:
\begin{itemize}
\item[$\ast$] Hill-Climbing
\item[$\ast$] Tabu Search
\item[$\ast$] Simulated annealing
\item[$\ast$] Incremental evaluation, partial neighbourhood
\item[$\ast$] ...
\end{itemize}
\item[$\bullet$] Paradiseo-MOEO provides tools for the design of Multi-objective metaheuristics:
\begin{itemize}
\item[$\ast$] MO fitness assignment shemes (the ones used in NSGA-II, IBEA ...)
\item[$\ast$] MO diversity assignment shemes (sharing, crowding)
\item[$\ast$] Elitism
\item[$\ast$] Performance metrics (contribution, entropy ...)
\item[$\ast$] Easy-to-use standard evolutionary algorithms (NSGA-II, IBEA ...)
\item[$\ast$] ...
\end{itemize}
\item[$\bullet$] Paradiseo-PEO provides tools for the design of parallel and distributed metaheuristics:
\begin{itemize}
\item[$\ast$] Parallel evaluation
\item[$\ast$] Parallel evaluation function
\item[$\ast$] Island model
\item[$\ast$] Cellular model
\end{itemize}
\end{itemize}
\smallskip
Furthermore, Paradiseo also introduces tools for the design of distributed, hybrid and cooperative models:
\begin{itemize}
\item[$\bullet$] High level hybrid metaheuristics: coevolutionary and relay model
\item[$\bullet$] Low level hybrid metaheuristics: coevolutionary and relay model
\end{itemize}
\section{Installation}
\subsection{ParadisEO}
The practices require ParadisEO to be installed on your
computer. You can easily process to the installation:
\begin{itemize}
\item[$\bullet$] Make sure to have the following tools
available in your environment:
\hspace{1cm}$\vartriangleright$ {\tt CMake}
\\\hspace*{1cm}$\vartriangleright$ {\tt Tar} or a similar extractor
\item[$\bullet$] Download ParadisEO (choose the {\tt tar.gz} file)
from:
\\\hspace*{1cm}$\vartriangleright$ {\tt http$\,:$//www2.lifl.fr/OPAC/Paradiseo/licence/FrmDownload.php}
\item[$\bullet$] Extract the content of the archive:
\\\hspace*{1cm}$\vartriangleright$ Put the archive {\tt
paradiseo-ix86-1.0.tar.gz} in the directory of your
choice. Let's suppose you put it in \textbf{{\tt
/home/me/software}}
\\\hspace*{1cm}$\vartriangleright$ Extract it by entering
the following line in a terminal: {\tt tar xzf paradiseo-ix86-1.0.tar.gz}
\item[$\bullet$] Install it:
\\\hspace*{1cm}$\vartriangleright$ {\tt bash installParadiseo.sh} or {\tt sh
installParadiseo.sh} if your shell is a "sh" one
\\\hspace*{1cm}$\vartriangleright$ \textbf{Select your generator (Unix Makefiles recommended) }
\\\hspace*{1cm}$\vartriangleright$ \textbf{Select the minimum installation mode by choosing the \emph{basic install} }
\end{itemize}
\subsection{The archive dedicated to the practices}
To start with the practices, you have to install the archive
called {\tt paradiseo\_practices\_0208.tgz} that you have been
given. This archive is also available for download at
{\tt http$\,:$//paradiseo.gforge.inria.fr}.\\\\
\textbf{ Let's suppose you have installed ParadisEO
into the {\tt /home/me/software} directory. Each time
it appears, you are to replace this path with the one
corresponding to your ParadisEO installation directory.
}
\\\\When the archive has been extracted, please go in the
{\tt practices} directory and edit the {\tt install.cmake}
file:
\begin{itemize}
\item[$\bullet$] Fill the {\tt EO\_SRC\_DIR} variable with the path to ParadisEO-EO :
\hspace{1cm}{\tt /home/me/software/ParadisEO/paradiseo-eo}
\item[$\bullet$] Fill the {\tt EO\_BIN\_DIR} variable with the path to
ParadisEO-EO build directory :
\hspace{1cm}{\tt /home/me/software/ParadisEO/paradiseo-eo/build}
\item[$\bullet$] Fill the {\tt MO\_SRC\_DIR} variable with the path to ParadisEO-MO :
\hspace{1cm}{\tt /home/me/software/ParadisEO/paradiseo-mo}
\item[$\bullet$] Fill the {\tt MO\_BIN\_DIR} variable with the path to
ParadisEO-MO build directory :
\hspace{1cm}{\tt /home/me/software/ParadisEO/paradiseo-mo/build}
\end{itemize}
\medskip
Then, go in the {\tt build} directory and run :
\hspace{1cm}{\tt cmake ../}
\medskip
You can now compile the practices using: {\tt make}
\section{Archive content}
At the top level of the {\tt practices} directory, you must have:
\begin{itemize}
\item[$\bullet$] {\bf tsp/src}: Contains the sources required to solve the TSP
problem using ParadisEO. The associated benchmarks are in the
{\bf benchs} directory.
\item[$\bullet$] {\bf lesson1}: ParadisEO installation practice, contains {\tt lesson1.pdf}.
\item[$\bullet$] {\bf lesson2}: Contains an implementation of the Hill-Climbing
{\tt hill\_climbing.cpp} and the corresponding tutorial {\tt lesson2.pdf}.
\item[$\bullet$] {\bf lesson3}: Contains an implementation of a tabu
search {\tt tabu\_search.cpp} and the corresponding tutorial {\tt lesson3.pdf}.
\item[$\bullet$] {\bf lesson4}: Contains an implementation of the
Simulated Annealing {\tt simulated\_annealing.cpp} and the corresponding
tutorial {\tt lesson4.pdf}.
\item[$\bullet$] {\bf lesson5}: Contains an implementation of a
genetic algorithm {\tt gen\_algo.cpp} .
\item[$\bullet$] {\bf build}: Contains the built targets and
the executables (subdirectories {\bf lesson1},
{\bf lesson2}, {\bf lesson3}, {\bf lesson4} and {\bf lesson5}).
\end{itemize}
\end{document}

View file

@ -0,0 +1,41 @@
######################################################################################
### 1) Include the sources
######################################################################################
INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src)
INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src/utils)
INCLUDE_DIRECTORIES(${MO_SRC_DIR}/src)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/tsp/src)
######################################################################################
######################################################################################
### 2) Specify where CMake can find the libraries
######################################################################################
LINK_DIRECTORIES(${EO_BIN_DIR}/lib ${CMAKE_BINARY_DIR}/tsp/src)
######################################################################################
######################################################################################
### 3) Define your target(s): just an executable here
######################################################################################
ADD_EXECUTABLE(hill_climbing hill_climbing.cpp)
ADD_DEPENDENCIES(hill_climbing tsp)
######################################################################################
######################################################################################
### 4) Link the librairies for your target(s)
######################################################################################
TARGET_LINK_LIBRARIES(hill_climbing tsp eo eoutils)
######################################################################################

View file

@ -0,0 +1,67 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "hill_climbing.cpp"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include <mo.h>
#include <graph.h>
#include <route.h>
#include <route_eval.h>
#include <route_init.h>
#include <two_opt.h>
#include <two_opt_init.h>
#include <two_opt_next.h>
#include <two_opt_incr_eval.h>
int
main (int __argc, char * __argv [])
{
if (__argc != 2) {
std :: cerr << "Usage : ./hill_climbing [instance]" << std :: endl ;
return 1 ;
}
srand (1000) ;
Graph :: load (__argv [1]) ; // Instance
Route route ; // Solution
RouteInit init ; // Sol. Random Init.
init (route) ;
RouteEval full_eval ; // Full. Eval.
full_eval (route) ;
std :: cout << "[From] " << route << std :: endl ;
/* Tools for an efficient (? :-))
local search ! */
TwoOptInit two_opt_init ; // Init.
TwoOptNext two_opt_next ; // Explorer.
TwoOptIncrEval two_opt_incr_eval ; // Eff. eval.
//moFirstImprSelect <TwoOpt> two_opt_select ;
moBestImprSelect <TwoOpt> two_opt_select ;
//moRandImprSelect <TwoOpt> two_opt_select ;
moHC <TwoOpt> hill_climbing (two_opt_init, two_opt_next, two_opt_incr_eval, two_opt_select, full_eval) ;
hill_climbing (route) ;
std :: cout << "[To] " << route << std :: endl ;
return 0 ;
}

View file

@ -0,0 +1,90 @@
\documentclass[a4paper]{article}
\usepackage[english]{babel}
\usepackage{epsf}
\usepackage{amssymb}
\usepackage{here}
\usepackage{comment}
\usepackage{graphicx}
\topmargin -2.5cm
\textheight 25,5cm
\textwidth 16cm
\oddsidemargin 0cm
\evensidemargin 0cm
\begin{document}
\textbf{ParadisEO Practices} {\copyright Franck Seynhaeve,
Jean-Charles Boisson, Thomas Legrand} \Large{\textbf{\\\\
Lesson 2: Implement a Hill-Climbing using ParadisEO}}
\normalsize
\vspace{-0,3cm}
\section{Example}
The archive {\tt paradiseo\_practices\_0208.tgz} installed
on your computer contains a Hill-Climbing implemented using ParadisEO-MO~
(see {\tt hill\_climbing} in the {\bf build/lesson2} directory).
\medskip
To run it, please go in {\bf build/lesson2} and start the program {\tt hill\_climbing} by giving
one of the TSP instances located in {\bf tsp/benchs}.
\medskip
When entering {\tt ./hill\_climbing ../../tsp/benchs/berlin52.tsp}, you should end up with the
following outputs:
\smallskip
\noindent
\texttt{>> Loading [../tsp/benchs/berlin52.tsp]}\\
\texttt{[From] -29414 52 1 20 40 48 9 27 13 22 5 28 24 29 21 26 44 38 33 37 45 31 42 18 12 3 14}\\
\texttt{36 30 6 51 32 17 11 0 34 4 10 4350 16 2 23 35 19 46 49 39 25 15 41 8 7 47}\\
\texttt{[To] -8724 52 1 6 41 29 22 19 49 15 28 46 13 51 12 25 26 27 11 10 50 32 42 9 8 7 40 18}\\
\texttt{44 2 16 20 30 17 21 0 31 48 35 3438 39 37 36 33 43 45 24 3 5 4 14 23
47} \\
The printed-out results show for the initial best solution and the final one~:
\\ \hspace*{1cm}-the length of the route
\\ \hspace*{1cm}-the number of cities
\\ \hspace*{1cm}-the route itself (notice that the city index starts from 0).
\section{Tabu search}
Study the {\tt hill\_climbing.cpp} file located in the {\bf lesson2} directory
using~:
\begin{itemize}
\item[$\bullet$] the ParadisEO-MO API documentation available at~:
\hspace{1cm}http$\,:$//paradiseo.gforge.inria.fr/addon/paradiseo-mo/doc/index.html
\item[$\bullet$] the source files located in the {\bf tsp/src/} directory
\end{itemize}
\section{Customize the Hill CLimbing}
Make a backup (copy) of the cpp file {\tt tabuhill\_climbing.cpp}. You can now modify the
original {\tt hill\_climbing.cpp} and use the existing makefiles to compile it.
Edit and modify the {\tt hill\_climbing.cpp} file~:
\begin{itemize}
\item[$\bullet$] Try to tune a few parameters (random seed
and the move selector) and observe the changes on the final
solution.
\end{itemize}
\smallskip
To compile {\tt hill\_climbing.cpp}, you should use the
command {\tt make} from {\bf build/lesson2}.
\medskip
Finally, test your modifications on several TSP instances ({\tt berlin52},
{\tt eil101} ...) and compare the results you get.
\end{document}

View file

@ -0,0 +1,41 @@
######################################################################################
### 1) Include the sources
######################################################################################
INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src)
INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src/utils)
INCLUDE_DIRECTORIES(${MO_SRC_DIR}/src)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/tsp/src)
######################################################################################
######################################################################################
### 2) Specify where CMake can find the libraries
######################################################################################
LINK_DIRECTORIES(${EO_BIN_DIR}/lib ${CMAKE_BINARY_DIR}/tsp/src)
######################################################################################
######################################################################################
### 3) Define your target(s): just an executable here
######################################################################################
ADD_EXECUTABLE(tabu_search tabu_search.cpp)
ADD_DEPENDENCIES(tabu_search tsp)
######################################################################################
######################################################################################
### 4) Link the librairies for your target(s)
######################################################################################
TARGET_LINK_LIBRARIES(tabu_search tsp eo eoutils)
######################################################################################

View file

@ -0,0 +1,89 @@
\documentclass[a4paper]{article}
\usepackage[english]{babel}
\usepackage{epsf}
\usepackage{amssymb}
\usepackage{here}
\usepackage{comment}
\usepackage{graphicx}
\topmargin -2.5cm
\textheight 25,5cm
\textwidth 16cm
\oddsidemargin 0cm
\evensidemargin 0cm
\begin{document}
\textbf{ParadisEO Practices} {\copyright Franck Seynhaeve,
Jean-Charles Boisson, Thomas Legrand} \Large{\textbf{\\\\
Lesson 4: Implement a simulated annealing using ParadisEO}}
\normalsize
\vspace{-0,3cm}
\section{Example}
The archive {\tt paradiseo\_practices\_0208.tgz} installed
on your computer contains a simulated annealing implemented using ParadisEO-MO~
(see {\tt simulated\_annealing} in the {\bf build/lesson4} directory).
\medskip
To run it, please go in {\bf build/lesson4} and start the program {\tt simulated\_annealing} by giving
one of the TSP instances located in {\bf tsp/benchs}.
\medskip
When entering {\tt ./simulated\_annealing ../../tsp/benchs/berlin52.tsp}, you should end up with the
following outputs:
\smallskip
\noindent
\texttt{>> Loading [../tsp/benchs/berlin52.tsp]}\\
\texttt{[From] -29414 52 1 20 40 48 9 27 13 22 5 28 24 29 21 26 44 38 33 37 45 31 42 18 12 3 14}\\
\texttt{36 30 6 51 32 17 11 0 34 4 10 4350 16 2 23 35 19 46 49 39 25 15 41 8 7 47}\\
\texttt{[To] -8724 52 1 6 41 29 22 19 49 15 28 46 13 51 12 25 26 27 11 10 50 32 42 9 8 7 40 18}\\
\texttt{44 2 16 20 30 17 21 0 31 48 35 3438 39 37 36 33 43 45 24 3 5 4 14 23
47} \\
The printed-out results show for the initial best solution and the final one~:
\\ \hspace*{1cm}-the length of the route
\\ \hspace*{1cm}-the number of cities
\\ \hspace*{1cm}-the route itself (notice that the city index starts from 0).
\section{Study the simulated annealing dedicated components}
Study the {\tt simulated\_annealing.cpp} file located in the {\bf lesson4} directory
using~:
\begin{itemize}
\item[$\bullet$] the ParadisEO-MO API documentation available at~:
\hspace{1cm}http$\,:$//paradiseo.gforge.inria.fr/addon/paradiseo-mo/doc/index.html
\item[$\bullet$] the source files located in the {\bf tsp/src/} directory
\end{itemize}
\section{Customize the simulated annealing}
Make a backup (copy) of the cpp file {\tt simulated\_annealing.cpp}. You can now modify the
original {\tt simulated\_annealing.cpp} and use the existing makefiles to compile it.
Edit and modify the {\tt simulated\_annealing.cpp} file~:
\begin{itemize}
\item[$\bullet$] Change the cooling schedule components and parameters.
\item[$\bullet$] Customize the temperature decrease process and try to obtain another good solution.
\end{itemize}
\smallskip
To compile {\tt simulated\_annealing.cpp},you should use the
command {\tt make} from {\bf build/lesson4}.
\medskip
Finally, test your modifications on several TSP instances ({\tt berlin52},
{\tt eil101} ...) and compare the results you get.
\end{document}

View file

@ -0,0 +1,70 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "tabu_search.cpp"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include <mo.h>
#include <graph.h>
#include <route.h>
#include <route_eval.h>
#include <route_init.h>
#include <two_opt.h>
#include <two_opt_init.h>
#include <two_opt_next.h>
#include <two_opt_incr_eval.h>
#include <two_opt_tabu_list.h>
int
main (int __argc, char * __argv [])
{
if (__argc != 2)
{
std :: cerr << "Usage : ./tabu_search [instance]" << std :: endl ;
return 1 ;
}
Graph :: load (__argv [1]) ; // Instance
Route route ; // Solution
RouteInit init ; // Sol. Random Init.
init (route) ;
RouteEval full_eval ; // Full. Eval.
full_eval (route) ;
std :: cout << "[From] " << route << std :: endl ;
/* Tools for an efficient (? :-))
local search ! */
TwoOptInit two_opt_init ; // Init.
TwoOptNext two_opt_next ; // Explorer.
TwoOptIncrEval two_opt_incr_eval ; // Eff. eval.
TwoOptTabuList tabu_list ; // Tabu List
//moSimpleMoveTabuList<TwoOpt> tabu_list(10);
//moSimpleSolutionTabuList<TwoOpt> tabu_list(10);
moNoAspirCrit <TwoOpt> aspir_crit ; // Aspiration Criterion
moGenSolContinue <Route> cont (10000) ; // Continuator
moTS <TwoOpt> tabu_search (two_opt_init, two_opt_next, two_opt_incr_eval, tabu_list, aspir_crit, cont, full_eval) ;
tabu_search (route) ;
std :: cout << "[To] " << route << std :: endl ;
return 0 ;
}

View file

@ -0,0 +1,41 @@
######################################################################################
### 1) Include the sources
######################################################################################
INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src)
INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src/utils)
INCLUDE_DIRECTORIES(${MO_SRC_DIR}/src)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/tsp/src)
######################################################################################
######################################################################################
### 2) Specify where CMake can find the libraries
######################################################################################
LINK_DIRECTORIES(${EO_BIN_DIR}/lib ${CMAKE_BINARY_DIR}/tsp/src)
######################################################################################
######################################################################################
### 3) Define your target(s): just an executable here
######################################################################################
ADD_EXECUTABLE(simulated_annealing simulated_annealing.cpp)
ADD_DEPENDENCIES(simulated_annealing tsp)
######################################################################################
######################################################################################
### 4) Link the librairies for your target(s)
######################################################################################
TARGET_LINK_LIBRARIES(simulated_annealing tsp eo eoutils)
######################################################################################

View file

@ -0,0 +1,88 @@
\documentclass[a4paper]{article}
\usepackage[english]{babel}
\usepackage{epsf}
\usepackage{amssymb}
\usepackage{here}
\usepackage{comment}
\usepackage{graphicx}
\topmargin -2.5cm
\textheight 25,5cm
\textwidth 16cm
\oddsidemargin 0cm
\evensidemargin 0cm
\begin{document}
\textbf{ParadisEO Practices} {\copyright Franck Seynhaeve,
Jean-Charles Boisson, Thomas Legrand} \Large{\textbf{\\\\
Lesson 4: Implement a tabu search using ParadisEO}}
\normalsize
\vspace{-0,3cm}
\section{Example}
The archive {\tt paradiseo\_practices\_0208.tgz} installed
on your computer contains a tabu search implemented using ParadisEO-MO~
(see {\tt tabu\_search} in the {\bf build/lesson4} directory).
\medskip
To run it, please go in {\bf build/lesso4} and start the program {\tt tabu\_search} by giving
one of the TSP instances located in {\bf tsp/benchs}.
\medskip
When entering {\tt ./tabu\_search ../../tsp/benchs/berlin52.tsp}, you should end up with the
following outputs:
\smallskip
\noindent
\texttt{>> Loading [../tsp/benchs/berlin52.tsp]}\\
\texttt{[From] -29414 52 1 20 40 48 9 27 13 22 5 28 24 29 21 26 44 38 33 37 45 31 42 18 12 3 14}\\
\texttt{36 30 6 51 32 17 11 0 34 4 10 4350 16 2 23 35 19 46 49 39 25 15 41 8 7 47}\\
\texttt{[To] -8724 52 1 6 41 29 22 19 49 15 28 46 13 51 12 25 26 27 11 10 50 32 42 9 8 7 40 18}\\
\texttt{44 2 16 20 30 17 21 0 31 48 35 3438 39 37 36 33 43 45 24 3 5 4 14 23 47}\\
The printed-out results show for the initial best solution and the final one~:
\\ \hspace*{1cm}-the length of the route
\\ \hspace*{1cm}-the number of cities
\\ \hspace*{1cm}-the route itself (notice that the city index starts from 0).
\section{Study the tabu search dedicated components}
Study the {\tt tabu\_search.cpp} file located in the {\bf lesson4} directory
using~:
\begin{itemize}
\item[$\bullet$] the ParadisEO-MO API documentation available at~:
\hspace{1cm}http$\,:$//paradiseo.gforge.inria.fr/addon/paradiseo-mo/doc/index.html
\item[$\bullet$] the source files located in the {\bf tsp/src/} directory
\end{itemize}
\section{Customize the tabu search}
Make a backup (copy) of the cpp file {\tt tabu\_search.cpp}. You can now modify the
original {\tt tabu\_search.cpp} and use the existing makefiles to compile it.
Edit and modify the {\tt tabu\_search.cpp} file~:
\begin{itemize}
\item[$\bullet$] Try to tune a few parameters of the tabu search.
\item[$\bullet$] Change the initialization of the solution by
modifying the file {\tt route\_init.cpp}.
\end{itemize}
\smallskip
To compile {\tt tabu\_search.cpp},you should use the
command {\tt make} from {\bf build/lesson4}.
\medskip
Finally, test your modifications on several TSP instances ({\tt berlin52},
{\tt eil101} ...) and compare the results you get.
\end{document}

View file

@ -0,0 +1,67 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "simulated_annealing.cpp"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include <mo.h>
#include <graph.h>
#include <route.h>
#include <route_eval.h>
#include <route_init.h>
#include <two_opt.h>
#include <two_opt_rand.h>
#include <two_opt_incr_eval.h>
int
main (int __argc, char * __argv [])
{
if (__argc != 2)
{
std :: cerr << "Usage : ./simulated_annealing [instance]" << std :: endl ;
return 1 ;
}
Graph :: load (__argv [1]) ; // Instance
Route route ; // Solution
RouteInit init ; // Sol. Random Init.
init (route) ;
RouteEval full_eval ; // Full. Eval.
full_eval (route) ;
std :: cout << "[From] " << route << std :: endl ;
/* Tools for an efficient (? :-))
local search ! */
TwoOptRand two_opt_rand ; // Route Random. Gen.
TwoOptIncrEval two_opt_incr_eval ; // Eff. eval.
TwoOpt move ;
moExponentialCoolingSchedule cool_sched (0.1, 0.98) ; // Exponential Cooling Schedule
//moLinearCoolingSchedule cool_sched (0.1, 0.5) ; // Linear Cooling Schedule
moGenSolContinue <Route> cont (1000) ; /* Temperature Descreasing
will occur each 1000
iterations */
moSA <TwoOpt> simulated_annealing (two_opt_rand, two_opt_incr_eval, cont, 1000, cool_sched, full_eval) ;
simulated_annealing (route) ;
std :: cout << "[To] " << route << std :: endl ;
return 0 ;
}

View file

@ -0,0 +1,41 @@
######################################################################################
### 1) Include the sources
######################################################################################
INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src)
INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src/utils)
INCLUDE_DIRECTORIES(${MO_SRC_DIR}/src)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/tsp/src)
######################################################################################
######################################################################################
### 2) Specify where CMake can find the libraries
######################################################################################
LINK_DIRECTORIES(${EO_BIN_DIR}/lib ${CMAKE_BINARY_DIR}/tsp/src)
######################################################################################
######################################################################################
### 3) Define your target(s): just an executable here
######################################################################################
ADD_EXECUTABLE(gen_algo gen_algo.cpp)
ADD_DEPENDENCIES(gen_algo tsp)
######################################################################################
######################################################################################
### 4) Link the librairies for your target(s)
######################################################################################
TARGET_LINK_LIBRARIES(gen_algo tsp eo eoutils)
######################################################################################

View file

@ -0,0 +1,64 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "gen_algo.cpp"
#include <eoEasyEA.h>
#include <eoGenContinue.h>
#include <eoStochTournamentSelect.h>
#include <eoSGATransform.h>
#include <eoSelectNumber.h>
#include "graph.h"
#include "route.h"
#include "route_init.h"
#include "route_eval.h"
#include "order_xover.h"
#include "partial_mapped_xover.h"
#include "city_swap.h"
int main (int __argc, char * __argv []) {
if (__argc != 2) {
std :: cerr << "Usage : ./gen_algo [instance]" << std :: endl ;
return 1 ;
}
Graph :: load (__argv [1]) ; // Instance
RouteInit init ; // Sol. Random Init.
RouteEval full_eval ; // Full Evaluator
eoPop <Route> pop (100, init) ; // Population
apply <Route> (full_eval, pop) ;
std :: cout << "[From] " << pop.best_element () << std :: endl ;
eoGenContinue <Route> cont (1000) ; /* Continuator (A fixed number of
1000 iterations */
eoStochTournamentSelect <Route> select_one ; // Selector
eoSelectNumber <Route> select (select_one, 100) ;
// OrderXover cross ; // Order Crossover
PartialMappedXover cross ;
CitySwap mut ; // City Swap Mutator
eoSGATransform <Route> transform (cross, 1, mut, 0.01) ;
eoElitism <Route> merge (1) ; // Use of Elistism
eoStochTournamentTruncate <Route> reduce (0.7) ; // Stoch. Replacement
eoEasyEA <Route> ea (cont, full_eval, select, transform, merge, reduce) ;
ea (pop) ;
std :: cout << "[To] " << pop.best_element () << std :: endl ;
return 0 ;
}

View file

@ -0,0 +1,93 @@
\documentclass[a4paper]{article}
\usepackage[english]{babel}
\usepackage{epsf}
\usepackage{amssymb}
\usepackage{here}
\usepackage{comment}
\usepackage{graphicx}
\topmargin -2.5cm
\textheight 25,5cm
\textwidth 16cm
\oddsidemargin 0cm
\evensidemargin 0cm
\begin{document}
\textbf{ParadisEO Practices} {\copyright Franck Seynhaeve,
Jean-Charles Boisson, Thomas Legrand} \Large{\textbf{\\\\
Lesson 5: Implement a genetic algorithm using ParadisEO}}
\normalsize
\vspace{-0,3cm}
\section{Example}
The archive {\tt paradiseo\_practices\_0208.tgz} installed
on your computer contains a genetic algorithm implemented using ParadisEO-EO~
(see {\tt gen\_algo} in the {\bf build/lesson5} directory).
\medskip
To run it, please go in {\bf build/lesson5} and start the program {\tt gen\_algo} by giving
one of the TSP instances located in {\bf tsp/benchs}.
\medskip
When entering {\tt ./gen\_algo ../../tsp/benchs/berlin52.tsp}, you should end up with the
following outputs:
\smallskip
\noindent
\texttt{>> Loading [../tsp/benchs/berlin52.tsp]}\\
\texttt{[From] -26461 52 39 12 29 44 2 26 13 40 7 35 14 28 25 41 6 51 10 50 45 19 0 38 15}\\
\texttt{33 42 21 18 32 37 9 5 20 34 43 16 30 1 23 22 4 27 36 4946 47 48 11 17 8 31 24 3}\\
\texttt{STOP in eoGenContinue: Reached maximum number of generations [1000/1000]}\\
\texttt{[To] -13068 52 45 24 28 22 19 21 30 17 31 36 46 25 13 12 26 27 51 10 14 37 23 4 15 49}\\
\texttt{20 2 8 42 50 11 47 39 38 35 34 44 18 40 9 7 32 3 5 33 16 41 6 1 29 0 48
43} \\
\medskip
The printed-out results show for the initial best solution and the final one~:
\\ \hspace*{1cm}-the length of the route
\\ \hspace*{1cm}-the number of cities
\\ \hspace*{1cm}-the route itself (notice that the city index starts from 0).
\section{Study the genetic algorithm dedicated components}
Study the {\tt gen\_algo.cpp} file located in the {\bf lesson5} directory
using~:
\begin{itemize}
\item[$\bullet$] the ParadisEO-EO API documentation available at~:
\hspace{1cm}http$\,:$//eodev.sourceforge.net/eo/doc/html/index.html
\item[$\bullet$] the source files located in the {\bf tsp/src/} directory
\end{itemize}
\section{Customize the GA}
Make a backup (copy) of the cpp file {\tt gen\_algo.cpp}. You can now modify the
original {\tt gen\_algo.cpp} and use the existing makefiles to compile it.
Edit and modify the {\tt gen\_algo.cpp} file~:
\begin{itemize}
\item[$\bullet$] Try to tune a few parameters of the GA
(selection criteria, stopping criteria ...).
\item[$\bullet$] Then, try to change the initialization of the population
by applying one of the local searches on each individual.
\end{itemize}
\smallskip
To compile {\tt gen\_algo.cpp},you should use the
command {\tt make} from {\bf build/lesson5}.
\medskip
Finally, test your modifications on several TSP instances ({\tt berlin52},
{\tt eil101} ...) and compare the results you get.
\end{document}

View file

@ -0,0 +1,9 @@
######################################################################################
### 1) Where must cmake go now ?
######################################################################################
SUBDIRS(src)
######################################################################################

View file

@ -0,0 +1,536 @@
535
36.49 7.49
57.06 9.51
30.22 48.14
5.15 -3.56
34.59 -106.37
57.12 -2.12
16.45 -99.45
5.36 -0.1
28.56 -13.36
8.59 38.48
12.5 45.02
-34.48 138.38
30.23 -9.33
56.18 12.51
36.4 -4.3
40.38 8.17
35.11 -3.5
41.55 8.48
-37.01 174.47
38.17 -0.34
36.42 3.13
36.11 37.14
35.14 -101.42
31.58 35.59
52.18 4.46
61.1 -149.59
39.57 32.41
51.11 4.28
17.08 -61.47
43.37 13.22
29.38 35.01
59.39 17.55
15.18 38.55
-25.14 -57.31
23.58 32.47
37.54 23.44
33.46 -84.31
12.3 -70.01
24.26 54.28
36.55 30.48
26.16 50.38
40.29 50.01
39.11 -76.4
10.48 -74.52
-16.11 -52.3
10.25 45.01
41.18 2.05
32.22 -64.42
41.56 -72.41
40.39 17.57
44.49 20.19
9.21 34.31
32.06 20.16
52.29 13.24
48.27 -4.25
-19.48 3.45
33.49 35.29
54.39 -6.14
35.48 -101.22
4.24 18.31
13.04 -59.3
60.17 5.13
44.48 -68.5
33.14 44.14
45.4 9.24
33.34 -86.45
52.27 -1.45
42.33 9.29
45.48 -108.37
43.28 -1.32
13.21 -16.4
-3.19 29.19
13.55 100.36
12.38 -8.02
55.44 9.09
44.32 11.18
12.57 77.4
-15.41 34.58
27.13 56.22
-27.25 153.05
44.5 -0.43
4.42 -74.09
50.47 -1.51
19.05 72.52
67.16 14.22
42.22 -71
53.03 8.48
41.08 16.47
46.55 7.3
51.31 -2.35
50.54 4.29
-15.52 -47.55
47.35 7.32
48.1 16.13
47.27 19.15
-34.49 -58.32
42.55 -78.38
44.3 26.06
49.27 2.07
-4.15 15.15
39.15 9.04
30.08 31.24
23.11 113.16
33.33 -7.4
-11.54 22.45
4.49 -52.22
52.13 0.11
-35.19 149.12
10.36 -66.59
22.39 88.27
52.5 -1.19
49.01 2.33
43.33 6.57
45.4 -0.19
39.37 19.55
50.52 7.09
41.59 -87.54
41.48 12.36
9.34 -13.37
41.25 -81.51
3.26 -76.25
42.31 8.48
-28.02 145.37
7.11 79.53
40.04 -83.04
33.22 -7.35
48.07 7.22
44.22 28.29
45.4 -0.19
6.21 2.23
55.37 12.39
-33.58 18.36
37.28 15.04
10.27 -75.31
-26.25 146.14
39 17.05
12.12 -68.57
39.09 -84.2
39.03 -84.2
51.24 -3.12
29.11 -81.03
23.46 90.23
14.45 42.59
32.5 -96.51
33.25 36.31
-6.53 39.12
42.34 18.16
-29.58 30.57
38.51 -77.02
28.34 77.07
39.46 -104.53
32.46 -96.24
26.16 50.1
47.16 5.05
33.52 10.47
14.45 -17.3
4.01 9.43
19.08 30.26
25.16 51.34
49.22 0.1
-8.45 115.1
51.08 13.46
-12.25 130.52
42.14 -83.32
42.13 -83.21
53.26 -6.15
51.17 6.45
25.15 55.2
0.03 32.26
45.32 4.18
55.57 -3.22
51.27 5.23
31.48 -106.16
52.5 -1.19
48.19 6.04
40.07 33
40.09 82.4
40.42 -74.1
50.44 -3.25
-34.49 -58.32
64.49 -147.51
37.01 -7.58
-11.35 27.31
59.54 10.37
41.49 12.15
14.35 -61
33.56 45.8
-4.23 15.26
43.49 11.12
8.37 -13.12
41.26 15.32
50.02 8.34
44.12 12.04
-21.13 27.29
28.27 -13.52
53.29 -1
-19.27 29.52
54.23 18.28
60.12 11.05
24.57 10.1
-22.5 -43.15
55.52 -4.26
45.22 5.2
7.09 41.43
44.25 8.5
57.4 18.18
41.54 2.46
37.11 -3.47
47 15.26
51.09 -0.11
14.34 -90.32
46.14 6.07
-2.09 -79.53
52.28 9.42
53.38 10
60.19 24.58
35.2 25.11
30.2 120.51
22.19 114.12
31.4 6.09
35.33 139.46
21.2 -157.55
29.59 -95.28
38.57 -77.27
43.06 -78.57
38.52 1.22
47.34 -97.27
50.21 30.55
-25.44 -54.28
39.44 -86.17
40.59 28.49
38.17 27.1
21.3 39.12
49.13 -2.12
40.38 -73.46
11.33 43.1
-6.09 106.51
-26.08 28.15
-3.22 36.38
45.28 -73.44
12.03 8.31
34.34 69.12
63.59 -22.37
-1.58 30.08
22.34 120.17
24.54 67.09
-6.18 155.43
17.56 -76.48
50.05 19.47
15.36 32.33
27.42 85.22
3.08 101.33
29.13 47.58
-8.51 13.14
10.36 -66.59
36.04 -115.09
33.56 -118.24
53.52 -1.39
48.58 2.27
0.27 9.25
34.52 33.38
43.11 0
59.49 30.17
36.51 -2.22
51.24 12.25
51.25 12.14
6.1 1.15
40.46 -73.52
33.57 -118.24
50.38 5.27
51.09 -0.11
51.28 -0.27
50.34 3.05
-12.01 -77.07
45.27 9.16
38.46 -9.08
46.13 14.28
35.3 12.37
48.14 14.11
51.28 -0.27
6.35 3.2
27.56 -15.23
-16.3 -68.11
53.21 -2.53
6.1 1.15
51.53 -0.22
-25.55 32.34
-15.2 28.27
4.27 114
49.37 6.12
-17.49 25.49
25.41 32.43
45.44 4.56
13 80.11
40.29 -3.34
31.52 -4.13
53.21 -2.16
-3.04 -60
10.34 -71.44
-4.02 39.36
46.22 15.47
39.18 -94.44
28.32 -81.2
23.36 58.17
44.25 8.5
-37.44 144.54
24.31 39.42
-37.41 144.51
19.26 -99.04
12.07 -86.11
2.01 45.19
25.48 -80.17
20.56 -89.41
45.27 9.16
35.45 10.45
39.07 -94.36
35.52 14.29
4.11 73.32
47.45 7.26
55.33 13.22
54.31 -1.25
14.31 121.01
55.58 37.25
43.35 3.58
-25.55 32.34
-8.58 125.13
43.26 5.13
-20.26 57.41
51.21 1.21
44.53 -93.13
53.52 27.33
50.55 5.47
29.59 -90.16
-26.31 31.19
48.08 11.42
-34.5 -56.02
45.38 8.43
49.05 6.08
-17.45 177.27
40.53 14.18
25.02 -77.28
-1.19 36.56
43.4 7.13
55.02 -1.41
45.56 6.06
12.08 15.02
32.56 129.56
35.09 36.17
13.29 2.1
18.06 -15.57
-13 28.39
58.35 16.15
35.45 140.23
47.09 -1.36
49.3 11.05
52.41 1.17
40.38 -73.46
55.28 10.2
46.26 30.41
26.21 127.46
35.26 -97.46
40.54 9.31
41.07 -95.55
41.14 -8.41
41.59 -87.54
51.5 -8.29
28.26 -81.19
35.38 -0.37
48.43 2.23
34.47 135.27
60.12 11.05
51.12 2.52
44.34 26.06
12.21 -1.31
43.26 -5.5
18.34 -72.17
48.43 2.23
40.05 116.36
-31.56 115.58
4.52 7.02
37.08 -76.3
39.52 -75.15
33.26 -112.01
55.52 -4.26
46.35 0.18
40.3 -80.14
-5.15 39.49
39.33 2.44
38.1 13.06
11.33 104.51
36.49 11.58
-9.27 147.13
10.36 -61.21
9.05 -79.23
50.06 14.16
43.41 10.24
42.26 14.11
16.16 -61.32
9.03 -79.24
43.23 -0.25
45.39 12.12
31.37 -8.03
34.03 -6.45
-8.08 -34.55
38.04 15.39
64.08 -21.57
16.54 96.09
49.19 4.03
36.23 28.07
-29.43 -53.42
-22.5 -43.15
45.13 14.35
44.01 12.37
48.04 -1.44
6.14 -10.22
41.49 12.15
14.1 145.15
-32.55 -60.47
51.57 4.26
24.42 46.44
33.37 73.06
6.3 -58.15
15.29 44.13
13.42 -89.07
32.44 -117.11
-23 -47.08
29.32 -98.28
-17.56 31.06
48.31 -24.8
-33.23 -70.47
42.54 -8.25
33.14 44.14
18.26 -69.4
47.27 -122.18
27 14.27
37.33 126.48
51.34 0.42
-4.4 55.31
37.37 -122.23
31.12 121.2
25.21 55.24
16.45 -22.57
1.21 103.54
37.22 -121.56
43.49 18.2
9.58 -84.16
9.59 -84.12
18.26 -66.01
40.31 22.58
41.58 21.38
40.53 -111.57
36.58 -25.1
52.42 -8.55
42.42 23.24
43.32 16.18
-12.54 -38.2
38.45 -90.22
51.33 0.14
59.39 17.55
48.41 9.13
38.54 16.15
58.53 5.38
55.58 37.25
37.26 -5.54
48.32 7.38
52.22 13.3
-33.56 151.1
29.33 52.36
47.48 13
40.31 17.24
41.19 69.24
28.29 -16.2
38.31 -28.43
43.11 0
28.29 -16.2
14.02 -87.14
52.29 13.24
35.41 51.19
41.2 19.47
32.4 13.09
43.37 1.23
32.01 34.53
22.49 5.27
0.23 6.43
35.43 -5.55
-18.48 47.29
33.56 8.06
-24.42 -53.42
25.04 121.33
37.55 12.29
51.23 -2.43
45.12 7.39
45.5 13.28
45.39 12.12
47.26 0.43
36.18 -95.52
36.51 10.14
52.34 13.18
35.33 139.46
35.54 -83.53
40.62 13.11
-0.08 -78.29
12.41 101.01
13.45 -60.57
44.55 4.58
43.14 27.49
45.3 12.21
-23 -47.08
48.07 16.33
39.29 -0.29
41.42 -4.51
45.24 10.53
38.57 -77.27
52.1 20.58
36.45 -6.04
53.19 -113.35
44.53 -63.31
45.41 -74.02
45.19 -75.4
46.48 -71.24
42.16 -82.58
48.57 -54.34
45.28 -73.44
49.11 -123.1
49.55 -97.14
51.07 -114.01
47.37 -52.45
43.41 -79.38
44.06 15.21
45.45 16.04
41.4 -1.03
-6.13 39.13
47.28 8.33
51.33 0.14
24.58 91.53

View file

@ -0,0 +1,53 @@
52
565 575
25 185
345 750
945 685
845 655
880 660
25 230
525 1000
580 1175
650 1130
1605 620
1220 580
1465 200
1530 5
845 680
725 370
145 665
415 635
510 875
560 365
300 465
520 585
480 415
835 625
975 580
1215 245
1320 315
1250 400
660 180
410 250
420 555
575 665
1150 1160
700 580
685 595
685 610
770 610
795 645
720 635
760 650
475 960
95 260
875 920
700 500
555 815
830 485
1170 65
830 610
605 625
595 360
1340 725
1740 245

View file

@ -0,0 +1,102 @@
101
41 49
35 17
55 45
55 20
15 30
25 30
20 50
10 43
55 60
30 60
20 65
50 35
30 25
15 10
30 5
10 20
5 30
20 40
15 60
45 65
45 20
45 10
55 5
65 35
65 20
45 30
35 40
41 37
64 42
40 60
31 52
35 69
53 52
65 55
63 65
2 60
20 20
5 5
60 12
40 25
42 7
24 12
23 3
11 14
6 38
2 48
8 56
13 52
6 68
47 47
49 58
27 43
37 31
57 29
63 23
53 12
32 12
36 26
21 24
17 34
12 24
24 58
27 69
15 77
62 77
49 73
67 5
56 39
37 47
37 56
57 68
47 16
44 17
46 13
49 11
49 42
53 43
61 52
57 48
56 37
55 54
15 47
14 37
11 31
16 22
4 18
28 18
26 52
26 35
31 67
15 19
22 22
18 24
26 27
25 24
22 27
25 21
19 21
20 26
18 18
35 35

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,35 @@
NAME : eil101
COMMENT : 101-city problem (Christofides/Eilon)
TYPE : TSP
DIMENSION : 101
EDGE_WEIGHT_TYPE : EUC_2D
NAME: ali535
TYPE: TSP
COMMENT: 535 Airports around the globe (Padberg/Rinaldi)
DIMENSION: 535
EDGE_WEIGHT_TYPE: GEO
DISPLAY_DATA_TYPE: COORD_DISPLAY
NAME : pr2392
COMMENT : 2392-city problem (Padberg/Rinaldi)
TYPE : TSP
DIMENSION : 2392
EDGE_WEIGHT_TYPE : EUC_2D
NAME : rl5915
COMMENT : 5915-city TSP (Reinelt)
TYPE : TSP
DIMENSION : 5915
EDGE_WEIGHT_TYPE : EUC_2D
NAME : usa13509
COMMENT : Cities with population at least 500 in the continental US.
COMMENT : Contributed by David Applegate and Andre Rohe, based on the
COMMENT : data set "US.lat-long" from the ftp site ftp.cs.toronto.edu.
COMMENT : The file US.lat-long.Z can be found in the directory /doc/geography.
TYPE : TSP
DIMENSION : 13509
EDGE_WEIGHT_TYPE : EUC_2D

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,38 @@
######################################################################################
### 1) Include the sources
######################################################################################
INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src)
INCLUDE_DIRECTORIES(${MO_SRC_DIR}/src)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
######################################################################################
######################################################################################
### 2) Define your target(s): just the tsp here
######################################################################################
SET(TSP_LIB_OUTPUT_PATH ../lib)
SET(LIBRARY_OUTPUT_PATH ${TSP_LIB_OUTPUT_PATH})
SET (TSP_SOURCES graph.cpp
route_init.cpp
route_eval.cpp
part_route_eval.cpp
edge_xover.cpp
order_xover.cpp
route_valid.cpp
partial_mapped_xover.cpp
city_swap.cpp
two_opt.cpp
two_opt_init.cpp
two_opt_next.cpp
two_opt_incr_eval.cpp
two_opt_tabu_list.cpp
two_opt_rand.cpp)
ADD_LIBRARY(tsp STATIC ${TSP_SOURCES})
######################################################################################

View file

@ -0,0 +1,24 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "city_swap.cpp"
// (c) OPAC Team, LIFL, 2002-2006
/* TEXT LICENCE
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include <utils/eoRNG.h>
#include "city_swap.h"
bool CitySwap :: operator () (Route & __route) {
std :: swap (__route [rng.random (__route.size ())],
__route [rng.random (__route.size ())]) ;
__route.invalidate () ;
return true ;
}

View file

@ -0,0 +1,29 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "city_swap.h"
// (c) OPAC Team, LIFL, 2002-2006
/* TEXT LICENCE
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef city_swap_h
#define city_swap_h
#include <eoOp.h>
#include "route.h"
/** Its swaps two vertices
randomly choosen */
class CitySwap : public eoMonOp <Route> {
public :
bool operator () (Route & __route) ;
} ;
#endif

View file

@ -0,0 +1,142 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "edge_xover.cpp"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include <assert.h>
#include <utils/eoRNG.h>
#include "edge_xover.h"
#include "route_valid.h"
#define MAXINT 1000000
void
EdgeXover :: build_map (const Route & __par1, const Route & __par2)
{
unsigned int len = __par1.size () ;
/* Initialization */
_map.clear () ;
_map.resize (len) ;
for (unsigned int i = 0 ; i < len ; i ++)
{
_map [__par1 [i]].insert (__par1 [(i + 1) % len]) ;
_map [__par2 [i]].insert (__par2 [(i + 1) % len]) ;
_map [__par1 [i]].insert (__par1 [(i - 1 + len) % len]) ;
_map [__par2 [i]].insert (__par2 [(i - 1 + len) % len]) ;
}
visited.clear () ;
visited.resize (len, false) ;
}
void
EdgeXover :: remove_entry (unsigned int __vertex, std :: vector <std :: set <unsigned int> > & __map)
{
std :: set <unsigned int> & neigh = __map [__vertex] ;
for (std :: set <unsigned int> :: iterator it = neigh.begin () ; it != neigh.end () ; it ++)
{
__map [* it].erase (__vertex) ;
}
}
void
EdgeXover :: add_vertex (unsigned int __vertex, Route & __child)
{
visited [__vertex] = true ;
__child.push_back (__vertex) ;
remove_entry (__vertex, _map) ; /* Removing entries */
}
void
EdgeXover :: cross (const Route & __par1, const Route & __par2, Route & __child) {
build_map (__par1, __par2) ;
unsigned int len = __par1.size () ;
/* Go ! */
__child.clear () ;
unsigned int cur_vertex = rng.random (len) ;
add_vertex (cur_vertex, __child) ;
for (unsigned int i = 1 ; i < len ; i ++) {
unsigned int len_min_entry = MAXINT ;
std :: set <unsigned int> & neigh = _map [cur_vertex] ;
for (std :: set <unsigned int> :: iterator it = neigh.begin () ; it != neigh.end () ; it ++)
{
unsigned int l = _map [* it].size () ;
if (len_min_entry > l)
{
len_min_entry = l ;
}
}
std :: vector <unsigned int> cand ; /* Candidates */
for (std :: set <unsigned> :: iterator it = neigh.begin () ; it != neigh.end () ; it ++)
{
unsigned int l = _map [* it].size () ;
if (len_min_entry == l)
{
cand.push_back (* it) ;
}
}
if (! cand.size ())
{
/* Oh no ! Implicit mutation */
for (unsigned int j = 0 ; j < len ; j ++)
{
if (! visited [j])
{
cand.push_back (j) ;
}
}
}
cur_vertex = cand [rng.random (cand.size ())] ;
add_vertex (cur_vertex, __child) ;
}
}
bool
EdgeXover :: operator () (Route & __route1, Route & __route2)
{
// Init. copy
Route par [2] ;
par [0] = __route1 ;
par [1] = __route2 ;
cross (par [0], par [1], __route1) ;
cross (par [1], par [0], __route2) ;
assert (valid (__route1)) ;
assert (valid (__route2)) ;
__route1.invalidate () ;
__route2.invalidate () ;
return true ;
}

View file

@ -0,0 +1,47 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "edge_xover.h"
// (c) OPAC Team, LIFL, 2003-2006
/* TEXT LICENCE
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef edge_xover_h
#define edge_xover_h
#include <vector>
#include <set>
#include <eoOp.h>
#include "route.h"
/** Edge Crossover */
class EdgeXover : public eoQuadOp <Route>
{
public :
bool operator () (Route & __route1, Route & __route2) ;
private :
void cross (const Route & __par1, const Route & __par2, Route & __child) ; /* Binary */
void remove_entry (unsigned int __vertex, std :: vector <std :: set <unsigned> > & __map) ;
/* Updating the map of entries */
void build_map (const Route & __par1, const Route & __par2) ;
void add_vertex (unsigned int __vertex, Route & __child) ;
std :: vector <std :: set <unsigned int> > _map ; /* The handled map */
std :: vector <bool> visited ; /* Vertices that are already visited */
} ;
#endif

View file

@ -0,0 +1,90 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "graph.cpp"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include <fstream>
#include <iostream>
#include <math.h>
#include "graph.h"
namespace Graph {
static std :: vector <std :: pair <double, double> > vectCoord ; // Coordinates
static std :: vector <std :: vector <unsigned int> > dist ; // Distances Mat.
unsigned size ()
{
return dist.size () ;
}
void computeDistances ()
{
// Dim.
unsigned int numCities = vectCoord.size () ;
dist.resize (numCities) ;
for (unsigned int i = 0 ; i < dist.size () ; i ++)
{
dist [i].resize (numCities) ;
}
// Computations.
for (unsigned int i = 0 ; i < dist.size () ; i ++)
{
for (unsigned int j = i + 1 ; j < dist.size () ; j ++)
{
double distX = (double)(vectCoord [i].first - vectCoord [j].first) ;
double distY = (double)(vectCoord [i].second - vectCoord [j].second) ;
dist [i] [j] = dist [j] [i] = (unsigned) (sqrt ((float) (distX * distX + distY * distY)) + 0.5) ;
}
}
}
void load (const char * __fileName)
{
std :: ifstream f (__fileName) ;
std :: cout << ">> Loading [" << __fileName << "]" << std :: endl ;
if (f)
{
unsigned int num_vert ;
f >> num_vert ;
vectCoord.resize (num_vert) ;
for (unsigned int i = 0 ; i < num_vert ; i ++)
{
f >> vectCoord [i].first >> vectCoord [i].second ;
}
f.close () ;
computeDistances () ;
}
else
{
std :: cout << __fileName << " doesn't exist !!!" << std :: endl ;
// Bye !!!
exit (1) ;
}
}
float distance (unsigned int __from, unsigned int __to)
{
return (float)(dist [__from] [__to]) ;
}
}

View file

@ -0,0 +1,30 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "graph.h"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef graph_h
#define graph_h
#include <vector>
#include <utility>
namespace Graph
{
void load (const char * __file_name) ;
/* Loading cities
(expressed by their coordinates)
from the given file name */
float distance (unsigned int __from, unsigned int __to) ;
unsigned int size () ; // How many cities ?
}
#endif

View file

@ -0,0 +1,25 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "mix.h"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef mix_h
#define mix_h
#include <utils/eoRNG.h>
template <class T> void mix (std :: vector <T> & __vect)
{
for (unsigned int i = 0 ; i < __vect.size () ; i ++)
{
std :: swap (__vect [i], __vect [rng.random (__vect.size ())]) ;
}
}
#endif

View file

@ -0,0 +1,94 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "order_xover.cpp"
// (c) OPAC Team, LIFL, 2002-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include <assert.h>
#include <vector>
#include <utils/eoRNG.h>
#include "order_xover.h"
#include "route_valid.h"
void OrderXover :: cross (const Route & __par1, const Route & __par2, Route & __child)
{
unsigned int cut = rng.random (__par1.size ()) ;
/* To store vertices that have
already been crossed */
std::vector<bool> v;
v.resize(__par1.size());
for (unsigned int i = 0 ; i < __par1.size () ; i ++)
{
v [i] = false ;
}
/* Copy of the left partial
route of the first parent */
for (unsigned int i = 0 ; i < cut ; i ++)
{
__child [i] = __par1 [i] ;
v [__par1 [i]] = true ;
}
/* Searching the vertex of the second path, that ended
the previous first one */
unsigned int from = 0 ;
for (unsigned int i = 0 ; i < __par2.size () ; i ++)
{
if (__par2 [i] == __child [cut - 1])
{
from = i ;
break ;
}
}
/* Selecting a direction
Left or Right */
char direct = rng.flip () ? 1 : -1 ;
/* Copy of the left vertices from
the second parent path */
unsigned int l = cut ;
for (unsigned int i = 0 ; i < __par2.size () ; i ++)
{
unsigned int bidule /* :-) */ = (direct * i + from + __par2.size ()) % __par2.size () ;
if (! v [__par2 [bidule]])
{
__child [l ++] = __par2 [bidule] ;
v [__par2 [bidule]] = true ;
}
}
v.clear();
}
bool OrderXover :: operator () (Route & __route1, Route & __route2)
{
// Init. copy
Route par [2] ;
par [0] = __route1 ;
par [1] = __route2 ;
cross (par [0], par [1], __route1) ;
cross (par [1], par [0], __route2) ;
assert (valid (__route1)) ;
assert (valid (__route2)) ;
__route1.invalidate () ;
__route2.invalidate () ;
return true ;
}

View file

@ -0,0 +1,32 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "order_xover.h"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef order_xover_h
#define order_xover_h
#include <eoOp.h>
#include "route.h"
/** Order Crossover */
class OrderXover : public eoQuadOp <Route>
{
public :
bool operator () (Route & __route1, Route & __route2) ;
private :
void cross (const Route & __par1, const Route & __par2, Route & __child) ;
} ;
#endif

View file

@ -0,0 +1,27 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "part_route_eval.cpp"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include "part_route_eval.h"
#include "graph.h"
PartRouteEval :: PartRouteEval (float __from, float __to) : from (__from), to (__to) {}
void PartRouteEval :: operator () (Route & __route)
{
float len = 0 ;
for (unsigned int i = (unsigned int) (__route.size () * from) ; i < (unsigned int ) (__route.size () * to) ; i ++)
{
len -= Graph :: distance (__route [i], __route [(i + 1) % Graph :: size ()]) ;
}
__route.fitness (len) ;
}

View file

@ -0,0 +1,37 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "part_route_eval.h"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef part_route_eval_h
#define part_route_eval_h
#include <eoEvalFunc.h>
#include "route.h"
/** Route Evaluator */
class PartRouteEval : public eoEvalFunc <Route>
{
public :
/** Constructor */
PartRouteEval (float __from, float __to) ;
void operator () (Route & __route) ;
private :
float from, to ;
} ;
#endif

View file

@ -0,0 +1,20 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "part_two_opt_init.cpp"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include <utils/eoRNG.h>
#include "part_two_opt_init.h"
void PartTwoOptInit :: operator () (TwoOpt & __move, const Route & __route)
{
__move.first = rng.random (__route.size () - 6) ;
__move.second = __move.first + 2 ;
}

View file

@ -0,0 +1,29 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "part_two_opt_init.h"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef part_two_opt_init_h
#define part_two_opt_init_h
#include <moMoveInit.h>
#include "two_opt.h"
/** It sets the first couple of edges */
class PartTwoOptInit : public moMoveInit <TwoOpt>
{
public :
void operator () (TwoOpt & __move, const Route & __route) ;
} ;
#endif

View file

@ -0,0 +1,32 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "part_two_opt_next.cpp"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include "part_two_opt_next.h"
#include "graph.h"
bool TwoOptNext :: operator () (TwoOpt & __move, const Route & __route)
{
if (__move.first == Graph :: size () - 4 && __move.second == __move.first + 2)
{
return false ;
}
else
{
__move.second ++ ;
if (__move.second == Graph :: size () - 1)
{
__move.first ++ ;
__move.second = __move.first + 2 ;
}
return true ;
}
}

View file

@ -0,0 +1,28 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "part_two_opt_next.h"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef part_two_opt_next_h
#define part_two_opt_next_h
#include <moNextMove.h>
#include "two_opt.h"
/** It updates a couple of edges */
class PartTwoOptNext : public moNextMove <TwoOpt>
{
public :
bool operator () (TwoOpt & __move, const Route & __route) ;
} ;
#endif

View file

@ -0,0 +1,93 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "partial_mapped_xover.cpp"
// (c) OPAC Team, LIFL, 2003-2006
/* TEXT LICENCE
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include <assert.h>
#include <vector>
#include <utils/eoRNG.h>
#include "partial_mapped_xover.h"
#include "route_valid.h"
#include "mix.h"
void PartialMappedXover :: repair (Route & __route, unsigned __cut1, unsigned __cut2)
{
std::vector<unsigned int> v; // Number of times a cities are visited ...
v.resize(__route.size ());
for (unsigned int i = 0 ; i < __route.size () ; i ++)
{
v [i] = 0 ;
}
for (unsigned int i = 0 ; i < __route.size () ; i ++)
{
v [__route [i]] ++ ;
}
std :: vector <unsigned int> vert ;
for (unsigned int i = 0 ; i < __route.size () ; i ++)
{
if (! v [i])
{
vert.push_back (i) ;
}
}
mix (vert) ;
for (unsigned int i = 0 ; i < __route.size () ; i ++)
{
if (i < __cut1 || i >= __cut2)
{
if (v [__route [i]] > 1)
{
__route [i] = vert.back () ;
vert.pop_back () ;
}
}
}
v.clear();
}
bool PartialMappedXover :: operator () (Route & __route1, Route & __route2)
{
unsigned int cut1 = rng.random (__route1.size ()), cut2 = rng.random (__route2.size ()) ;
if (cut2 < cut1)
{
std :: swap (cut1, cut2) ;
}
// Between the cuts
for (unsigned int i = cut1 ; i < cut2 ; i ++)
{
std :: swap (__route1 [i], __route2 [i]) ;
}
// Outside the cuts
repair (__route1, cut1, cut2) ;
repair (__route2, cut1, cut2) ;
// Debug
assert (valid (__route1)) ;
assert (valid (__route2)) ;
__route1.invalidate () ;
__route2.invalidate () ;
return true ;
}

View file

@ -0,0 +1,31 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "partial_mapped_xover.h"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef partial_mapped_xover_h
#define partial_mapped_xover_h
#include <eoOp.h>
#include "route.h"
/** Partial Mapped Crossover */
class PartialMappedXover : public eoQuadOp <Route> {
public :
bool operator () (Route & __route1, Route & __route2) ;
private :
void repair (Route & __route, unsigned __cut1, unsigned __cut2) ;
} ;
#endif

View file

@ -0,0 +1,19 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "route.h"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef route_h
#define route_h
#include <eoVector.h>
typedef eoVector <float, unsigned int> Route ; // [Fitness (- length), Gene (city)]
#endif

View file

@ -0,0 +1,26 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "route_eval.cpp"
// (c) OPAC Team, LIFL, 2003-2006
/* TEXT LICENCE
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include "route_eval.h"
#include "graph.h"
void RouteEval :: operator () (Route & __route)
{
float len = 0 ;
for (unsigned int i = 0 ; i < Graph :: size () ; i ++)
{
len -= Graph :: distance (__route [i], __route [(i + 1) % Graph :: size ()]) ;
}
__route.fitness (len) ;
}

View file

@ -0,0 +1,30 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "route_eval.h"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef route_eval_h
#define route_eval_h
#include <eoEvalFunc.h>
#include "route.h"
/** Route Evaluator */
class RouteEval : public eoEvalFunc <Route>
{
public :
void operator () (Route & __route) ;
} ;
#endif

View file

@ -0,0 +1,38 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "route_init.cpp"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include <utils/eoRNG.h>
#include "route_init.h"
#include "graph.h"
void RouteInit :: operator () (Route & __route)
{
// Init.
__route.clear () ;
for (unsigned int i = 0 ; i < Graph :: size () ; i ++)
{
__route.push_back (i) ;
}
// Swap. cities
for (unsigned int i = 0 ; i < Graph :: size () ; i ++)
{
//unsigned int j = rng.random (Graph :: size ()) ;
unsigned int j = (unsigned int) (Graph :: size () * (rand () / (RAND_MAX + 1.0))) ;
unsigned int city = __route [i] ;
__route [i] = __route [j] ;
__route [j] = city ;
}
}

View file

@ -0,0 +1,28 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "route_init.h"
// (c) OPAC Team, LIFL, 2002-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef route_init_h
#define route_init_h
#include <eoInit.h>
#include "route.h"
class RouteInit : public eoInit <Route>
{
public :
void operator () (Route & __route) ;
} ;
#endif

View file

@ -0,0 +1,43 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "route_valid.cpp"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include "route_valid.h"
#include <vector>
bool valid (Route & __route)
{
std::vector<unsigned int> t;
t.resize(__route.size());
for (unsigned int i = 0 ; i < __route.size () ; i ++)
{
t [i] = 0 ;
}
for (unsigned int i = 0 ; i < __route.size () ; i ++)
{
t [__route [i]] ++ ;
}
for (unsigned int i = 0 ; i < __route.size () ; i ++)
{
if (t [i] != 1)
{
t.clear();
return false ;
}
}
t.clear();
return true ; // OK.
}

View file

@ -0,0 +1,19 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "route_valid.h"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef route_valid_h
#define route_valid_h
#include "route.h"
bool valid (Route & __route) ;
#endif

View file

@ -0,0 +1,47 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "two_opt.cpp"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include "two_opt.h"
TwoOpt TwoOpt :: operator ! () const
{
TwoOpt move = * this ;
std :: swap (move.first, move.second) ;
return move ;
}
void TwoOpt :: operator () (Route & __route)
{
std :: vector <unsigned int> seq_cities ;
for (unsigned int i = second ; i > first ; i --)
{
seq_cities.push_back (__route [i]) ;
}
unsigned int j = 0 ;
for (unsigned int i = first + 1 ; i < second + 1 ; i ++)
{
__route [i] = seq_cities [j ++] ;
}
}
void TwoOpt :: readFrom (std :: istream & __is)
{
__is >> first >> second ;
}
void TwoOpt :: printOn (std :: ostream & __os) const
{
__os << first << ' ' << second ;
}

View file

@ -0,0 +1,36 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "two_opt.h"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef two_opt_h
#define two_opt_h
#include <eoPersistent.h>
#include <utility>
#include <moMove.h>
#include "route.h"
class TwoOpt : public moMove <Route>, public std :: pair <unsigned, unsigned>, public eoPersistent
{
public :
TwoOpt operator ! () const ;
void operator () (Route & __route) ;
void readFrom (std :: istream & __is) ;
void printOn (std :: ostream & __os) const ;
} ;
#endif

View file

@ -0,0 +1,28 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "TwoOptIncrEval.cpp"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include "two_opt_incr_eval.h"
#include "graph.h"
float TwoOptIncrEval :: operator () (const TwoOpt & __move, const Route & __route)
{
// From
unsigned int v1 = __route [__move.first], v1_next = __route [__move.first + 1] ;
// To
unsigned int v2 = __route [__move.second], v2_next = __route [__move.second + 1] ;
return __route.fitness ()
- Graph :: distance (v1, v2)
- Graph :: distance (v1_next, v2_next)
+ Graph :: distance (v1, v1_next)
+ Graph :: distance (v2, v2_next) ;
}

View file

@ -0,0 +1,27 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "TwoOptIncrEval.h"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef two_optincr_eval_h
#define two_optincr_eval_h
#include <moMoveIncrEval.h>
#include "two_opt.h"
class TwoOptIncrEval : public moMoveIncrEval <TwoOpt>
{
public :
float operator () (const TwoOpt & __move, const Route & __route) ;
} ;
#endif

View file

@ -0,0 +1,18 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "two_opt_init.cpp"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include "two_opt_init.h"
void TwoOptInit :: operator () (TwoOpt & __move, const Route & __route)
{
__move.first = 0 ;
__move.second = 2 ;
}

View file

@ -0,0 +1,29 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "two_opt_init.h"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef two_opt_init_h
#define two_opt_init_h
#include <moMoveInit.h>
#include "two_opt.h"
/** It sets the first couple of edges */
class TwoOptInit : public moMoveInit <TwoOpt>
{
public :
void operator () (TwoOpt & __move, const Route & __route) ;
} ;
#endif

View file

@ -0,0 +1,32 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "two_opt_next.cpp"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include "two_opt_next.h"
#include "graph.h"
bool TwoOptNext :: operator () (TwoOpt & __move, const Route & __route)
{
if (__move.first == Graph :: size () - 4 && __move.second == __move.first + 2)
{
return false ;
}
else
{
__move.second ++ ;
if (__move.second == Graph :: size () - 1)
{
__move.first ++ ;
__move.second = __move.first + 2 ;
}
return true ;
}
}

View file

@ -0,0 +1,28 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "two_opt_next.h"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef two_opt_next_h
#define two_opt_next_h
#include <moNextMove.h>
#include "two_opt.h"
/** It updates a couple of edges */
class TwoOptNext : public moNextMove <TwoOpt>
{
public :
bool operator () (TwoOpt & __move, const Route & __route) ;
} ;
#endif

View file

@ -0,0 +1,20 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "two_opt_rand.cpp"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include "two_opt_rand.h"
#include "graph.h"
#include <utils/eoRNG.h>
void TwoOptRand :: operator () (TwoOpt & __move)
{
__move.first = rng.random (Graph :: size () - 3) ;
__move.second = __move.first + 2 + rng.random (Graph :: size () - __move.first - 3) ;
}

View file

@ -0,0 +1,28 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "two_opt_rand.h"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef two_opt_rand_h
#define two_opt_rand_h
#include <moRandMove.h>
#include "two_opt.h"
class TwoOptRand : public moRandMove <TwoOpt>
{
public :
void operator () (TwoOpt & __move) ;
} ;
#endif

View file

@ -0,0 +1,58 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "two_opt_tabu_list.cpp"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#include "two_opt_tabu_list.h"
#include "graph.h"
#define TABU_LENGTH 10
void TwoOptTabuList :: init ()
{
// Size (eventually)
tabu_span.resize (Graph :: size ()) ;
for (unsigned int i = 0 ; i < tabu_span.size () ; i ++)
{
tabu_span [i].resize (Graph :: size ()) ;
}
// Clear
for (unsigned int i = 0 ; i < tabu_span.size () ; i ++)
{
for (unsigned int j = 0 ; j < tabu_span [i].size () ; j ++)
{
tabu_span [i] [j] = 0 ;
}
}
}
bool TwoOptTabuList :: operator () (const TwoOpt & __move, const Route & __sol)
{
return tabu_span [__move.first] [__move.second] > 0 ;
}
void TwoOptTabuList :: add (const TwoOpt & __move, const Route & __sol)
{
tabu_span [__move.first] [__move.second] = tabu_span [__move.second] [__move.first] = TABU_LENGTH ;
}
void TwoOptTabuList :: update ()
{
for (unsigned int i = 0 ; i < tabu_span.size () ; i ++)
{
for (unsigned int j = 0 ; j < tabu_span [i].size () ; j ++)
{
if (tabu_span [i] [j] > 0)
{
tabu_span [i] [j] -- ;
}
}
}
}

View file

@ -0,0 +1,38 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
// "two_opt_tabu_list.h"
// (c) OPAC Team, LIFL, 2003-2006
/* LICENCE TEXT
Contact: paradiseo-help@lists.gforge.inria.fr
*/
#ifndef two_opt_tabu_list_h
#define two_opt_tabu_list_h
#include <moTabuList.h>
#include "two_opt.h"
#include "route.h"
/** The table of tabu movements, i.e. forbidden edges */
class TwoOptTabuList : public moTabuList <TwoOpt>
{
public :
bool operator () (const TwoOpt & __move, const Route & __sol) ;
void add (const TwoOpt & __move, const Route & __sol) ;
void update () ;
void init () ;
private :
std :: vector <std :: vector <unsigned> > tabu_span ;
} ;
#endif