public void setup(final EvolutionState state, final Parameter base) { super.setup(state, base); Parameter def = defaultBase(); int numSelects = state.parameters.getInt(base.push(P_NUMSELECTS), def.push(P_NUMSELECTS), 1); if (numSelects == 0) state.output.fatal( "The number of MultiSelection sub-selection methods must be >= 1).", base.push(P_NUMSELECTS), def.push(P_NUMSELECTS)); // make our arrays selects = new SelectionMethod[numSelects]; float total = 0.0f; for (int x = 0; x < numSelects; x++) { Parameter p = base.push(P_SELECT).push("" + x); Parameter d = def.push(P_SELECT).push("" + x); selects[x] = (SelectionMethod) (state.parameters.getInstanceForParameter(p, d, SelectionMethod.class)); selects[x].setup(state, p); // now check probability if (selects[x].probability < 0.0) state.output.error( "MultiSelection select #" + x + " must have a probability >= 0.0", p.push(P_PROB), d.push(P_PROB)); else total += selects[x].probability; } state.output.exitIfErrors(); // Now check for valid probability if (total <= 0.0) state.output.fatal("MultiSelection selects do not sum to a positive probability", base); if (total != 1.0) { state.output.message("Must normalize probabilities for " + base); for (int x = 0; x < numSelects; x++) selects[x].probability /= total; } // totalize float tmp = 0.0f; for (int x = 0; x < numSelects - 1; x++) // yes, it's off by one { tmp += selects[x].probability; selects[x].probability = tmp; } selects[numSelects - 1].probability = 1.0f; }
public void setup(final EvolutionState state, final Parameter base) { super.setup(state, base); Parameter def = defaultBase(); double val = state.parameters.getDouble(base.push(P_SIZE), def.push(P_SIZE), 1.0); if (val < 1.0) state.output.fatal("Tournament size must be >= 1.", base.push(P_SIZE), def.push(P_SIZE)); else if (val > 1 && val < 2) // pick with probability { size = 2; probabilityOfSelection = (val / 2); } else if (val != (int) val) // it's not an integer state.output.fatal( "If >= 2, Tournament size must be an integer.", base.push(P_SIZE), def.push(P_SIZE)); else { size = (int) val; probabilityOfSelection = 1.0; } val = state.parameters.getDouble(base.push(P_SIZE2), def.push(P_SIZE2), 1.0); if (val < 1.0) state.output.fatal("Tournament size2 must be >= 1.", base.push(P_SIZE2), def.push(P_SIZE2)); else if (val > 1 && val < 2) // pick with probability { size2 = 2; probabilityOfSelection2 = (val / 2); } else if (val != (int) val) // it's not an integer state.output.fatal( "If >= 2, Tournament size2 must be an integer.", base.push(P_SIZE2), def.push(P_SIZE2)); else { size2 = (int) val; probabilityOfSelection2 = 1.0; } doLengthFirst = state.parameters.getBoolean(base.push(P_DOLENGTHFIRST), def.push(P_DOLENGTHFIRST), true); pickWorst = state.parameters.getBoolean(base.push(P_PICKWORST), def.push(P_PICKWORST), false); pickWorst2 = state.parameters.getBoolean(base.push(P_PICKWORST2), def.push(P_PICKWORST2), false); }