00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include <assert.h>
00038 #include <values.h>
00039
00040 #include <utils/eoRNG.h>
00041
00042 #include "edge_xover.h"
00043
00044 void EdgeXover :: build_map (const Route & __par1, const Route & __par2) {
00045
00046 unsigned len = __par1.size () ;
00047
00048
00049 _map.clear () ;
00050 _map.resize (len) ;
00051
00052 for (unsigned i = 0 ; i < len ; i ++) {
00053 _map [__par1 [i]].insert (__par1 [(i + 1) % len]) ;
00054 _map [__par2 [i]].insert (__par2 [(i + 1) % len]) ;
00055 _map [__par1 [i]].insert (__par1 [(i - 1 + len) % len]) ;
00056 _map [__par2 [i]].insert (__par2 [(i - 1 + len) % len]) ;
00057 }
00058
00059 visited.clear () ;
00060 visited.resize (len, false) ;
00061 }
00062
00063 void EdgeXover :: remove_entry (unsigned __vertex, std :: vector <std :: set <unsigned> > & __map) {
00064
00065 std :: set <unsigned> & neigh = __map [__vertex] ;
00066
00067 for (std :: set <unsigned> :: iterator it = neigh.begin () ;
00068 it != neigh.end () ;
00069 it ++)
00070 __map [* it].erase (__vertex) ;
00071
00072 }
00073
00074 void EdgeXover :: add_vertex (unsigned __vertex, Route & __child) {
00075
00076 visited [__vertex] = true ;
00077 __child.push_back (__vertex) ;
00078 remove_entry (__vertex, _map) ;
00079 }
00080
00081 void EdgeXover :: cross (const Route & __par1, const Route & __par2, Route & __child) {
00082
00083 build_map (__par1, __par2) ;
00084
00085 unsigned len = __par1.size () ;
00086
00087
00088 __child.clear () ;
00089
00090 unsigned cur_vertex = rng.random (len) ;
00091
00092 add_vertex (cur_vertex, __child) ;
00093
00094 for (unsigned i = 1 ; i < len ; i ++) {
00095
00096 unsigned len_min_entry = MAXINT ;
00097
00098 std :: set <unsigned> & neigh = _map [cur_vertex] ;
00099
00100 for (std :: set <unsigned> :: iterator it = neigh.begin () ;
00101 it != neigh.end () ;
00102 it ++) {
00103 unsigned l = _map [* it].size () ;
00104 if (len_min_entry > l)
00105 len_min_entry = l ;
00106 }
00107
00108 std :: vector <unsigned> cand ;
00109
00110 for (std :: set <unsigned> :: iterator it = neigh.begin () ;
00111 it != neigh.end () ;
00112 it ++) {
00113 unsigned l = _map [* it].size () ;
00114 if (len_min_entry == l)
00115 cand.push_back (* it) ;
00116 }
00117
00118 if (! cand.size ()) {
00119
00120
00121 for (unsigned j = 0 ; j < len ; j ++)
00122 if (! visited [j])
00123 cand.push_back (j) ;
00124 }
00125
00126 cur_vertex = cand [rng.random (cand.size ())] ;
00127
00128 add_vertex (cur_vertex, __child) ;
00129 }
00130 }
00131
00132 bool EdgeXover :: operator () (Route & __route1, Route & __route2) {
00133
00134
00135 Route par [2] ;
00136 par [0] = __route1 ;
00137 par [1] = __route2 ;
00138
00139 cross (par [0], par [1], __route1) ;
00140 cross (par [1], par [0], __route2) ;
00141
00142 __route1.invalidate () ;
00143 __route2.invalidate () ;
00144
00145 return true ;
00146 }