docs: public static <S extends Solution<?>> void tradeoffUtility(List<S> solutionsList) {
      // Reset scalarization values from previous iterations
      for (S solution : solutionsList) {
        setScalarizationValue(solution, 0.0);
      }
  
      for (int cur = 0; cur < solutionsList.size() - 1; cur++) {
        S current = solutionsList.get(cur);
        for (int oth = cur + 1; oth < solutionsList.size(); oth++) {
          S other = solutionsList.get(oth);
          double numerator = 0.0;
          double denominator = 0.0;
          for (int i = 0; i < current.getNumberOfObjectives(); i++) {
            if (current.getObjective(i) > other.getObjective(i)) {
              numerator = Math.max(numerator, current.getObjective(i) - other.getObjective(i));
            } else if (current.getObjective(i) < other.getObjective(i)) {
              denominator = Math.max(denominator, other.getObjective(i) - current.getObjective(i));
            }
          }
          // Neither solution Pareto dominates the other
          if (numerator != 0.0 && denominator != 0.0) {
            setScalarizationValue(current, Math.max(getScalarizationValue(current), numerator / denominator));
            // Tradeoff utility is symmetric
            setScalarizationValue(other, Math.max(getScalarizationValue(other), denominator / numerator));
          }
        }
      }
    }