Changeset 12922 for branches/HeuristicLab.Algorithms.IteratedSentenceConstruction/HeuristicLab.Algorithms.IteratedSymbolicExpressionConstruction/3.3/QualityFunctions/TabularAvgQualityFunction.cs
- Timestamp:
- 08/27/15 16:55:07 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.Algorithms.IteratedSentenceConstruction/HeuristicLab.Algorithms.IteratedSymbolicExpressionConstruction/3.3/QualityFunctions/TabularAvgQualityFunction.cs
r12909 r12922 9 9 [StorableClass] 10 10 [Item("TabularAvgQualityFunction", "")] 11 internal class TabularAvgQualityFunction : ParameterizedNamedItem, ITabularQualityFunction { 12 [Storable] 13 private readonly Dictionary<object, Dictionary<int, double>> q = new Dictionary<object, Dictionary<int, double>>(); 14 [Storable] 15 private readonly Dictionary<object, Dictionary<int, int>> tries = new Dictionary<object, Dictionary<int, int>>(); 11 internal class TabularAvgQualityFunction : TabularQualityFunctionBase { 16 12 17 public IStateFunction StateFunction { 18 get { 19 return ((IValueParameter<IStateFunction>)Parameters["State function"]).Value; 20 } 21 set { ((IValueParameter<IStateFunction>)Parameters["State function"]).Value = value; } 22 } 23 24 public TabularAvgQualityFunction() { 25 Parameters.Add(new ValueParameter<IStateFunction>("State function", "The function that is used to map partial trees to states", new DefaultStateFunction())); 26 } 27 28 public double Q(object state, int action) { 29 // an action that has never been tried has q == infinity 30 Dictionary<int, double> stateActionQualities; 31 if (!q.TryGetValue(state, out stateActionQualities)) return double.PositiveInfinity; 32 double quality; 33 if (!stateActionQualities.TryGetValue(action, out quality)) return double.PositiveInfinity; 34 return quality; 35 } 36 37 public void Update(object state, int action, double observedQuality) { 38 Dictionary<int, int> stateActionTries; 39 if (!tries.TryGetValue(state, out stateActionTries)) { 40 stateActionTries = new Dictionary<int, int>(); 41 tries.Add(state, stateActionTries); 42 } 43 Dictionary<int, double> stateActionQualities = null; 44 if (!q.TryGetValue(state, out stateActionQualities)) { 45 stateActionQualities = new Dictionary<int, double>(); 46 q.Add(state, stateActionQualities); 47 } 48 int t; 49 if (!stateActionTries.TryGetValue(action, out t)) { 50 t = 0; 51 stateActionTries.Add(action, t + 1); 52 stateActionQualities.Add(action, observedQuality); 53 } else { 54 stateActionTries[action] = t + 1; 55 var delta = observedQuality - stateActionQualities[action]; 56 stateActionQualities[action] = stateActionQualities[action] + (1.0 / (t + 1)) * delta; // incremental calculation of average 57 } 58 } 59 60 public int Tries(object state, int action) { 61 Dictionary<int, int> stateTries; 62 if (!tries.TryGetValue(state, out stateTries)) return 0; 63 int stateActionTries; 64 if (!stateTries.TryGetValue(action, out stateActionTries)) return 0; 65 return stateActionTries; 13 public TabularAvgQualityFunction() 14 : base() { 66 15 } 67 16 … … 71 20 protected TabularAvgQualityFunction(TabularAvgQualityFunction original, Cloner cloner) 72 21 : base(original, cloner) { 73 this.q = new Dictionary<object, Dictionary<int, double>>(original.q);74 this.tries = new Dictionary<object, Dictionary<int, int>>(original.tries);75 22 } 76 23 public override IDeepCloneable Clone(Cloner cloner) { … … 79 26 #endregion 80 27 81 public void InitializeState() { 82 ClearState(); 83 } 84 85 public void ClearState() { 86 q.Clear(); 87 tries.Clear(); 28 protected override double CalculateNewQ(object state, int action, double observedQuality) { 29 var delta = observedQuality - Q(state, action); 30 return Q(state, action) + (1.0 / Tries(state, action)) * delta; // iterative calculation of mean 88 31 } 89 32 }
Note: See TracChangeset
for help on using the changeset viewer.