diff --git a/src/main/java/org/cobweb/cobweb2/impl/ai/LinearWeightsController.java b/src/main/java/org/cobweb/cobweb2/impl/ai/LinearWeightsController.java index 9c120b3..b8fd8d5 100644 --- a/src/main/java/org/cobweb/cobweb2/impl/ai/LinearWeightsController.java +++ b/src/main/java/org/cobweb/cobweb2/impl/ai/LinearWeightsController.java @@ -76,12 +76,21 @@ public void mutate(float adjustmentStrength) { for (int v = 0; v < inputs.length; v++) { // variables with stronger inputs are adjusted more double strength = adjustmentStrength * Math.abs(inputs[v]); - data[v][eq] += simulator.getRandom().nextGaussian() * strength; + double x = data[v][eq] + simulator.getRandom().nextGaussian() * strength; + data[v][eq] = limitOutput(x); } } } } + // Do not allow values to reach infinity. + // The limit is arbitrary, probably big enough for any values users would have used in the past + private static double OUTPUT_VALUE_MAX = 100000; + private static final double limitOutput(double value) { + value = Math.max(-OUTPUT_VALUE_MAX, Math.min(OUTPUT_VALUE_MAX, value)); + return value; + } + @Override public void controlAgent(Agent theAgent, ControllerListener inputCallback) { @@ -126,8 +135,9 @@ public void controlAgent(Agent theAgent, ControllerListener inputCallback) { for (int eq = 0; eq < LinearWeightsControllerParams.OUTPUT_COUNT; eq++) { double res = 0.0; for (int v = 0; v < variables.length; v++) { - res += data[v][eq] * variables[v]; + res += data[v][eq] * variables[v]; } + res = limitOutput(res); if (eq == 0) memout = res;