move evalCond, updateCond to M.G.StopCondition
move doCrossovers to M.GA.Utilities
conservative SelectionOp which preserves fitness info
domination predicate and domination ranking
non-dominated sort (not fast yet, O(M N^3 log N))
crowding distance
rankAllSolutions :: [ProblemType] -> [EvaluatedGenome a] -> [RankedSolution a]
expose M.G.Multiobjective, fix warnings
rename M.GA.Multiobjective to M.GA.Multiobjective.NSGA2
build with NSGA2 in a separate module
sortByIndicesBy as an inner function of crowdingDistances
NSGA-II ranking with crowding
nondominatedRanking with the same type as nsgaiiRanking but without crowding
move SingleObjectiveProblem, MultiObjectiveProblem to M.GA.Multiobjective.Types
stepNSGA2 and related functions
fix nsga2Ranking and nondominatedRanking:

   * better `crowdedCompare` worst returns LT rather than GT =>
     best solutions go first after sorting
   * nsga2Ranking and nondominatedRanking change order of genomes,
     add an instance of ObjectiveFunction to account for this
     case
move EvaluatedGenome and evalAllObjectives to M.GA.Multiobjective.Types
a test for stepNSGA2default
export end-user toObjectiveSpace and toSolutionSpace functions; rename EvaluatedGenome to MultiPhenotype (hidden)
make takeGenome a class method