Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/15/17 12:14:18 (6 years ago)
Author:
abeham
Message:

#2747: worked on the CFSAP

  • merged HeuristicLab.Problems.Instances from trunk
  • updated best known qualities
  • reduced memory footprint of run
  • added convergence graph result to solving strategy
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/CFSAP/HeuristicLab.Problems.Scheduling.CFSAP/3.3/MultiNestCFSAPSolvingStrategy.cs

    r15460 r15472  
    33using System.Linq;
    44using System.Threading;
     5using HeuristicLab.Analysis;
    56using HeuristicLab.Common;
    67using HeuristicLab.Core;
     
    3233    }
    3334
     35
     36    public IFixedValueParameter<StringValue> EvaluatedSolutionsNameParameter {
     37      get { return (IFixedValueParameter<StringValue>)Parameters["EvaluatedSolutionsName"]; }
     38    }
     39
     40    public IAlgorithm Solver {
     41      get { return SolverParameter.Value; }
     42      set { SolverParameter.Value = value; }
     43    }
     44
    3445    public TimeSpan MaximumRuntime {
    3546      get { return MaximumRuntimeParameter.Value.Value; }
    3647      set { MaximumRuntimeParameter.Value.Value = value; }
     48    }
     49
     50    public string EvaluatedSolutionsName {
     51      get { return EvaluatedSolutionsNameParameter.Value.Value; }
     52      set { EvaluatedSolutionsNameParameter.Value.Value = value; }
    3753    }
    3854
     
    4763      if (original.algorithmsResults != null)
    4864        algorithmsResults = cloner.Clone(original.algorithmsResults);
     65      if (original.qualityPerClock != null)
     66        qualityPerClock = cloner.Clone(original.qualityPerClock);
     67      if (original.qualityPerEvaluations != null)
     68        qualityPerEvaluations = cloner.Clone(original.qualityPerEvaluations);
    4969    }
    5070    public MultiNestCFSAPSolvingStrategy() {
    51       Parameters.Add(new ValueParameter<IAlgorithm>("Solver", "The actual solver template."));
     71      Parameters.Add(new ValueParameter<IAlgorithm>("Solver", "The actual solver template.") { GetsCollected = false });
    5272      Parameters.Add(new FixedValueParameter<TimeSpanValue>("MaximumRuntime", "The maximum time that the strategy should run.", new TimeSpanValue(TimeSpan.FromSeconds(60))));
     73      Parameters.Add(new FixedValueParameter<StringValue>("EvaluatedSolutionsName", "The name of the result that shows the number of evaluated solutions by the actual solver.", new StringValue("EvaluatedSolutions")));
    5374    }
    5475   
    5576    public override IDeepCloneable Clone(Cloner cloner) {
    5677      return new MultiNestCFSAPSolvingStrategy(this, cloner);
     78    }
     79
     80
     81    [StorableHook(HookType.AfterDeserialization)]
     82    private void AfterDeserialization() {
     83      if (!Parameters.ContainsKey("EvaluatedSolutionsName"))
     84        Parameters.Add(new FixedValueParameter<StringValue>("EvaluatedSolutionsName", "The name of the result that shows the number of evaluated solutions by the actual solver.", new StringValue("EvaluatedSolutions")));
    5785    }
    5886
     
    6391    [Storable]
    6492    private ResultCollection algorithmsResults;
     93    [Storable]
     94    private IndexedDataTable<double> qualityPerClock;
     95    [Storable]
     96    private IndexedDataTable<double> qualityPerEvaluations;
    6597
    6698    protected override void OnPrepared() {
     
    68100      algorithms = null;
    69101      qualities = null;
     102      algorithmsResults = null;
     103      qualityPerClock = null;
     104      qualityPerEvaluations = null;
    70105    }
    71106
     
    89124      var min = worst.Quality;
    90125
     126      qualityPerClock = new IndexedDataTable<double>("Quality per Clock");
     127      var qpcRow = new IndexedDataRow<double>("First-hit Graph");
     128      qpcRow.Values.Add(Tuple.Create(ExecutionTime.TotalSeconds, (double)min));
     129      qpcRow.Values.Add(Tuple.Create(ExecutionTime.TotalSeconds, (double)min));
     130      qualityPerClock.Rows.Add(qpcRow);
     131      qualityPerEvaluations = new IndexedDataTable<double>("Quality per Evaluations");
     132      var qpeRow = new IndexedDataRow<double>("First-hit Graph");
     133      qualityPerEvaluations.Rows.Add(qpeRow);
     134      double evaluations = GetEvaluatedSolutions();
     135      qpeRow.Values.Add(Tuple.Create((double)evaluations, (double)min));
     136      qpeRow.Values.Add(Tuple.Create((double)evaluations, (double)min));
     137
    91138      Results.Add(new Result("Nest with maximum T", new IntValue(worst.Index + 1)));
    92139      Results.Add(new Result("Maximum T", new IntValue(min)));
     140      Results.Add(new Result("BestQuality", new DoubleValue(min)));
    93141      Results.Add(new Result("Best Solution Found At", new TimeSpanValue(ExecutionTime)));
    94142      Results.Add(new Result("Delta T", new PercentValue((min - Problem.BestKnownQuality) / Problem.BestKnownQuality)));
    95143      Results.Add(new Result("Nest Results", algorithmsResults));
     144      Results.Add(new Result("QualityPerClock", qualityPerClock));
     145      Results.Add(new Result("QualityPerEvaluations", qualityPerEvaluations));
    96146
    97147      base.Initialize(cancellationToken);
     148    }
     149
     150    private double GetEvaluatedSolutions() {
     151      if (algorithmsResults == null) throw new InvalidOperationException("Strategy has not been started yet.");
     152      return algorithmsResults.Select(x => {
     153        IResult res;
     154        if (((ResultCollection)x.Value).TryGetValue(EvaluatedSolutionsName, out res)) {
     155          var itm = res.Value;
     156          if (itm is IntValue) return ((IntValue)itm).Value;
     157          else if (itm is DoubleValue) return ((DoubleValue)itm).Value;
     158        }
     159        throw new InvalidOperationException("No result " + EvaluatedSolutionsName + " in the collection of " + x.Name);
     160      }).Sum();
    98161    }
    99162
     
    106169        qualities[worst.Index] = (int)((DoubleValue)algorithms[worst.Index].Results["BestQuality"].Value).Value;
    107170        worst = qualities.Select((v, i) => new { Index = i, Quality = v }).MaxItems(x => x.Quality).First();
     171
     172        var evaluations = GetEvaluatedSolutions();
     173        var time = ExecutionTime.TotalSeconds;
     174        var qpcRow = qualityPerClock.Rows.First();
     175        var qpeRow = qualityPerEvaluations.Rows.First();
     176        qpcRow.Values[qpcRow.Values.Count - 1] = Tuple.Create(time, (double)min);
     177        qpeRow.Values[qpeRow.Values.Count - 1] = Tuple.Create(evaluations, (double)min);
     178
    108179        if (worst.Quality < min) {
    109180          min = worst.Quality;
    110           Results["Nest with maximum T"].Value = new IntValue(worst.Index + 1);
    111           Results["Maximum T"].Value = new IntValue(min);
    112           Results["Best Solution Found At"].Value = new TimeSpanValue(ExecutionTime);
    113           Results["Delta T"].Value = new PercentValue((min - Problem.BestKnownQuality) / Problem.BestKnownQuality);
     181          ((IntValue)Results["Nest with maximum T"].Value).Value = worst.Index + 1;
     182          ((IntValue)Results["Maximum T"].Value).Value = min;
     183          ((DoubleValue)Results["BestQuality"].Value).Value = min;
     184          ((TimeSpanValue)Results["Best Solution Found At"].Value).Value = TimeSpan.FromSeconds(time);
     185          ((PercentValue)Results["Delta T"].Value).Value = (min - Problem.BestKnownQuality) / Problem.BestKnownQuality;
     186          qpcRow.Values.Add(Tuple.Create(time, (double)min));
     187          qpeRow.Values.Add(Tuple.Create(evaluations, (double)min));
    114188        }
     189
    115190        if (cancellationToken.IsCancellationRequested) return;
    116191      }
Note: See TracChangeset for help on using the changeset viewer.