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 #ifndef eoVRPMutation_H
00037 #define eoVRPMutation_H
00038
00039
00040 #include <algorithm>
00041
00042
00043 #include <eoOp.h>
00044
00052 class eoVRPMutation: public eoMonOp <eoVRP> {
00053
00054 public:
00055
00060 eoVRPMutation () {
00061
00062 }
00063
00064
00070 std::string className () const {
00071
00072 return "eoVRPMutation";
00073
00074 }
00075
00076
00086 bool operator () (eoVRP& _genotype) {
00087
00088 bool res = false;
00089 double op = rng.uniform ();
00090
00091
00092 if (op <= 0.05)
00093 res = swapMutation (_genotype);
00094 else if ((op > 0.05) && (op <= 0.20))
00095 res = inversionMutation (_genotype);
00096 else if ((op > 0.20) && (op <= 0.25))
00097 res = insertionMutation (_genotype);
00098 else if ((op > 0.25) && (op <= 0.45))
00099 res = DisplacementMutation (_genotype);
00100
00101 if (res)
00102 _genotype.cleanRoutes ();
00103
00104 return res;
00105
00106 }
00107
00108
00109 private:
00110
00111
00119 bool swapMutation (eoVRP& _genotype) {
00120
00121 int p1 = rng.random (_genotype.size ());
00122 int p2 = -1;
00123
00124 do {
00125 p2 = rng.random (_genotype.size ());
00126 } while (_genotype [p2] == _genotype [p1]);
00127
00128 std::swap (_genotype [p1], _genotype [p2]);
00129
00130 return true;
00131
00132 }
00133
00134
00142 bool inversionMutation (eoVRP& _genotype) {
00143
00144 int p1 = rng.random (_genotype.size ());
00145 int p2 = -1;
00146
00147 do {
00148 p2 = rng.random (_genotype.size ());
00149 } while (_genotype [p2] == _genotype [p1]);
00150
00151 if (p1 > p2)
00152 std::swap (p1, p2);
00153
00154
00155 reverse (_genotype.begin () + p1, _genotype.begin () + p2 + 1);
00156
00157
00158 return false;
00159
00160 }
00161
00162
00170 bool insertionMutation (eoVRP& _genotype) {
00171
00172 int p = -1;
00173
00174
00175 do {
00176 p = rng.random (_genotype.size ());
00177 } while (_genotype [p] == -1);
00178
00179
00180 unsigned client = _genotype [p];
00181
00182 _genotype.erase (_genotype.begin () + p);
00183
00184 p = rng.random (_genotype.size () - 1);
00185 _genotype.insert (_genotype.begin () + p, client);
00186
00187 return true;
00188
00189 }
00190
00191
00199 bool DisplacementMutation (eoVRP& _genotype) {
00200
00201 int p1 = rng.random (_genotype.size ());
00202 int p2 = -1;
00203
00204 do {
00205 p2 = rng.random (_genotype.size ());
00206 } while (_genotype [p2] == _genotype [p1]);
00207
00208 if (p1 > p2)
00209 std::swap (p1, p2);
00210
00211
00212 Route route;
00213
00214 for (unsigned i = p1; i <= p2; i++)
00215 route.push_back (_genotype [i]);
00216
00217 _genotype.erase (_genotype.begin () + p1, _genotype.begin () + p2 + 1);
00218
00219 unsigned p = rng.random ((_genotype.size () > 0) ? _genotype.size () - 1 : 0);
00220 _genotype.insert (_genotype.begin () + p, route.begin (), route.end ());
00221
00222 return true;
00223
00224 }
00225
00226
00227 };
00228
00229 #endif