new architecture

git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@510 331e1502-861f-0410-8da2-ba01fb791d7f
This commit is contained in:
liefooga 2007-07-04 14:00:17 +00:00
commit b37b5887f6
34 changed files with 130 additions and 146 deletions

View file

@ -0,0 +1,134 @@
######################################################################################
### 1) Include the sources
######################################################################################
INCLUDE_DIRECTORIES(${EO_SRC_DIR})
INCLUDE_DIRECTORIES(${MOEO_SRC_DIR})
######################################################################################
######################################################################################
### 2) Specify where CMake can find the libraries (mandatory: before 3) )
######################################################################################
# --> UNIX
IF(UNIX)
LINK_DIRECTORIES(${EO_SRC_DIR} ${EO_SRC_DIR}/utils ${MOEO_DIR}/build)
# --> WIN
ELSEIF(WIN32)
# "CMAKE_BUILD_TYPE" supposed to be given on the command line, default=Debug
IF (NOT DEFINED CMAKE_BUILD_TYPE)
set (CMAKE_BUILD_TYPE Debug)
ENDIF (NOT DEFINED CMAKE_BUILD_TYPE)
IF (CMAKE_BUILD_TYPE STREQUAL Debug)
LINK_DIRECTORIES(${MOEO_DIR}\\build\\debug)
LINK_DIRECTORIES(${EO_LIB_DIR}\\debug)
ELSEIF(CMAKE_BUILD_TYPE STREQUAL Release)
LINK_DIRECTORIES(${MOEO_DIR}\\build\\release)
LINK_DIRECTORIES(${EO_LIB_DIR}\\release)
ENDIF(CMAKE_BUILD_TYPE STREQUAL Debug)
ENDIF(UNIX)
######################################################################################
######################################################################################
### 3) Define your target(s): just the flowshop lib here
######################################################################################
SET(FLOWSHOP_LIB_OUTPUT_PATH ${TUTORIAL_LESSON1_DIR}/build)
SET(LIBRARY_OUTPUT_PATH ${FLOWSHOP_LIB_OUTPUT_PATH})
SET (FLOWSHOP_SOURCES FlowShopBenchmarkParser.cpp
FlowShopEval.cpp
FlowShopInit.cpp
FlowShopObjectiveVectorTraits.cpp
FlowShopOpCrossoverQuad.cpp
FlowShopOpMutationExchange.cpp
FlowShopOpMutationShift.cpp
FlowShop.cpp)
# --> UNIX
IF(UNIX)
ADD_LIBRARY(flowshop STATIC ${FLOWSHOP_SOURCES})
# --> WIN
ELSEIF(WIN32)
ADD_LIBRARY(flowshop STATIC ${FLOWSHOP_SOURCES})
ADD_DEPENDENCIES(flowshop moeo)
ENDIF(UNIX)
######################################################################################
######################################################################################
### 4) Optionnal: define your target(s)'s version: no effect for windows
######################################################################################
SET(FLOWSHOP_VERSION "1.0.beta")
SET_TARGET_PROPERTIES(flowshop PROPERTIES VERSION "${FLOWSHOP_VERSION}")
######################################################################################
######################################################################################
### 5) Link the librairies for your target(s)
######################################################################################
# --> UNIX
IF(UNIX)
TARGET_LINK_LIBRARIES(flowshop moeo)
TARGET_LINK_LIBRARIES(flowshop eo)
# --> APPLE AND WIN
ELSEIF(WIN32)
# "CMAKE_BUILD_TYPE" supposed to be given on the command line, default=Debug
IF (NOT DEFINED CMAKE_BUILD_TYPE)
set (CMAKE_BUILD_TYPE Debug)
ENDIF (NOT DEFINED CMAKE_BUILD_TYPE)
IF (CMAKE_BUILD_TYPE STREQUAL Debug)
TARGET_LINK_LIBRARIES(flowshop moeo)
TARGET_LINK_LIBRARIES(flowshop eod)
ELSEIF(CMAKE_BUILD_TYPE STREQUAL Release)
TARGET_LINK_LIBRARIES(flowshop moeo)
TARGET_LINK_LIBRARIES(flowshop eo)
ELSE(CMAKE_BUILD_TYPE STREQUAL Debug)
MESSAGE(FATAL_ERROR " Cmake build type can only be \"Debug\" or \"Release\" ")
ENDIF(CMAKE_BUILD_TYPE STREQUAL Debug)
ENDIF(UNIX)
######################################################################################
######################################################################################
### 6) Windows advanced config - especially for Microsoft Visual Studio 8
######################################################################################
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)
######################################################################################

View file

@ -0,0 +1,18 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// FlowShop.cpp
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#include <FlowShop.h>
std::string FlowShop::className() const
{
return "FlowShop";
}

View file

@ -0,0 +1,33 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// FlowShop.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef FLOWSHOP_H_
#define FLOWSHOP_H_
#include <core/moeoVector.h>
#include <FlowShopObjectiveVector.h>
/**
* Structure of the genotype for the flow-shop scheduling problem: a vector of unsigned int int.
*/
class FlowShop: public moeoVector < FlowShopObjectiveVector , double , double , unsigned int >
{
public:
/**
* class name
*/
std::string className() const;
};
#endif /*FLOWSHOP_H_*/

View file

@ -0,0 +1,101 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// FlowShopBenchmarkParser.cpp
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#include <stdexcept>
#include <FlowShopBenchmarkParser.h>
FlowShopBenchmarkParser::FlowShopBenchmarkParser(const std::string _benchmarkFileName)
{
init(_benchmarkFileName);
}
const unsigned int FlowShopBenchmarkParser::getM()
{
return M;
}
const unsigned int FlowShopBenchmarkParser::getN()
{
return N;
}
const std::vector< std::vector<unsigned int> > FlowShopBenchmarkParser::getP()
{
return p;
}
const std::vector<unsigned int> FlowShopBenchmarkParser::getD()
{
return d;
}
void FlowShopBenchmarkParser::printOn(std::ostream & _os) const
{
_os << "M=" << M << " N=" << N << std::endl;
_os << "*** processing times" << std::endl;
for (unsigned int i=0; i<M; i++) {
for (unsigned int j=0; j<N; j++) {
_os << p[i][j] << " ";
}
_os << std::endl;
}
_os << "*** due-dates" << std::endl;
for (unsigned int j=0; j<N; j++) {
_os << d[j] << " ";
}
_os << std::endl << std::endl;
}
void FlowShopBenchmarkParser::init(const std::string _benchmarkFileName)
{
std::string buffer;
std::string::size_type start, end;
std::ifstream inputFile(_benchmarkFileName.data(), std::ios::in);
// opening of the benchmark file
if (! inputFile)
throw std::runtime_error("*** ERROR : Unable to open the benchmark file");
// number of jobs (N)
getline(inputFile, buffer, '\n');
N = atoi(buffer.data());
// number of machines M
getline(inputFile, buffer, '\n');
M = atoi(buffer.data());
// initial and current seeds (not used)
getline(inputFile, buffer, '\n');
// processing times and due-dates
p = std::vector< std::vector<unsigned int> > (M,N);
d = std::vector<unsigned int> (N);
// for each job...
for (unsigned int j=0 ; j<N ; j++) {
// index of the job (<=> j)
getline(inputFile, buffer, '\n');
// due-date of the job j
getline(inputFile, buffer, '\n');
d[j] = atoi(buffer.data());
// processing times of the job j on each machine
getline(inputFile, buffer, '\n');
start = buffer.find_first_not_of(" ");
for (unsigned int i=0 ; i<M ; i++) {
end = buffer.find_first_of(" ", start);
p[i][j] = atoi(buffer.substr(start, end-start).data());
start = buffer.find_first_not_of(" ", end);
}
}
// closing of the input file
inputFile.close();
}

View file

@ -0,0 +1,84 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// FlowShopBenchmarkParser.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef FLOWSHOPBENCHMARKPARSER_H_
#define FLOWSHOPBENCHMARKPARSER_H_
#include <fstream>
#include <string>
#include <vector>
/**
* Class to handle parameters of a flow-shop instance from a benchmark file
*/
class FlowShopBenchmarkParser
{
public:
/**
* Ctor
* @param _benchmarkFileName the name of the benchmark file
*/
FlowShopBenchmarkParser(const std::string _benchmarkFileName);
/**
* the number of machines
*/
const unsigned int getM();
/**
* the number of jobs
*/
const unsigned int getN();
/**
* the processing times
*/
const std::vector < std::vector < unsigned int > > getP();
/**
* the due-dates
*/
const std::vector < unsigned int > getD();
/**
* printing...
*/
void printOn(std::ostream & _os) const;
private:
/** number of machines */
unsigned int M;
/** number of jobs */
unsigned int N;
/** p[i][j] = processing time of job j on machine i */
std::vector < std::vector < unsigned int > > p;
/** d[j] = due-date of the job j */
std::vector < unsigned int > d;
/**
* Initialisation of the parameters with the data contained in the benchmark file
* @param _benchmarkFileName the name of the benchmark file
*/
void init(const std::string _benchmarkFileName);
};
#endif /*FLOWSHOPBENCHMARKPARSER_H_*/

View file

@ -0,0 +1,64 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// FlowShopEval.cpp
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#include <FlowShopEval.h>
FlowShopEval::FlowShopEval(unsigned int _M, unsigned int _N, const std::vector< std::vector<unsigned int> > & _p, const std::vector<unsigned int> & _d) :
M(_M), N (_N), p(_p), d(_d)
{}
void FlowShopEval::operator()(FlowShop & _flowshop)
{
FlowShopObjectiveVector objVector;
objVector[0] = makespan(_flowshop);
objVector[1] = tardiness(_flowshop);
_flowshop.objectiveVector(objVector);
}
double FlowShopEval::makespan(const FlowShop & _flowshop)
{
// completion times computation for each job on each machine
// C[i][j] = completion of the jth job of the scheduling on the ith machine
std::vector< std::vector<unsigned int> > C = completionTime(_flowshop);
return C[M-1][_flowshop[N-1]];
}
double FlowShopEval::tardiness(const FlowShop & _flowshop)
{
// completion times computation for each job on each machine
// C[i][j] = completion of the jth job of the scheduling on the ith machine
std::vector< std::vector<unsigned int> > C = completionTime(_flowshop);
// tardiness computation
unsigned int long sum = 0;
for (unsigned int j=0 ; j<N ; j++)
sum += (unsigned int) std::max (0, (int) (C[M-1][_flowshop[j]] - d[_flowshop[j]]));
return sum;
}
std::vector< std::vector<unsigned int> > FlowShopEval::completionTime(const FlowShop & _flowshop) {
std::vector< std::vector<unsigned int> > C(M,N);
C[0][_flowshop[0]] = p[0][_flowshop[0]];
for (unsigned int j=1; j<N; j++)
C[0][_flowshop[j]] = C[0][_flowshop[j-1]] + p[0][_flowshop[j]];
for (unsigned int i=1; i<M; i++)
C[i][_flowshop[0]] = C[i-1][_flowshop[0]] + p[i][_flowshop[0]];
for (unsigned int i=1; i<M; i++)
for (unsigned int j=1; j<N; j++)
C[i][_flowshop[j]] = std::max(C[i][_flowshop[j-1]], C[i-1][_flowshop[j]]) + p[i][_flowshop[j]];
return C;
}

View file

@ -0,0 +1,79 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// FlowShopEval.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef FLOWSHOPEVAL_H_
#define FLOWSHOPEVAL_H_
#include <vector>
#include <core/moeoEvalFunc.h>
#include <FlowShop.h>
/**
* Evaluation of the objective vector a (multi-objective) FlowShop object
*/
class FlowShopEval : public moeoEvalFunc<FlowShop>
{
public:
/**
* Ctor
* @param _M the number of machines
* @param _N the number of jobs to schedule
* @param _p the processing times
* @param _d the due dates
*/
FlowShopEval(unsigned int _M, unsigned int _N, const std::vector< std::vector<unsigned int> > & _p, const std::vector<unsigned int> & _d);
/**
* computation of the multi-objective evaluation of a FlowShop object
* @param _flowshop the FlowShop object to evaluate
*/
void operator()(FlowShop & _flowshop);
private:
/** number of machines */
unsigned int M;
/** number of jobs */
unsigned int N;
/** p[i][j] = processing time of job j on machine i */
std::vector< std::vector < unsigned int > > p;
/** d[j] = due-date of the job j */
std::vector < unsigned int > d;
/**
* computation of the makespan
* @param _flowshop the genotype to evaluate
*/
double makespan(const FlowShop & _flowshop);
/**
* computation of the tardiness
* @param _flowshop the genotype to evaluate
*/
double tardiness(const FlowShop & _flowshop);
/**
* computation of the completion times of a scheduling (for each job on each machine)
* C[i][j] = completion of the jth job of the scheduling on the ith machine
* @param _flowshop the genotype to evaluate
*/
std::vector< std::vector<unsigned int> > completionTime (const FlowShop & _flowshop);
};
#endif /*FLOWSHOPEVAL_H_*/

View file

@ -0,0 +1,39 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// FlowShopInit.cpp
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#include <FlowShopInit.h>
FlowShopInit::FlowShopInit(unsigned int _N) : N(_N)
{}
void FlowShopInit::operator()(FlowShop & _flowshop)
{
// scheduling vector
std::vector<unsigned int> scheduling(N);
// initialisation of possible values
std::vector<unsigned int> possibles(N);
for (unsigned int i=0 ; i<N ; i++)
possibles[i] = i;
// random initialization
unsigned int rInd; // random index
for (unsigned int i=0; i<N; i++)
{
rInd = (unsigned int) rng.uniform(N-i);
scheduling[i] = possibles[rInd];
possibles[rInd] = possibles[N-i-1];
}
_flowshop.resize(N);
_flowshop.value(scheduling);
_flowshop.invalidate(); // IMPORTANT in case the _genotype is old
}

View file

@ -0,0 +1,47 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// FlowShopInit.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef FLOWSHOPINIT_H_
#define FLOWSHOPINIT_H_
#include <eoInit.h>
#include <FlowShop.h>
/**
* Initialization of a random genotype built by the default constructor of the FlowShop class
*/
class FlowShopInit : public eoInit<FlowShop>
{
public:
/**
* Ctor
* @param _N the number of jobs to schedule
*/
FlowShopInit(unsigned int _N);
/**
* builds a random genotype
* @param _flowshop a genotype that has been default-constructed
*/
void operator()(FlowShop & _flowshop);
private:
/** the number of jobs (size of a scheduling vector) */
unsigned int N;
};
#endif /*FLOWSHOPINIT_H_*/

View file

@ -0,0 +1,24 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// FlowShopObjectiveVector.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef FLOWSHOPOBJECTIVEVECTOR_H_
#define FLOWSHOPOBJECTIVEVECTOR_H_
#include <core/moeoRealObjectiveVector.h>
#include <FlowShopObjectiveVectorTraits.h>
/**
* Definition of the objective vector for multi-objective flow-shop problems: a vector of doubles
*/
typedef moeoRealObjectiveVector < FlowShopObjectiveVectorTraits > FlowShopObjectiveVector;
#endif /*FLOWSHOPOBJECTIVEVECTOR_H_*/

View file

@ -0,0 +1,27 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// FlowShopObjectiveVectorTraits.cpp
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#include <FlowShopObjectiveVectorTraits.h>
bool FlowShopObjectiveVectorTraits::minimizing (int _i)
{
// minimizing both
return true;
}
unsigned int FlowShopObjectiveVectorTraits::nObjectives ()
{
// 2 objectives
return 2;
}

View file

@ -0,0 +1,39 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// FlowShopObjectiveVectorTraits.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef FLOWSHOPOBJECTIVEVECTORTRAITS_H_
#define FLOWSHOPOBJECTIVEVECTORTRAITS_H_
#include <core/moeoObjectiveVectorTraits.h>
/**
* Definition of the objective vector traits for multi-objective flow-shop problems
*/
class FlowShopObjectiveVectorTraits : public moeoObjectiveVectorTraits
{
public:
/**
* Returns true if the _ith objective have to be minimzed
* @param _i index of the objective
*/
static bool minimizing (int _i);
/**
* Returns the number of objectives
*/
static unsigned int nObjectives ();
};
#endif /*FLOWSHOPOBJECTIVEVECTORTRAITS_H_*/

View file

@ -0,0 +1,84 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// FlowShopOpCrossoverQuad.cpp
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#include <FlowShopOpCrossoverQuad.h>
std::string FlowShopOpCrossoverQuad::className() const
{
return "FlowShopOpCrossoverQuad";
}
bool FlowShopOpCrossoverQuad::operator()(FlowShop & _flowshop1, FlowShop & _flowshop2)
{
bool oneAtLeastIsModified;
// computation of the 2 random points
unsigned int point1, point2;
do
{
point1 = rng.random(std::min(_flowshop1.size(), _flowshop2.size()));
point2 = rng.random(std::min(_flowshop1.size(), _flowshop2.size()));
} while (fabs((double) point1-point2) <= 2);
// computation of the offspring
FlowShop offspring1 = generateOffspring(_flowshop1, _flowshop2, point1, point2);
FlowShop offspring2 = generateOffspring(_flowshop2, _flowshop1, point1, point2);
// does at least one genotype has been modified ?
if ((_flowshop1 != offspring1) || (_flowshop2 != offspring2))
{
// update
_flowshop1.value(offspring1);
_flowshop2.value(offspring2);
// at least one genotype has been modified
oneAtLeastIsModified = true;
}
else
{
// no genotype has been modified
oneAtLeastIsModified = false;
}
// return 'true' if at least one genotype has been modified
return oneAtLeastIsModified;
}
FlowShop FlowShopOpCrossoverQuad::generateOffspring(const FlowShop & _parent1, const FlowShop & _parent2, unsigned int _point1, unsigned int _point2)
{
FlowShop result = _parent1;
std::vector<bool> taken_values(result.size(), false);
if (_point1 > _point2)
std::swap(_point1, _point2);
/* first parent */
for (unsigned int i=0 ; i<=_point1 ; i++)
{
// result[i] == _parent1[i]
taken_values[_parent1[i]] = true;
}
for (unsigned int i=_point2 ; i<result.size() ; i++)
{
// result[i] == _parent1[i]
taken_values[_parent1[i]] = true;
}
/* second parent */
unsigned int i = _point1+1;
unsigned int j = 0;
while (i<_point2 && j<_parent2.size())
{
if (! taken_values[_parent2[j]])
{
result[i] = _parent2[j];
i++;
}
j++;
}
return result;
}

View file

@ -0,0 +1,53 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// FlowShopOpCrossoverQuad.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef FLOWSHOPOPCROSSOVERQUAD_H_
#define FLOWSHOPOPCROSSOVERQUAD_H_
#include <eoOp.h>
#include <FlowShop.h>
/**
* Quadratic crossover operator for flow-shop (modify the both genotypes)
*/
class FlowShopOpCrossoverQuad : public eoQuadOp < FlowShop >
{
public:
/**
* the class name (used to display statistics)
*/
std::string className() const;
/**
* eoQuad crossover - _flowshop1 and _flowshop2 are the (future) offspring, i.e. _copies_ of the parents
* @param _flowshop1 the first parent
* @param _flowshop2 the second parent
*/
bool operator()(FlowShop & _flowshop1, FlowShop & _flowshop2);
private:
/**
* generation of an offspring by a 2 points crossover
* @param _parent1 the first parent
* @param _parent2 the second parent
* @param _point1 the first point
* @param _point2 the second point
*/
FlowShop generateOffspring(const FlowShop & _parent1, const FlowShop & _parent2, unsigned int _point1, unsigned int _point2);
};
#endif /*FLOWSHOPOPCROSSOVERQUAD_H_*/

View file

@ -0,0 +1,50 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// FlowShopOpCrossoverQuad.cpp
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#include <FlowShopOpMutationExchange.h>
std::string FlowShopOpMutationExchange::className() const
{
return "FlowShopOpMutationExchange";
}
bool FlowShopOpMutationExchange::operator()(FlowShop & _flowshop)
{
bool isModified;
FlowShop result = _flowshop;
// computation of the 2 random points
unsigned int point1, point2;
do
{
point1 = rng.random(result.size());
point2 = rng.random(result.size());
} while (point1 == point2);
// swap
std::swap (result[point1], result[point2]);
// update (if necessary)
if (result != _flowshop)
{
// update
_flowshop.value(result);
// the genotype has been modified
isModified = true;
}
else
{
// the genotype has not been modified
isModified = false;
}
// return 'true' if the genotype has been modified
return isModified;
}

View file

@ -0,0 +1,40 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// FlowShopOpCrossoverQuad.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef FLOWSHOPOPMUTATIONEXCHANGE_H_
#define FLOWSHOPOPMUTATIONEXCHANGE_H_
#include <eoOp.h>
#include <FlowShop.h>
/**
* Exchange mutation operator for the flow-shop
*/
class FlowShopOpMutationExchange : public eoMonOp<FlowShop>
{
public:
/**
* the class name (used to display statistics)
*/
std::string className() const;
/**
* modifies the parent with an exchange mutation
* @param _flowshop the parent genotype (will be modified)
*/
bool operator()(FlowShop & _flowshop);
};
#endif /*FLOWSHOPOPMUTATIONEXCHANGE_H_*/

View file

@ -0,0 +1,60 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// FlowShopOpMutationShift.cpp
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#include <FlowShopOpMutationShift.h>
std::string FlowShopOpMutationShift::className() const
{
return "FlowShopOpMutationShift";
}
bool FlowShopOpMutationShift::operator()(FlowShop & _flowshop)
{
bool isModified;
int direction;
unsigned int tmp;
FlowShop result = _flowshop;
// computation of the 2 random points
unsigned int point1, point2;
do
{
point1 = rng.random(result.size());
point2 = rng.random(result.size());
} while (point1 == point2);
// direction
if (point1 < point2)
direction = 1;
else
direction = -1;
// mutation
tmp = result[point1];
for (unsigned int i=point1 ; i!=point2 ; i+=direction)
result[i] = result[i+direction];
result[point2] = tmp;
// update (if necessary)
if (result != _flowshop)
{
// update
_flowshop.value(result);
// the genotype has been modified
isModified = true;
}
else
{
// the genotype has not been modified
isModified = false;
}
// return 'true' if the genotype has been modified
return isModified;
}

View file

@ -0,0 +1,40 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// FlowShopOpMutationShift.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef FLOWSHOPOPMUTATIONSHIFT_H_
#define FLOWSHOPOPMUTATIONSHIFT_H_
#include <eoOp.h>
#include <FlowShop.h>
/**
* Shift mutation operator for flow-shop
*/
class FlowShopOpMutationShift : public eoMonOp < FlowShop >
{
public:
/**
* the class name (used to display statistics)
*/
std::string className() const;
/**
* modifies the parent with a shift mutation
* @param _flowshop the parent genotype (will be modified)
*/
bool operator()(FlowShop & _flowshop);
};
#endif /*FLOWSHOPOPMUTATIONSHIFT_H_*/

View file

@ -0,0 +1,63 @@
20
5
873654221
0
468
54 79 16 66 58
1
325
83 3 89 58 56
2
923
15 11 49 31 20
3
513
71 99 15 68 85
4
1070
77 56 89 78 53
5
690
36 70 45 91 35
6
602
53 99 60 13 53
7
289
38 60 23 59 41
8
873
27 5 57 49 69
9
342
87 56 64 85 13
10
764
76 3 7 85 86
11
268
91 61 1 9 72
12
1158
14 73 63 39 8
13
646
29 75 41 41 49
14
1111
12 47 63 56 47
15
965
77 14 47 40 87
16
703
32 21 26 54 58
17
1205
87 86 75 77 18
18
334
68 5 77 51 68
19
1111
94 77 40 31 28

View file

@ -0,0 +1,63 @@
20
5
379008056
0
517
26 59 78 88 69
1
461
38 62 90 54 30
2
832
27 44 64 47 61
3
653
88 10 49 83 35
4
933
95 23 47 84 53
5
811
55 64 20 9 98
6
966
54 47 61 30 94
7
448
63 68 93 11 33
8
577
23 54 36 92 77
9
1122
45 9 47 63 31
10
666
86 30 70 62 54
11
1189
43 31 54 75 71
12
470
43 92 87 48 78
13
475
40 7 13 23 9
14
462
37 14 40 85 79
15
866
54 95 34 23 51
16
392
35 76 55 4 76
17
310
59 82 13 31 56
18
719
43 91 11 13 80
19
1221
50 37 5 98 72

Some files were not shown because too many files have changed in this diff Show more