Exemple #1
0
 private LAPAssignment(LAPAssignment original, Cloner cloner)
     : base(original, cloner)
 {
     costs       = cloner.Clone(original.costs);
     assignment  = cloner.Clone(original.assignment);
     rowNames    = cloner.Clone(original.rowNames);
     columnNames = cloner.Clone(original.columnNames);
     quality     = cloner.Clone(original.quality);
 }
Exemple #2
0
        public override IOperation Apply()
        {
            var         costs            = CostsParameter.ActualValue;
            var         rowNames         = RowNamesParameter.ActualValue;
            var         columnNames      = ColumnNamesParameter.ActualValue;
            var         permutations     = AssignmentParameter.ActualValue;
            var         qualities        = QualityParameter.ActualValue;
            var         results          = ResultsParameter.ActualValue;
            bool        max              = MaximizationParameter.ActualValue.Value;
            DoubleValue bestKnownQuality = BestKnownQualityParameter.ActualValue;

            var sorted = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).ToArray();

            if (max)
            {
                sorted = sorted.Reverse().ToArray();
            }
            int i = sorted.First().index;

            if (bestKnownQuality == null ||
                max && qualities[i].Value > bestKnownQuality.Value ||
                !max && qualities[i].Value < bestKnownQuality.Value)
            {
                // if there isn't a best-known quality or we improved the best-known quality we'll add the current solution as best-known
                BestKnownQualityParameter.ActualValue   = new DoubleValue(qualities[i].Value);
                BestKnownSolutionParameter.ActualValue  = (Permutation)permutations[i].Clone();
                BestKnownSolutionsParameter.ActualValue = new ItemSet <Permutation>(new PermutationEqualityComparer());
                BestKnownSolutionsParameter.ActualValue.Add((Permutation)permutations[i].Clone());
            }
            else if (bestKnownQuality.Value == qualities[i].Value)
            {
                // if we matched the best-known quality we'll try to set the best-known solution if it isn't null
                // and try to add it to the pool of best solutions if it is different
                if (BestKnownSolutionParameter.ActualValue == null)
                {
                    BestKnownSolutionParameter.ActualValue = (Permutation)permutations[i].Clone();
                }
                if (BestKnownSolutionsParameter.ActualValue == null)
                {
                    BestKnownSolutionsParameter.ActualValue = new ItemSet <Permutation>(new PermutationEqualityComparer());
                }
                foreach (var k in sorted) // for each solution that we found check if it is in the pool of best-knowns
                {
                    if (!max && k.Value > qualities[i].Value ||
                        max && k.Value < qualities[i].Value)
                    {
                        break;                             // stop when we reached a solution worse than the best-known quality
                    }
                    Permutation p = permutations[k.index];
                    if (!BestKnownSolutionsParameter.ActualValue.Contains(p))
                    {
                        BestKnownSolutionsParameter.ActualValue.Add((Permutation)permutations[k.index].Clone());
                    }
                }
            }

            LAPAssignment assignment = BestSolutionParameter.ActualValue;

            if (assignment == null)
            {
                assignment = new LAPAssignment(costs, rowNames, columnNames, (Permutation)permutations[i].Clone(), new DoubleValue(qualities[i].Value));
                BestSolutionParameter.ActualValue = assignment;
                results.Add(new Result("Best LAP Solution", assignment));
            }
            else
            {
                if (max && assignment.Quality.Value < qualities[i].Value ||
                    !max && assignment.Quality.Value > qualities[i].Value)
                {
                    assignment.Costs         = costs;
                    assignment.Assignment    = (Permutation)permutations[i].Clone();
                    assignment.Quality.Value = qualities[i].Value;
                    if (rowNames != null)
                    {
                        assignment.RowNames = rowNames;
                    }
                    else
                    {
                        assignment.RowNames = null;
                    }
                    if (columnNames != null)
                    {
                        assignment.ColumnNames = columnNames;
                    }
                    else
                    {
                        assignment.ColumnNames = null;
                    }
                }
            }

            return(base.Apply());
        }
Exemple #3
0
 private LAPAssignment(LAPAssignment original, Cloner cloner)
   : base(original, cloner) {
   costs = cloner.Clone(original.costs);
   assignment = cloner.Clone(original.assignment);
   rowNames = cloner.Clone(original.rowNames);
   columnNames = cloner.Clone(original.columnNames);
   quality = cloner.Clone(original.quality);
 }
    public override IOperation Apply() {
      var costs = CostsParameter.ActualValue;
      var rowNames = RowNamesParameter.ActualValue;
      var columnNames = ColumnNamesParameter.ActualValue;
      var permutations = AssignmentParameter.ActualValue;
      var qualities = QualityParameter.ActualValue;
      var results = ResultsParameter.ActualValue;
      bool max = MaximizationParameter.ActualValue.Value;
      DoubleValue bestKnownQuality = BestKnownQualityParameter.ActualValue;

      var sorted = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).ToArray();
      if (max) sorted = sorted.Reverse().ToArray();
      int i = sorted.First().index;

      if (bestKnownQuality == null
          || max && qualities[i].Value > bestKnownQuality.Value
          || !max && qualities[i].Value < bestKnownQuality.Value) {
        // if there isn't a best-known quality or we improved the best-known quality we'll add the current solution as best-known
        BestKnownQualityParameter.ActualValue = new DoubleValue(qualities[i].Value);
        BestKnownSolutionParameter.ActualValue = (Permutation)permutations[i].Clone();
        BestKnownSolutionsParameter.ActualValue = new ItemSet<Permutation>(new PermutationEqualityComparer());
        BestKnownSolutionsParameter.ActualValue.Add((Permutation)permutations[i].Clone());
      } else if (bestKnownQuality.Value == qualities[i].Value) {
        // if we matched the best-known quality we'll try to set the best-known solution if it isn't null
        // and try to add it to the pool of best solutions if it is different
        if (BestKnownSolutionParameter.ActualValue == null)
          BestKnownSolutionParameter.ActualValue = (Permutation)permutations[i].Clone();
        if (BestKnownSolutionsParameter.ActualValue == null)
          BestKnownSolutionsParameter.ActualValue = new ItemSet<Permutation>(new PermutationEqualityComparer());
        foreach (var k in sorted) { // for each solution that we found check if it is in the pool of best-knowns
          if (!max && k.Value > qualities[i].Value
            || max && k.Value < qualities[i].Value) break; // stop when we reached a solution worse than the best-known quality
          Permutation p = permutations[k.index];
          if (!BestKnownSolutionsParameter.ActualValue.Contains(p))
            BestKnownSolutionsParameter.ActualValue.Add((Permutation)permutations[k.index].Clone());
        }
      }

      LAPAssignment assignment = BestSolutionParameter.ActualValue;
      if (assignment == null) {
        assignment = new LAPAssignment(costs, rowNames, columnNames, (Permutation)permutations[i].Clone(), new DoubleValue(qualities[i].Value));
        BestSolutionParameter.ActualValue = assignment;
        results.Add(new Result("Best LAP Solution", assignment));
      } else {
        if (max && assignment.Quality.Value < qualities[i].Value ||
          !max && assignment.Quality.Value > qualities[i].Value) {
          assignment.Costs = costs;
          assignment.Assignment = (Permutation)permutations[i].Clone();
          assignment.Quality.Value = qualities[i].Value;
          if (rowNames != null)
            assignment.RowNames = rowNames;
          else assignment.RowNames = null;
          if (columnNames != null)
            assignment.ColumnNames = columnNames;
          else assignment.ColumnNames = null;
        }
      }

      return base.Apply();
    }