Update for windows compatibility

git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@359 331e1502-861f-0410-8da2-ba01fb791d7f
This commit is contained in:
jboisson 2007-06-25 15:44:52 +00:00
commit f9693d1e1c
229 changed files with 3759 additions and 2398 deletions

View file

@ -18,95 +18,111 @@
#define MAXINT 1000000
void EdgeXover :: build_map (const Route & __par1, const Route & __par2) {
void
EdgeXover :: build_map (const Route & __par1, const Route & __par2)
{
unsigned len = __par1.size () ;
unsigned int len = __par1.size () ;
/* Initialization */
_map.clear () ;
_map.resize (len) ;
for (unsigned 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]) ;
}
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 __vertex, std :: vector <std :: set <unsigned> > & __map) {
void
EdgeXover :: remove_entry (unsigned int __vertex, std :: vector <std :: set <unsigned int> > & __map)
{
std :: set <unsigned> & neigh = __map [__vertex] ;
std :: set <unsigned int> & neigh = __map [__vertex] ;
for (std :: set <unsigned> :: iterator it = neigh.begin () ;
it != neigh.end () ;
it ++)
__map [* it].erase (__vertex) ;
for (std :: set <unsigned int> :: iterator it = neigh.begin () ; it != neigh.end () ; it ++)
{
__map [* it].erase (__vertex) ;
}
}
void EdgeXover :: add_vertex (unsigned __vertex, Route & __child) {
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) {
void
EdgeXover :: cross (const Route & __par1, const Route & __par2, Route & __child) {
build_map (__par1, __par2) ;
unsigned len = __par1.size () ;
unsigned int len = __par1.size () ;
/* Go ! */
__child.clear () ;
unsigned cur_vertex = rng.random (len) ;
unsigned int cur_vertex = rng.random (len) ;
add_vertex (cur_vertex, __child) ;
for (unsigned i = 1 ; i < len ; i ++) {
for (unsigned int i = 1 ; i < len ; i ++) {
unsigned len_min_entry = MAXINT ;
unsigned int len_min_entry = MAXINT ;
std :: set <unsigned> & neigh = _map [cur_vertex] ;
std :: set <unsigned int> & neigh = _map [cur_vertex] ;
for (std :: set <unsigned> :: iterator it = neigh.begin () ;
it != neigh.end () ;
it ++) {
unsigned l = _map [* it].size () ;
if (len_min_entry > l)
len_min_entry = l ;
}
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> cand ; /* Candidates */
std :: vector <unsigned int> cand ; /* Candidates */
for (std :: set <unsigned> :: iterator it = neigh.begin () ;
it != neigh.end () ;
it ++) {
unsigned l = _map [* it].size () ;
if (len_min_entry == l)
cand.push_back (* it) ;
}
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 j = 0 ; j < len ; j ++)
if (! visited [j])
cand.push_back (j) ;
}
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) {
bool
EdgeXover :: operator () (Route & __route1, Route & __route2)
{
// Init. copy
Route par [2] ;

View file

@ -20,7 +20,8 @@
#include "route.h"
/** Edge Crossover */
class EdgeXover : public eoQuadOp <Route> {
class EdgeXover : public eoQuadOp <Route>
{
public :
@ -30,14 +31,14 @@ private :
void cross (const Route & __par1, const Route & __par2, Route & __child) ; /* Binary */
void remove_entry (unsigned __vertex, std :: vector <std :: set <unsigned> > & __map) ;
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 __vertex, Route & __child) ;
void add_vertex (unsigned int __vertex, Route & __child) ;
std :: vector <std :: set <unsigned> > _map ; /* The handled map */
std :: vector <std :: set <unsigned int> > _map ; /* The handled map */
std :: vector <bool> visited ; /* Vertices that are already visited */

View file

@ -19,61 +19,71 @@ namespace Graph {
static std :: vector <std :: pair <double, double> > vectCoord ; // Coordinates
static std :: vector <std :: vector <unsigned> > dist ; // Distances Mat.
static std :: vector <std :: vector <unsigned int> > dist ; // Distances Mat.
unsigned size () {
unsigned size ()
{
return dist.size () ;
}
void computeDistances () {
void computeDistances ()
{
// Dim.
unsigned numCities = vectCoord.size () ;
unsigned int numCities = vectCoord.size () ;
dist.resize (numCities) ;
for (unsigned i = 0 ; i < dist.size () ; i ++)
dist [i].resize (numCities) ;
for (unsigned int i = 0 ; i < dist.size () ; i ++)
{
dist [i].resize (numCities) ;
}
// Computations.
for (unsigned i = 0 ; i < dist.size () ; i ++)
for (unsigned j = i + 1 ; j < dist.size () ; j ++) {
double distX = vectCoord [i].first - vectCoord [j].first ;
double distY = vectCoord [i].second - vectCoord [j].second ;
dist [i] [j] = dist [j] [i] = (unsigned) (sqrt ((float) (distX * distX + distY * distY)) + 0.5) ;
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) {
void load (const char * __fileName)
{
std :: ifstream f (__fileName) ;
std :: cout << ">> Loading [" << __fileName << "]" << std :: endl ;
if (f) {
unsigned num_vert ;
f >> num_vert ;
vectCoord.resize (num_vert) ;
for (unsigned i = 0 ; i < num_vert ; i ++)
f >> vectCoord [i].first >> vectCoord [i].second ;
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) ;
}
f.close () ;
computeDistances () ;
}
else
{
std :: cout << __fileName << " doesn't exist !!!" << std :: endl ;
// Bye !!!
exit (1) ;
}
}
float distance (unsigned __from, unsigned __to) {
return dist [__from] [__to] ;
float distance (unsigned int __from, unsigned int __to)
{
return (float)(dist [__from] [__to]) ;
}
}

View file

@ -15,16 +15,16 @@
#include <vector>
#include <utility>
namespace Graph {
namespace Graph
{
void load (const char * __file_name) ;
/* Loading cities
(expressed by their coordinates)
from the given file name */
float distance (unsigned __from, unsigned __to) ;
float distance (unsigned int __from, unsigned int __to) ;
unsigned size () ; // How many cities ?
unsigned int size () ; // How many cities ?
}
#endif

View file

@ -14,10 +14,12 @@
#include <utils/eoRNG.h>
template <class T> void mix (std :: vector <T> & __vect) {
for (unsigned i = 0 ; i < __vect.size () ; i ++)
std :: swap (__vect [i], __vect [rng.random (__vect.size ())]) ;
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

@ -10,43 +10,46 @@
*/
#include <assert.h>
#include <vector.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) {
void OrderXover :: cross (const Route & __par1, const Route & __par2, Route & __child)
{
unsigned cut = rng.random (__par1.size ()) ;
unsigned int cut = rng.random (__par1.size ()) ;
/* To store vertices that have
already been crossed */
vector<bool> v;
std::vector<bool> v;
v.resize(__par1.size());
for (unsigned i = 0 ; i < __par1.size () ; i ++)
for (unsigned int i = 0 ; i < __par1.size () ; i ++)
{
v [i] = false ;
}
/* Copy of the left partial
route of the first parent */
for (unsigned i = 0 ; i < cut ; i ++) {
__child [i] = __par1 [i] ;
v [__par1 [i]] = true ;
}
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 from = 0 ;
for (unsigned i = 0 ; i < __par2.size () ; i ++)
unsigned int from = 0 ;
for (unsigned int i = 0 ; i < __par2.size () ; i ++)
{
if (__par2 [i] == __child [cut - 1]) {
from = i ;
break ;
}
if (__par2 [i] == __child [cut - 1])
{
from = i ;
break ;
}
}
/* Selecting a direction
@ -55,11 +58,11 @@ void OrderXover :: cross (const Route & __par1, const Route & __par2, Route & __
/* Copy of the left vertices from
the second parent path */
unsigned l = cut ;
unsigned int l = cut ;
for (unsigned i = 0 ; i < __par2.size () ; i ++)
for (unsigned int i = 0 ; i < __par2.size () ; i ++)
{
unsigned bidule /* :-) */ = (direct * i + from + __par2.size ()) % __par2.size () ;
unsigned int bidule /* :-) */ = (direct * i + from + __par2.size ()) % __par2.size () ;
if (! v [__par2 [bidule]])
{
__child [l ++] = __par2 [bidule] ;
@ -70,7 +73,8 @@ void OrderXover :: cross (const Route & __par1, const Route & __par2, Route & __
v.clear();
}
bool OrderXover :: operator () (Route & __route1, Route & __route2) {
bool OrderXover :: operator () (Route & __route1, Route & __route2)
{
// Init. copy
Route par [2] ;

View file

@ -17,12 +17,13 @@
#include "route.h"
/** Order Crossover */
class OrderXover : public eoQuadOp <Route> {
class OrderXover : public eoQuadOp <Route>
{
public :
bool operator () (Route & __route1, Route & __route2) ;
private :
void cross (const Route & __par1, const Route & __par2, Route & __child) ;

View file

@ -12,22 +12,16 @@
#include "part_route_eval.h"
#include "graph.h"
PartRouteEval :: PartRouteEval (float __from,
float __to
) : from (__from),
to (__to) {
}
PartRouteEval :: PartRouteEval (float __from, float __to) : from (__from), to (__to) {}
void PartRouteEval :: operator () (Route & __route) {
void PartRouteEval :: operator () (Route & __route)
{
float len = 0 ;
for (unsigned i = (unsigned) (__route.size () * from) ;
i < (unsigned) (__route.size () * to) ;
i ++)
len -= Graph :: distance (__route [i], __route [(i + 1) % Graph :: size ()]) ;
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

@ -17,19 +17,20 @@
#include "route.h"
/** Route Evaluator */
class PartRouteEval : public eoEvalFunc <Route> {
class PartRouteEval : public eoEvalFunc <Route>
{
public :
/** Constructor */
PartRouteEval (float __from, float __to) ;
void operator () (Route & __route) ;
private :
float from, to ;
} ;

View file

@ -13,8 +13,8 @@
#include "part_two_opt_init.h"
void PartTwoOptInit :: operator () (TwoOpt & __move, const Route & __route) {
void PartTwoOptInit :: operator () (TwoOpt & __move, const Route & __route)
{
__move.first = rng.random (__route.size () - 6) ;
__move.second = __move.first + 2 ;
}

View file

@ -17,7 +17,8 @@
#include "two_opt.h"
/** It sets the first couple of edges */
class PartTwoOptInit : public moMoveInit <TwoOpt> {
class PartTwoOptInit : public moMoveInit <TwoOpt>
{
public :

View file

@ -12,19 +12,21 @@
#include "part_two_opt_next.h"
#include "graph.h"
bool TwoOptNext :: operator () (TwoOpt & __move, const Route & __route) {
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 false ;
}
else
{
__move.second ++ ;
if (__move.second == Graph :: size () - 1)
{
__move.first ++ ;
__move.second = __move.first + 2 ;
}
return true ;
}
return true ;
}
}

View file

@ -16,8 +16,9 @@
#include "two_opt.h"
/** It updates a couple of edges */
class PartTwoOptNext : public moNextMove <TwoOpt> {
class PartTwoOptNext : public moNextMove <TwoOpt>
{
public :
bool operator () (TwoOpt & __move, const Route & __route) ;

View file

@ -11,7 +11,7 @@
#include <assert.h>
#include <vector.h>
#include <vector>
#include <utils/eoRNG.h>
@ -19,25 +19,26 @@
#include "route_valid.h"
#include "mix.h"
void PartialMappedXover :: repair (Route & __route, unsigned __cut1, unsigned __cut2) {
void PartialMappedXover :: repair (Route & __route, unsigned __cut1, unsigned __cut2)
{
std::vector<unsigned int> v; // Number of times a cities are visited ...
vector<unsigned> v; // Number of times a cities are visited ...
v.resize(__route.size ());
for (unsigned i = 0 ; i < __route.size () ; i ++)
for (unsigned int i = 0 ; i < __route.size () ; i ++)
{
v [i] = 0 ;
}
for (unsigned i = 0 ; i < __route.size () ; i ++)
for (unsigned int i = 0 ; i < __route.size () ; i ++)
{
v [__route [i]] ++ ;
}
std :: vector <unsigned> vert ;
std :: vector <unsigned int> vert ;
for (unsigned i = 0 ; i < __route.size () ; i ++)
for (unsigned int i = 0 ; i < __route.size () ; i ++)
{
if (! v [i])
{
@ -47,7 +48,7 @@ void PartialMappedXover :: repair (Route & __route, unsigned __cut1, unsigned __
mix (vert) ;
for (unsigned i = 0 ; i < __route.size () ; i ++)
for (unsigned int i = 0 ; i < __route.size () ; i ++)
{
if (i < __cut1 || i >= __cut2)
{
@ -62,16 +63,20 @@ void PartialMappedXover :: repair (Route & __route, unsigned __cut1, unsigned __
v.clear();
}
bool PartialMappedXover :: operator () (Route & __route1, Route & __route2) {
unsigned cut1 = rng.random (__route1.size ()), cut2 = rng.random (__route2.size ()) ;
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) ;
{
std :: swap (cut1, cut2) ;
}
// Between the cuts
for (unsigned i = cut1 ; i < cut2 ; i ++)
std :: swap (__route1 [i], __route2 [i]) ;
for (unsigned int i = cut1 ; i < cut2 ; i ++)
{
std :: swap (__route1 [i], __route2 [i]) ;
}
// Outside the cuts
repair (__route1, cut1, cut2) ;

View file

@ -14,6 +14,6 @@
#include <eoVector.h>
typedef eoVector <float, unsigned> Route ; // [Fitness (- length), Gene (city)]
typedef eoVector <float, unsigned int> Route ; // [Fitness (- length), Gene (city)]
#endif

View file

@ -12,12 +12,15 @@
#include "route_eval.h"
#include "graph.h"
void RouteEval :: operator () (Route & __route) {
void RouteEval :: operator () (Route & __route)
{
float len = 0 ;
for (unsigned i = 0 ; i < Graph :: size () ; i ++)
len -= Graph :: distance (__route [i], __route [(i + 1) % Graph :: size ()]) ;
for (unsigned int i = 0 ; i < Graph :: size () ; i ++)
{
len -= Graph :: distance (__route [i], __route [(i + 1) % Graph :: size ()]) ;
}
__route.fitness (len) ;
}

View file

@ -17,10 +17,11 @@
#include "route.h"
/** Route Evaluator */
class RouteEval : public eoEvalFunc <Route> {
class RouteEval : public eoEvalFunc <Route>
{
public :
void operator () (Route & __route) ;
} ;

View file

@ -14,21 +14,25 @@
#include "route_init.h"
#include "graph.h"
void RouteInit :: operator () (Route & __route) {
void RouteInit :: operator () (Route & __route)
{
// Init.
__route.clear () ;
for (unsigned i = 0 ; i < Graph :: size () ; i ++)
__route.push_back (i) ;
for (unsigned int i = 0 ; i < Graph :: size () ; i ++)
{
__route.push_back (i) ;
}
// Swap. cities
for (unsigned i = 0 ; i < Graph :: size () ; i ++) {
//unsigned j = rng.random (Graph :: size ()) ;
unsigned j = (unsigned) (Graph :: size () * (rand () / (RAND_MAX + 1.0))) ;
unsigned city = __route [i] ;
__route [i] = __route [j] ;
__route [j] = city ;
}
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

@ -16,7 +16,8 @@
#include "route.h"
class RouteInit : public eoInit <Route> {
class RouteInit : public eoInit <Route>
{
public :

View file

@ -11,24 +11,25 @@
#include "route_valid.h"
#include <vector.h>
#include <vector>
bool valid (Route & __route) {
bool valid (Route & __route)
{
vector<unsigned> t;
std::vector<unsigned int> t;
t.resize(__route.size());
for (unsigned i = 0 ; i < __route.size () ; i ++)
for (unsigned int i = 0 ; i < __route.size () ; i ++)
{
t [i] = 0 ;
}
for (unsigned i = 0 ; i < __route.size () ; i ++)
for (unsigned int i = 0 ; i < __route.size () ; i ++)
{
t [__route [i]] ++ ;
}
for (unsigned i = 0 ; i < __route.size () ; i ++)
for (unsigned int i = 0 ; i < __route.size () ; i ++)
{
if (t [i] != 1)
{

View file

@ -11,32 +11,37 @@
#include "two_opt.h"
TwoOpt TwoOpt :: operator ! () const {
TwoOpt TwoOpt :: operator ! () const
{
TwoOpt move = * this ;
std :: swap (move.first, move.second) ;
return move ;
}
void TwoOpt :: operator () (Route & __route) {
void TwoOpt :: operator () (Route & __route)
{
std :: vector <unsigned> seq_cities ;
std :: vector <unsigned int> seq_cities ;
for (unsigned i = second ; i > first ; i --)
seq_cities.push_back (__route [i]) ;
for (unsigned int i = second ; i > first ; i --)
{
seq_cities.push_back (__route [i]) ;
}
unsigned j = 0 ;
for (unsigned i = first + 1 ; i < second + 1 ; i ++)
__route [i] = seq_cities [j ++] ;
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) {
void TwoOpt :: readFrom (std :: istream & __is)
{
__is >> first >> second ;
}
void TwoOpt :: printOn (std :: ostream & __os) const {
void TwoOpt :: printOn (std :: ostream & __os) const
{
__os << first << ' ' << second ;
}

View file

@ -19,16 +19,17 @@
#include "route.h"
class TwoOpt : public moMove <Route>, public std :: pair <unsigned, unsigned>, public eoPersistent {
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 ;
} ;

View file

@ -12,13 +12,17 @@
#include "two_opt_incr_eval.h"
#include "graph.h"
float TwoOptIncrEval :: operator () (const TwoOpt & __move, const Route & __route) {
float TwoOptIncrEval :: operator () (const TwoOpt & __move, const Route & __route)
{
// From
unsigned v1 = __route [__move.first], v1_next = __route [__move.first + 1] ;
unsigned int v1 = __route [__move.first], v1_next = __route [__move.first + 1] ;
// To
unsigned v2 = __route [__move.second], v2_next = __route [__move.second + 1] ;
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) ;
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

@ -15,8 +15,9 @@
#include <moMoveIncrEval.h>
#include "two_opt.h"
class TwoOptIncrEval : public moMoveIncrEval <TwoOpt> {
class TwoOptIncrEval : public moMoveIncrEval <TwoOpt>
{
public :
float operator () (const TwoOpt & __move, const Route & __route) ;

View file

@ -11,8 +11,8 @@
#include "two_opt_init.h"
void TwoOptInit :: operator () (TwoOpt & __move, const Route & __route) {
void TwoOptInit :: operator () (TwoOpt & __move, const Route & __route)
{
__move.first = 0 ;
__move.second = 2 ;
}

View file

@ -17,7 +17,8 @@
#include "two_opt.h"
/** It sets the first couple of edges */
class TwoOptInit : public moMoveInit <TwoOpt> {
class TwoOptInit : public moMoveInit <TwoOpt>
{
public :

View file

@ -12,19 +12,21 @@
#include "two_opt_next.h"
#include "graph.h"
bool TwoOptNext :: operator () (TwoOpt & __move, const Route & __route) {
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 false ;
}
else
{
__move.second ++ ;
if (__move.second == Graph :: size () - 1)
{
__move.first ++ ;
__move.second = __move.first + 2 ;
}
return true ;
}
return true ;
}
}

View file

@ -16,8 +16,9 @@
#include "two_opt.h"
/** It updates a couple of edges */
class TwoOptNext : public moNextMove <TwoOpt> {
class TwoOptNext : public moNextMove <TwoOpt>
{
public :
bool operator () (TwoOpt & __move, const Route & __route) ;

View file

@ -13,8 +13,8 @@
#include "graph.h"
#include <utils/eoRNG.h>
void TwoOptRand :: operator () (TwoOpt & __move) {
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

@ -16,7 +16,8 @@
#include "two_opt.h"
class TwoOptRand : public moRandMove <TwoOpt> {
class TwoOptRand : public moRandMove <TwoOpt>
{
public :

View file

@ -14,40 +14,40 @@
#define TABU_LENGTH 10
void TwoOptTabuList :: init () {
void TwoOptTabuList :: init ()
{
// Size (eventually)
tabu_span.resize (Graph :: size ()) ;
for (unsigned i = 0 ; i < tabu_span.size () ; i ++)
for (unsigned int i = 0 ; i < tabu_span.size () ; i ++)
{
tabu_span [i].resize (Graph :: size ()) ;
}
// Clear
for (unsigned i = 0 ; i < tabu_span.size () ; i ++)
for (unsigned int i = 0 ; i < tabu_span.size () ; i ++)
{
for (unsigned j = 0 ; j < tabu_span [i].size () ; j ++)
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) {
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) {
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 i = 0 ; i < tabu_span.size () ; i ++)
void TwoOptTabuList :: update ()
{
for (unsigned int i = 0 ; i < tabu_span.size () ; i ++)
{
for (unsigned j = 0 ; j < tabu_span [i].size () ; j ++)
for (unsigned int j = 0 ; j < tabu_span [i].size () ; j ++)
{
if (tabu_span [i] [j] > 0)
{

View file

@ -17,8 +17,8 @@
#include "route.h"
/** The table of tabu movements, i.e. forbidden edges */
class TwoOptTabuList : public moTabuList <TwoOpt> {
class TwoOptTabuList : public moTabuList <TwoOpt>
{
public :
bool operator () (const TwoOpt & __move, const Route & __sol) ;
@ -26,7 +26,7 @@ public :
void add (const TwoOpt & __move, const Route & __sol) ;
void update () ;
void init () ;
private :