Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/20/10 16:35:42 (14 years ago)
Author:
abeham
Message:

Updated StochasticMultiOperator and Multicrossover/Multimutation #976

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Operators/3.3/StochasticMultiOperator.cs

    r3425 r3445  
    3838  public abstract class StochasticMultiOperator<T> : MultiOperator<T> where T : class, IOperator {
    3939    /// <summary>
    40     /// Returns false by default. If this is overriden to return true, there will be an automatic type discovery
    41     /// of all instantiable types of T (except the own type) and instances will be added to the Operators list.
    42     /// </summary>
    43     public virtual bool AutomaticTypeDiscovery { get { return false; } }
    44     /// <summary>
    4540    /// Should return true if the StochasticMultiOperator should create a new child operation with the selected successor
    4641    /// or if it should create a new operation. If you need to shield the parameters of the successor you should return true here.
     
    7065      Parameters.Add(new ValueLookupParameter<DoubleArray>("Probabilities", "The array of relative probabilities for each operator.", new DoubleArray()));
    7166      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator to use."));
    72       Initialize();
    7367    }
    7468
    75     [StorableHook(HookType.AfterDeserialization)]
    76     private void Initialize() {
    77       Operators.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Operators_ItemsAdded);
    78       Operators.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Operators_ItemsRemoved);
    79       Operators.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Operators_ItemsMoved);
    80       if (AutomaticTypeDiscovery) {
    81         IEnumerable<Type> types = ApplicationManager.Manager.GetTypes(typeof(T), true);
    82         foreach (Type type in types.OrderBy(x => x.FullName)) {
    83           if (type != this.GetType())
    84             Operators.Add((T)Activator.CreateInstance(type));
    85         }
    86       }
    87     }
    88 
    89     void Operators_ItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
    90       if (Probabilities != null) {
    91         DoubleArray oldProb = (DoubleArray)Probabilities.Clone();
    92         foreach (IndexedItem<T> old in e.OldItems) {
    93           foreach (IndexedItem<T> item in e.Items) {
    94             if (old.Value == item.Value && item.Index < Probabilities.Length && old.Index < oldProb.Length)
    95               Probabilities[item.Index] = oldProb[old.Index];
    96           }
    97         }
    98       }
    99     }
    100 
    101     void Operators_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
     69    protected override void Operators_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
     70      base.Operators_ItemsRemoved(sender, e);
    10271      if (Probabilities != null && Probabilities.Length > Operators.Count) {
    10372        List<double> probs = new List<double>(Probabilities.Cast<double>());
     
    10978    }
    11079
    111     private void Operators_ItemsAdded(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
     80    protected override void Operators_ItemsAdded(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
     81      base.Operators_ItemsAdded(sender, e);
    11282      if (Probabilities != null && Probabilities.Length < Operators.Count) {
    11383        DoubleArray probs = new DoubleArray(Operators.Count);
    11484        double avg = 0;
    11585        if (Probabilities.Length > 0) {
    116           for (int i = 0; i < Probabilities.Length; i++)
    117             avg += Probabilities[i];
    118           avg /= (double)Probabilities.Length;
     86          int zeros = 0;
     87          for (int i = 0; i < Probabilities.Length; i++) {
     88            if (Probabilities[i] == 0) zeros++;
     89            else avg += Probabilities[i];
     90          }
     91          if (Probabilities.Length - zeros > 0)
     92            avg /= (double)(Probabilities.Length - zeros);
     93          else avg = 1;
    11994        } else avg = 1;
    12095
Note: See TracChangeset for help on using the changeset viewer.