Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
08/29/19 13:53:26 (5 years ago)
Author:
mkommend
Message:

#2521: Integrated changes of #2943 into problem refactoring branch.

Location:
branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/MultiObjective
Files:
2 added
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/MultiObjective/DominationCalculator.cs

    r16723 r17225  
    2525
    2626namespace HeuristicLab.Optimization {
     27
    2728  [StorableType("d76eb753-5088-4490-ad18-e78d3629c60b")]
    2829  public enum DominationResult { Dominates, IsDominated, IsNonDominated };
    2930
    30   public static class DominationCalculator<T> {
     31  public static class DominationCalculator {
    3132    /// <summary>
    3233    /// Calculates the best pareto front only. The fast non-dominated sorting algorithm is used
     
    4546    /// <param name="dominateOnEqualQualities">Whether solutions of exactly equal quality should dominate one another.</param>
    4647    /// <returns>The pareto front containing the best solutions and their associated quality resp. fitness.</returns>
    47     public static List<Tuple<T, double[]>> CalculateBestParetoFront(T[] solutions, double[][] qualities, bool[] maximization, bool dominateOnEqualQualities = true) {
    48       int populationSize = solutions.Length;
    49 
     48    public static List<Tuple<T, double[]>> CalculateBestParetoFront<T>(T[] solutions, double[][] qualities, bool[] maximization, bool dominateOnEqualQualities = true) {
     49      var populationSize = solutions.Length;
    5050      Dictionary<T, List<int>> dominatedIndividuals;
    5151      int[] dominationCounter, rank;
     
    7171    /// <param name="dominateOnEqualQualities">Whether solutions of exactly equal quality should dominate one another.</param>
    7272    /// <returns>A sorted list of the pareto fronts from best to worst.</returns>
    73     public static List<List<Tuple<T, double[]>>> CalculateAllParetoFronts(T[] solutions, double[][] qualities, bool[] maximization, out int[] rank, bool dominateOnEqualQualities = true) {
    74       int populationSize = solutions.Length;
     73    public static List<List<Tuple<T, double[]>>> CalculateAllParetoFronts<T>(T[] solutions, double[][] qualities, bool[] maximization, out int[] rank, bool dominateOnEqualQualities = true) {
     74      var populationSize = solutions.Length;
    7575
    7676      Dictionary<T, List<int>> dominatedIndividuals;
     
    7878      var fronts = new List<List<Tuple<T, double[]>>>();
    7979      fronts.Add(CalculateBestFront(solutions, qualities, maximization, dominateOnEqualQualities, populationSize, out dominatedIndividuals, out dominationCounter, out rank));
    80       int i = 0;
     80      var i = 0;
    8181      while (i < fronts.Count && fronts[i].Count > 0) {
    8282        var nextFront = new List<Tuple<T, double[]>>();
     
    8484          List<int> dominatedIndividualsByp;
    8585          if (dominatedIndividuals.TryGetValue(p.Item1, out dominatedIndividualsByp)) {
    86             for (int k = 0; k < dominatedIndividualsByp.Count; k++) {
    87               int dominatedIndividual = dominatedIndividualsByp[k];
     86            for (var k = 0; k < dominatedIndividualsByp.Count; k++) {
     87              var dominatedIndividual = dominatedIndividualsByp[k];
    8888              dominationCounter[dominatedIndividual] -= 1;
    8989              if (dominationCounter[dominatedIndividual] == 0) {
     
    100100    }
    101101
    102     private static List<Tuple<T, double[]>> CalculateBestFront(T[] solutions, double[][] qualities, bool[] maximization, bool dominateOnEqualQualities, int populationSize, out Dictionary<T, List<int>> dominatedIndividuals, out int[] dominationCounter, out int[] rank) {
     102    private static List<Tuple<T, double[]>> CalculateBestFront<T>(T[] solutions, double[][] qualities, bool[] maximization, bool dominateOnEqualQualities, int populationSize, out Dictionary<T, List<int>> dominatedIndividuals, out int[] dominationCounter, out int[] rank) {
    103103      var front = new List<Tuple<T, double[]>>();
    104104      dominatedIndividuals = new Dictionary<T, List<int>>();
    105105      dominationCounter = new int[populationSize];
    106106      rank = new int[populationSize];
    107       for (int pI = 0; pI < populationSize - 1; pI++) {
     107      for (var pI = 0; pI < populationSize - 1; pI++) {
    108108        var p = solutions[pI];
    109109        List<int> dominatedIndividualsByp;
    110110        if (!dominatedIndividuals.TryGetValue(p, out dominatedIndividualsByp))
    111111          dominatedIndividuals[p] = dominatedIndividualsByp = new List<int>();
    112         for (int qI = pI + 1; qI < populationSize; qI++) {
     112        for (var qI = pI + 1; qI < populationSize; qI++) {
    113113          var test = Dominates(qualities[pI], qualities[qI], maximization, dominateOnEqualQualities);
    114114          if (test == DominationResult.Dominates) {
     
    149149      if (dominateOnEqualQualities) {
    150150        var equal = true;
    151         for (int i = 0; i < left.Length; i++) {
     151        for (var i = 0; i < left.Length; i++) {
    152152          if (left[i] != right[i]) {
    153153            equal = false;
     
    159159
    160160      bool leftIsBetter = false, rightIsBetter = false;
    161       for (int i = 0; i < left.Length; i++) {
     161      for (var i = 0; i < left.Length; i++) {
    162162        if (IsDominated(left[i], right[i], maximizations[i])) rightIsBetter = true;
    163163        else if (IsDominated(right[i], left[i], maximizations[i])) leftIsBetter = true;
Note: See TracChangeset for help on using the changeset viewer.