Я думаю, что ваш Algorithm-класс можно просто уменьшить до (псевдокод Scala - я думаю, что это легче понять, чем Haskell или Clojure, поскольку он ближе к Java)
def computeResult(input: Input): (List[Result1], List[Result2]) = ...
где (a, b) является Tuple, простой оберткой вокруг двух значений a и b.
EvaluationCriterion может быть
trait EvaluationCriterion {
def evaluate(algo : Input => (List[Result1], List[Result2])): Double
}
Если у вас есть последовательность (например, список) этих критериев, вы можете написать
evaluationCriterias.map(crit => (crit.getClass.toString, crit.evaluate(computeResult _)))
, что приведет к чему-то вродеSeq((CritClass1, 1.2), (CritClass2, 0.99), (CritClass3, 0.54))