private Types.ACTIONS microbial(StateObservation stateObs, int maxdepth, StateHeuristic heuristic, int iterations) {

        double[] maxScores = new double[stateObs.getAvailableActions().size()];

        for (int i = 0; i < maxScores.length; i++) {
            maxScores[i] = Double.NEGATIVE_INFINITY;
        }


        outerloop:
        for (int i = 0; i < iterations; i++) {
            for (Types.ACTIONS action : stateObs.getAvailableActions()) {


                StateObservation stCopy = stateObs.copy();
                stCopy.advance(action);

                double score = 0;
                try {
                    score = microbial_tournament(genome[r_action_mapping.get(action)], stCopy, heuristic) + randomGenerator.nextDouble()*0.00001;
                } catch (TimeoutException e) {
                    break outerloop;
                }

                try {
                    int int_act = this.r_action_mapping.get(action);

                    if (score > maxScores[int_act]) {
                        maxScores[int_act] = score;
                    }
                }catch (Exception e){}

            }
        }

        Types.ACTIONS maxAction = this.action_mapping.get(Utils.argmax(maxScores));


        return maxAction;

    }