00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <eoSymMutate.h>
00019 #include <FunDef.h>
00020 #include <utils/eoRNG.h>
00021
00022 using namespace std;
00023
00024 std::pair<Sym, bool> do_mutate(Sym sym, double p, const LanguageTable& table) {
00025
00026 bool changed = false;
00027 SymVec args = sym.args();
00028 if (rng.flip(p)) {
00029 token_t new_token = table.get_random_function(sym.token(), args.size());
00030 if (new_token != sym.token()) {
00031 changed = true;
00032 sym = Sym(new_token, args);
00033 }
00034 }
00035
00036 for (unsigned i = 0; i < args.size(); ++i) {
00037 std::pair<Sym,bool> r = do_mutate(args[i], p, table);
00038 changed |= r.second;
00039 if (r.second)
00040 args[i] = r.first;
00041 }
00042
00043 if (changed)
00044 return std::make_pair(Sym(sym.token(), args), true);
00045
00046 return std::make_pair(sym, false);
00047 }
00048
00049
00050
00051 bool mutate(Sym& sym, double p, const LanguageTable& table) {
00052 std::pair<Sym, bool> r = do_mutate(sym, p, table);
00053 sym = r.first;
00054 return r.second;
00055 }
00056
00057
00058 bool mutate_constants(Sym& sym, double stdev) {
00059 vector<double> values = get_constants(sym);
00060
00061 if (values.empty()) {
00062 return false;
00063 }
00064
00065 for (unsigned i = 0; i < values.size(); ++i) {
00066 values[i] += rng.normal() * stdev / values.size();
00067 }
00068
00069 sym = set_constants(sym, values);
00070 return true;
00071 }
00072