Changeset 18230 for branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Mutators/NestedOptimizerSubVectorImprovementManipulator.cs
- Timestamp:
- 03/07/22 15:45:30 (2 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Mutators/NestedOptimizerSubVectorImprovementManipulator.cs
r18229 r18230 94 94 95 95 #region Parameter Properties 96 public IConstrainedValueParameter<IAlgorithm> NestedOptimizerParameter {97 get { return ( IConstrainedValueParameter<IAlgorithm>)Parameters["NestedOptimizer"]; }96 public OptionalConstrainedValueParameter<IAlgorithm> NestedOptimizerParameter { 97 get { return (OptionalConstrainedValueParameter<IAlgorithm>)Parameters["NestedOptimizer"]; } 98 98 } 99 99 … … 119 119 var rs = new RandomSearchAlgorithm() { 120 120 Problem = problem, 121 BatchSize = 10 ,122 MaximumEvaluatedSolutions = 100 121 BatchSize = 100, 122 MaximumEvaluatedSolutions = 1000 123 123 }; 124 124 … … 126 126 Problem = problem, 127 127 PlusSelection = new BoolValue(true), 128 PopulationSize = new IntValue(1 ),128 PopulationSize = new IntValue(10), 129 129 Children = new IntValue(10), 130 130 MaximumGenerations = new IntValue(100) … … 158 158 var optimizers = new ItemSet<IAlgorithm>() { rs, es, ga, osga }; 159 159 160 Parameters.Add(new ConstrainedValueParameter<IAlgorithm>("NestedOptimizer", optimizers, rs));160 Parameters.Add(new OptionalConstrainedValueParameter<IAlgorithm>("NestedOptimizer", optimizers, rs)); 161 161 Parameters.Add(new FixedValueParameter<PercentValue>("PercentOptimizedSubVectorNodes", new PercentValue(1.0))); 162 162 } … … 170 170 [StorableConstructor] 171 171 private NestedOptimizerSubVectorImprovementManipulator(StorableConstructorFlag _) : base(_) { } 172 [StorableHook(HookType.AfterDeserialization)] 173 private void AfterDeserialization() { 174 if (Parameters.TryGetValue("NestedOptimizer", out var param)) { 175 if (param is ConstrainedValueParameter<IAlgorithm> constrainedParam) { 176 Parameters.Remove("NestedOptimizer"); 177 Parameters.Add(new OptionalConstrainedValueParameter<IAlgorithm>("NestedOptimizer", 178 new ItemSet<IAlgorithm>(constrainedParam.ValidValues), constrainedParam.Value) 179 ); 180 } 181 } 182 } 172 183 173 184 public override void Manipulate(IRandom random, ISymbolicExpressionTree symbolicExpressionTree) { 185 if (NestedOptimizer == null) 186 return; 187 174 188 int vectorLengths = GetVectorLengths(ProblemDataParameter.ActualValue); 175 189 … … 183 197 algorithm.Start(CancellationToken); 184 198 185 if (algorithm.ExecutionState != ExecutionState.Stopped) 186 throw new InvalidOperationException("Nested Algorithm did not finish."); 187 199 //if (algorithm.ExecutionState != ExecutionState.Stopped) 200 // return; 201 202 if (!algorithm.Results.ContainsKey(BestSolutionParameterName)) 203 return; 204 205 // use the latest best result 188 206 var solution = (IntegerVector)algorithm.Results[BestSolutionParameterName].Value; 189 207 UpdateFromVector(symbolicExpressionTree, selectedSubVectorNodes, solution, vectorLengths); … … 204 222 } 205 223 206 private static int GetVectorLengths(T problemData) { 224 private static int GetVectorLengths(T problemData) { // ToDo evaluate a tree to get vector length per node 207 225 var vectorLengths = problemData.Dataset.DoubleVectorVariables 208 226 .Select(v => problemData.Dataset.GetDoubleVectorValue(v, row: 0).Count) … … 217 235 foreach (var nodeIdx in selectedNodes) { 218 236 var node = nodes[nodeIdx]; 219 node.Offset = (double)solution[i++] / (vectorLength - 1); 220 node.Length = (double)solution[i++] / (vectorLength - 1); 237 node.Offset = (double)solution[i++] / (vectorLength - 1); // round in case of float 238 node.Length = (double)solution[i++] / (vectorLength - 1); // round in case of float 221 239 } 222 240 } … … 231 249 return tree.Root.GetSubtree(0).GetSubtree(0); 232 250 } 233 234 251 } 235 252 }
Note: See TracChangeset
for help on using the changeset viewer.