00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <assert.h>
00013 #include <vector>
00014
00015 #include <utils/eoRNG.h>
00016
00017 #include "order_xover.h"
00018 #include "route_valid.h"
00019
00020 void OrderXover :: cross (const Route & __par1, const Route & __par2, Route & __child)
00021 {
00022
00023 unsigned int cut = rng.random (__par1.size ()) ;
00024
00025
00026
00027 std::vector<bool> v;
00028 v.resize(__par1.size());
00029
00030 for (unsigned int i = 0 ; i < __par1.size () ; i ++)
00031 {
00032 v [i] = false ;
00033 }
00034
00035
00036
00037 for (unsigned int i = 0 ; i < cut ; i ++)
00038 {
00039 __child [i] = __par1 [i] ;
00040 v [__par1 [i]] = true ;
00041 }
00042
00043
00044
00045 unsigned int from = 0 ;
00046 for (unsigned int i = 0 ; i < __par2.size () ; i ++)
00047 {
00048 if (__par2 [i] == __child [cut - 1])
00049 {
00050 from = i ;
00051 break ;
00052 }
00053 }
00054
00055
00056
00057 char direct = rng.flip () ? 1 : -1 ;
00058
00059
00060
00061 unsigned int l = cut ;
00062
00063 for (unsigned int i = 0 ; i < __par2.size () ; i ++)
00064 {
00065 unsigned int bidule = (direct * i + from + __par2.size ()) % __par2.size () ;
00066 if (! v [__par2 [bidule]])
00067 {
00068 __child [l ++] = __par2 [bidule] ;
00069 v [__par2 [bidule]] = true ;
00070 }
00071 }
00072
00073 v.clear();
00074 }
00075
00076 bool OrderXover :: operator () (Route & __route1, Route & __route2)
00077 {
00078
00079
00080 Route par [2] ;
00081 par [0] = __route1 ;
00082 par [1] = __route2 ;
00083
00084 cross (par [0], par [1], __route1) ;
00085 cross (par [1], par [0], __route2) ;
00086
00087 assert (valid (__route1)) ;
00088 assert (valid (__route2)) ;
00089
00090 __route1.invalidate () ;
00091 __route2.invalidate () ;
00092
00093 return true ;
00094 }