示例#1
0
  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);
  }