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
00039 #include <vector>
00040
00041 #include <utils/eoRNG.h>
00042
00043 #include "partial_mapped_xover.h"
00044 #include "route_valid.h"
00045 #include "mix.h"
00046
00047 void PartialMappedXover :: repair (Route & __route, unsigned __cut1, unsigned __cut2)
00048 {
00049
00050 std::vector<unsigned int> v;
00051
00052 v.resize(__route.size ());
00053
00054 for (unsigned int i = 0 ; i < __route.size () ; i ++)
00055 {
00056 v [i] = 0 ;
00057 }
00058
00059 for (unsigned int i = 0 ; i < __route.size () ; i ++)
00060 {
00061 v [__route [i]] ++ ;
00062 }
00063
00064 std :: vector <unsigned int> vert ;
00065
00066 for (unsigned int i = 0 ; i < __route.size () ; i ++)
00067 {
00068 if (! v [i])
00069 {
00070 vert.push_back (i) ;
00071 }
00072 }
00073
00074 mix (vert) ;
00075
00076 for (unsigned int i = 0 ; i < __route.size () ; i ++)
00077 {
00078 if (i < __cut1 || i >= __cut2)
00079 {
00080 if (v [__route [i]] > 1)
00081 {
00082 __route [i] = vert.back () ;
00083 vert.pop_back () ;
00084 }
00085 }
00086 }
00087
00088 v.clear();
00089 }
00090
00091 bool PartialMappedXover :: operator () (Route & __route1, Route & __route2)
00092 {
00093 unsigned int cut1 = rng.random (__route1.size ()), cut2 = rng.random (__route2.size ()) ;
00094
00095 if (cut2 < cut1)
00096 {
00097 std :: swap (cut1, cut2) ;
00098 }
00099
00100
00101 for (unsigned int i = cut1 ; i < cut2 ; i ++)
00102 {
00103 std :: swap (__route1 [i], __route2 [i]) ;
00104 }
00105
00106
00107 repair (__route1, cut1, cut2) ;
00108 repair (__route2, cut1, cut2) ;
00109
00110
00111 assert (valid (__route1)) ;
00112 assert (valid (__route2)) ;
00113
00114 __route1.invalidate () ;
00115 __route2.invalidate () ;
00116
00117 return true ;
00118 }