Changeset 751 for cpp/frams/genetics/oper_fx.cpp
- Timestamp:
- 02/28/18 23:41:58 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
cpp/frams/genetics/oper_fx.cpp
r749 r751 80 80 double GenoOperators::mutateNeuProperty(double current, Neuro *n, int i) 81 81 { 82 if (i == -1) return mutateCreepNoLimit('f', current, -10, 10); //i==-1: mutating weight of neural connection82 if (i == -1) return mutateCreepNoLimit('f', current, 2, true); //i==-1: mutating weight of neural connection 83 83 Param p; 84 84 if (i >= 100) { i -= 100; p = n->getClass()->getProperties(); } … … 97 97 ExtValue ev; 98 98 p.get(i, ev); 99 ev.setDouble(mutateCreep(p.type(i)[0], ev.getDouble(), mn, mx ));99 ev.setDouble(mutateCreep(p.type(i)[0], ev.getDouble(), mn, mx, true)); 100 100 p.set(i, ev); 101 101 return true; … … 123 123 double mn, mx, df; 124 124 getMinMaxDef(&p, i, mn, mx, df); 125 newval = mutateCreep(p.type(i)[0], oldval, mn, mx );125 newval = mutateCreep(p.type(i)[0], oldval, mn, mx, true); 126 126 } 127 127 return true; 128 128 } 129 129 130 double GenoOperators::mutateCreepNoLimit(char type, double current, double mn, double mx) 131 { 132 double result = RndGen.Gauss(current, (mx - mn) / 2 / 5); // /halfinterval, 5 times narrower 133 if (type == 'd') { result = int(result + 0.5); if (result == current) result += randomN(2) * 2 - 1; } 134 else result = floor(result * 1000 + 0.5) / 1000.0; //round 130 double GenoOperators::mutateCreepNoLimit(char type, double current, double stddev, bool limit_precision_3digits) 131 { 132 double result = RndGen.Gauss(current, stddev); 133 if (type == 'd') 134 { 135 result = int(result + 0.5); 136 if (result == current) result += randomN(2) * 2 - 1; //force some change 137 } 138 else 139 { 140 if (limit_precision_3digits) 141 result = floor(result * 1000 + 0.5) / 1000.0; //round 142 } 135 143 return result; 136 144 } 137 145 138 double GenoOperators::mutateCreep(char type, double current, double mn, double mx) 139 { 140 double result = mutateCreepNoLimit(type, current, mn, mx); //TODO consider that when boundary is touched (reflect/absorb below), the default precision (3 digits) may change. Is it good or bad? 146 double GenoOperators::mutateCreep(char type, double current, double mn, double mx, double stddev, bool limit_precision_3digits) 147 { 148 double result = mutateCreepNoLimit(type, current, stddev, limit_precision_3digits); 149 //TODO consider that when boundary is touched (reflect+absorb below), the requested precision (3 digits) may change. Is it good or bad? 141 150 //reflect: 142 151 if (result > mx) result = mx - (result - mx); else … … 146 155 if (result < mn) result = mn; 147 156 return result; 157 } 158 159 double GenoOperators::mutateCreep(char type, double current, double mn, double mx, bool limit_precision_3digits) 160 { 161 double stddev = (mx - mn) / 2 / 5; // magic arbitrary formula for stddev, which becomes /halfinterval, 5 times narrower 162 return mutateCreep(type, current, mn, mx, stddev, limit_precision_3digits); 148 163 } 149 164
Note: See TracChangeset
for help on using the changeset viewer.