@Override
  public int[] act(final double returns[], final int num) {
    int[] chosen = null;
    if (num > returns.length) {
      chosen = new int[returns.length];
    } else {
      chosen = new int[num];
    }

    final ArrayList<Double> values = new ArrayList<Double>();
    final ArrayList<Integer> indices = new ArrayList<Integer>();
    for (int i = 0; i < returns.length; i++) {
      values.add(returns[i]);
      indices.add(i);
    }

    int index = -1;
    for (int i = 0; i < chosen.length; i++) {
      index = choosing.internalAct(Utils.toArray(values));
      chosen[i] = indices.get(index).intValue();

      // remove the chosen action and its return
      values.remove(index);
      indices.remove(index);
    }

    choosing.updateEpsilon();

    return chosen;
  }
  @Override
  public String toString() {
    String s = super.toString();

    s += "\n" + Utils.indent(choosing.toString());

    return s;
  }
 public Object protoClone() {
   try {
     final EpsilonGreedyMultiActionChoosingPolicy copy =
         (EpsilonGreedyMultiActionChoosingPolicy) clone();
     copy.choosing = (EpsilonGreedyActionChoosingPolicy) choosing.protoClone();
     return copy;
   } catch (final CloneNotSupportedException e) {
     e.printStackTrace();
     return null;
   }
 }
 public void reset() {
   choosing.reset();
 }
 public void setup(final ParameterDatabase parameters, final Parameter base) {
   choosing.setup(parameters, base);
   choosing.initialize();
 }