private static Set<FormationSolution> _cartesianProduct(
     int index, List<Set<ComponentSolution>> sets) {
   Set<FormationSolution> ret = new HashSet<FormationSolution>();
   if (index == sets.size()) {
     ret.add(new FormationSolution());
   } else {
     for (ComponentSolution cs : sets.get(index)) {
       for (FormationSolution fs : _cartesianProduct(index + 1, sets)) {
         fs.getComponentSolutions().add(cs);
         ret.add(fs);
       }
     }
   }
   return ret;
 }
  private static Double compareGAFull(
      FormationDecision fd, FormationValue bestGA, FormationValue bestFull) {

    if (bestGA == null || bestFull == null) return null;

    FormationSolution fsGA = new FormationSolution();
    fsGA.setComponentSolutions(bestGA.getComponentSolutions());
    FormationSolution fsFull = new FormationSolution();
    fsFull.setComponentSolutions(bestFull.getComponentSolutions());
    List<FormationSolution> fs = new ArrayList<FormationSolution>();
    fs.add(fsGA);
    fs.add(fsFull);
    System.out.println("Comparing following solutions: GA:" + fsGA + ", fsFull:" + fsFull);

    AnalyticHierarchyProcess ahp =
        new AnalyticHierarchyProcess(createFormationDecisionAlternatives(fd, fs));
    EvaluationResult formationEvalResult = null;
    try {
      formationEvalResult =
          ahp.evaluateFull(createFormationEvaluations(fd.getAlternatives()), 15, true);
    } catch (Exception e) {
      e.printStackTrace();
    }

    SortedSet<FormationValue> results = createSortedFormationResults(formationEvalResult);
    FormationValue previous = null;
    double bestGAValue = 1D;
    double bestFullValue = 1D;
    for (FormationValue fv : results) {
      if (previous != null)
        System.out.println(
            "Comparison prev: diff: "
                + (previous.getFormationValue() - fv.getFormationValue())
                + ", ratio: "
                + (previous.getFormationValue() / fv.getFormationValue()));
      previous = fv;
      if (fv.equals(bestGA)) bestGAValue = fv.getFormationValue();
      if (fv.equals(bestFull)) bestFullValue = fv.getFormationValue();
    }
    System.out.println(
        "Comparison best: diff: "
            + (bestGAValue - bestFullValue)
            + ", ratio: "
            + (bestGAValue / bestFullValue));

    return bestGAValue / bestFullValue;
  }