Changeset 15472 for branches/CFSAP/HeuristicLab.Problems.Scheduling.CFSAP/3.3/MultiNestCFSAPSolvingStrategy.cs
- Timestamp:
- 11/15/17 12:14:18 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/CFSAP/HeuristicLab.Problems.Scheduling.CFSAP/3.3/MultiNestCFSAPSolvingStrategy.cs
r15460 r15472 3 3 using System.Linq; 4 4 using System.Threading; 5 using HeuristicLab.Analysis; 5 6 using HeuristicLab.Common; 6 7 using HeuristicLab.Core; … … 32 33 } 33 34 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 34 45 public TimeSpan MaximumRuntime { 35 46 get { return MaximumRuntimeParameter.Value.Value; } 36 47 set { MaximumRuntimeParameter.Value.Value = value; } 48 } 49 50 public string EvaluatedSolutionsName { 51 get { return EvaluatedSolutionsNameParameter.Value.Value; } 52 set { EvaluatedSolutionsNameParameter.Value.Value = value; } 37 53 } 38 54 … … 47 63 if (original.algorithmsResults != null) 48 64 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); 49 69 } 50 70 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 }); 52 72 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"))); 53 74 } 54 75 55 76 public override IDeepCloneable Clone(Cloner cloner) { 56 77 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"))); 57 85 } 58 86 … … 63 91 [Storable] 64 92 private ResultCollection algorithmsResults; 93 [Storable] 94 private IndexedDataTable<double> qualityPerClock; 95 [Storable] 96 private IndexedDataTable<double> qualityPerEvaluations; 65 97 66 98 protected override void OnPrepared() { … … 68 100 algorithms = null; 69 101 qualities = null; 102 algorithmsResults = null; 103 qualityPerClock = null; 104 qualityPerEvaluations = null; 70 105 } 71 106 … … 89 124 var min = worst.Quality; 90 125 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 91 138 Results.Add(new Result("Nest with maximum T", new IntValue(worst.Index + 1))); 92 139 Results.Add(new Result("Maximum T", new IntValue(min))); 140 Results.Add(new Result("BestQuality", new DoubleValue(min))); 93 141 Results.Add(new Result("Best Solution Found At", new TimeSpanValue(ExecutionTime))); 94 142 Results.Add(new Result("Delta T", new PercentValue((min - Problem.BestKnownQuality) / Problem.BestKnownQuality))); 95 143 Results.Add(new Result("Nest Results", algorithmsResults)); 144 Results.Add(new Result("QualityPerClock", qualityPerClock)); 145 Results.Add(new Result("QualityPerEvaluations", qualityPerEvaluations)); 96 146 97 147 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(); 98 161 } 99 162 … … 106 169 qualities[worst.Index] = (int)((DoubleValue)algorithms[worst.Index].Results["BestQuality"].Value).Value; 107 170 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 108 179 if (worst.Quality < min) { 109 180 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)); 114 188 } 189 115 190 if (cancellationToken.IsCancellationRequested) return; 116 191 }
Note: See TracChangeset
for help on using the changeset viewer.