Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/25/10 01:04:14 (14 years ago)
Author:
abeham
Message:

#1090

  • Fixed initialization of operators and made operator list storable
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs

    r4047 r4098  
    120120      set { BestKnownSolutionParameter.Value = value; }
    121121    }
    122     private List<IOperator> operators;
    123122    public IEnumerable<IOperator> Operators {
    124123      get { return operators; }
     
    129128    #endregion
    130129
     130    [Storable]
     131    private List<IOperator> operators;
     132
     133    [StorableConstructor]
     134    private TravelingSalesmanProblem(bool deserializing) : base() { }
    131135    public TravelingSalesmanProblem()
    132136      : base() {
     
    155159      ParameterizeEvaluator();
    156160
    157       Initialize();
    158     }
    159     [StorableConstructor]
    160     private TravelingSalesmanProblem(bool deserializing) : base() { }
     161      InitializeOperators();
     162      AttachEventHandlers();
     163    }
    161164
    162165    public override IDeepCloneable Clone(Cloner cloner) {
    163166      TravelingSalesmanProblem clone = (TravelingSalesmanProblem)base.Clone(cloner);
     167      clone.operators = operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
    164168      clone.DistanceMatrixParameter.Value = DistanceMatrixParameter.Value;
    165       clone.Initialize();
     169      clone.AttachEventHandlers();
    166170      return clone;
    167171    }
     172
     173    #region Events
     174    public event EventHandler SolutionCreatorChanged;
     175    private void OnSolutionCreatorChanged() {
     176      EventHandler handler = SolutionCreatorChanged;
     177      if (handler != null) handler(this, EventArgs.Empty);
     178    }
     179    public event EventHandler EvaluatorChanged;
     180    private void OnEvaluatorChanged() {
     181      EventHandler handler = EvaluatorChanged;
     182      if (handler != null) handler(this, EventArgs.Empty);
     183    }
     184    public event EventHandler OperatorsChanged;
     185    private void OnOperatorsChanged() {
     186      EventHandler handler = OperatorsChanged;
     187      if (handler != null) handler(this, EventArgs.Empty);
     188    }
     189    public event EventHandler Reset;
     190    private void OnReset() {
     191      EventHandler handler = Reset;
     192      if (handler != null) handler(this, EventArgs.Empty);
     193    }
     194
     195    private void CoordinatesParameter_ValueChanged(object sender, EventArgs e) {
     196      Coordinates.ItemChanged += new EventHandler<EventArgs<int, int>>(Coordinates_ItemChanged);
     197      Coordinates.Reset += new EventHandler(Coordinates_Reset);
     198      ParameterizeSolutionCreator();
     199      ClearDistanceMatrix();
     200    }
     201    private void Coordinates_ItemChanged(object sender, EventArgs<int, int> e) {
     202      ClearDistanceMatrix();
     203    }
     204    private void Coordinates_Reset(object sender, EventArgs e) {
     205      ParameterizeSolutionCreator();
     206      ClearDistanceMatrix();
     207    }
     208    private void SolutionCreatorParameter_ValueChanged(object sender, EventArgs e) {
     209      SolutionCreator.PermutationParameter.ActualNameChanged += new EventHandler(SolutionCreator_PermutationParameter_ActualNameChanged);
     210      ParameterizeSolutionCreator();
     211      ParameterizeEvaluator();
     212      ParameterizeAnalyzer();
     213      ParameterizeOperators();
     214      OnSolutionCreatorChanged();
     215    }
     216    private void SolutionCreator_PermutationParameter_ActualNameChanged(object sender, EventArgs e) {
     217      ParameterizeEvaluator();
     218      ParameterizeAnalyzer();
     219      ParameterizeOperators();
     220    }
     221    private void EvaluatorParameter_ValueChanged(object sender, EventArgs e) {
     222      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
     223      ParameterizeEvaluator();
     224      UpdateMoveEvaluators();
     225      ParameterizeAnalyzer();
     226      ClearDistanceMatrix();
     227      OnEvaluatorChanged();
     228    }
     229    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
     230      ParameterizeAnalyzer();
     231    }
     232    private void MoveGenerator_InversionMoveParameter_ActualNameChanged(object sender, EventArgs e) {
     233      string name = ((ILookupParameter<InversionMove>)sender).ActualName;
     234      foreach (IPermutationInversionMoveOperator op in Operators.OfType<IPermutationInversionMoveOperator>()) {
     235        op.InversionMoveParameter.ActualName = name;
     236      }
     237    }
     238    private void MoveGenerator_TranslocationMoveParameter_ActualNameChanged(object sender, EventArgs e) {
     239      string name = ((ILookupParameter<TranslocationMove>)sender).ActualName;
     240      foreach (IPermutationTranslocationMoveOperator op in Operators.OfType<IPermutationTranslocationMoveOperator>()) {
     241        op.TranslocationMoveParameter.ActualName = name;
     242      }
     243    }
     244    #endregion
     245
     246    #region Helpers
     247    [StorableHook(HookType.AfterDeserialization)]
     248    private void AttachEventHandlers() {
     249      // Start BackwardsCompatibility3.3 (remove with 3.4)
     250      if (operators == null) InitializeOperators();
     251      // End BackwardsCompatibility3.3
     252      CoordinatesParameter.ValueChanged += new EventHandler(CoordinatesParameter_ValueChanged);
     253      Coordinates.ItemChanged += new EventHandler<EventArgs<int, int>>(Coordinates_ItemChanged);
     254      Coordinates.Reset += new EventHandler(Coordinates_Reset);
     255      SolutionCreatorParameter.ValueChanged += new EventHandler(SolutionCreatorParameter_ValueChanged);
     256      SolutionCreator.PermutationParameter.ActualNameChanged += new EventHandler(SolutionCreator_PermutationParameter_ActualNameChanged);
     257      EvaluatorParameter.ValueChanged += new EventHandler(EvaluatorParameter_ValueChanged);
     258      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
     259    }
     260
     261    private void InitializeOperators() {
     262      operators = new List<IOperator>();
     263      operators.Add(new BestTSPSolutionAnalyzer());
     264      ParameterizeAnalyzer();
     265      operators.AddRange(ApplicationManager.Manager.GetInstances<IPermutationOperator>().Cast<IOperator>());
     266      ParameterizeOperators();
     267      UpdateMoveEvaluators();
     268      InitializeMoveGenerators();
     269    }
     270    private void InitializeMoveGenerators() {
     271      foreach (IPermutationInversionMoveOperator op in Operators.OfType<IPermutationInversionMoveOperator>()) {
     272        if (op is IMoveGenerator) {
     273          op.InversionMoveParameter.ActualNameChanged += new EventHandler(MoveGenerator_InversionMoveParameter_ActualNameChanged);
     274        }
     275      }
     276      foreach (IPermutationTranslocationMoveOperator op in Operators.OfType<IPermutationTranslocationMoveOperator>()) {
     277        if (op is IMoveGenerator) {
     278          op.TranslocationMoveParameter.ActualNameChanged += new EventHandler(MoveGenerator_TranslocationMoveParameter_ActualNameChanged);
     279        }
     280      }
     281    }
     282    private void UpdateMoveEvaluators() {
     283      operators.RemoveAll(x => x is ISingleObjectiveMoveEvaluator);
     284      foreach (ITSPPathMoveEvaluator op in ApplicationManager.Manager.GetInstances<ITSPPathMoveEvaluator>())
     285        if (op.EvaluatorType == Evaluator.GetType()) {
     286          operators.Add(op);
     287        }
     288      ParameterizeOperators();
     289      OnOperatorsChanged();
     290    }
     291    private void ParameterizeSolutionCreator() {
     292      SolutionCreator.LengthParameter.Value = new IntValue(Coordinates.Rows);
     293      SolutionCreator.PermutationTypeParameter.Value = new PermutationType(PermutationTypes.RelativeUndirected);
     294    }
     295    private void ParameterizeEvaluator() {
     296      if (Evaluator is ITSPPathEvaluator)
     297        ((ITSPPathEvaluator)Evaluator).PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
     298      if (Evaluator is ITSPCoordinatesPathEvaluator) {
     299        ITSPCoordinatesPathEvaluator evaluator = (ITSPCoordinatesPathEvaluator)Evaluator;
     300        evaluator.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
     301        evaluator.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name;
     302        evaluator.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
     303      }
     304    }
     305    private void ParameterizeAnalyzer() {
     306      BestTSPSolutionAnalyzer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
     307      BestTSPSolutionAnalyzer.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
     308      BestTSPSolutionAnalyzer.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
     309      BestTSPSolutionAnalyzer.ResultsParameter.ActualName = "Results";
     310      BestTSPSolutionAnalyzer.BestKnownQualityParameter.ActualName = BestKnownQualityParameter.Name;
     311      BestTSPSolutionAnalyzer.BestKnownSolutionParameter.ActualName = BestKnownSolutionParameter.Name;
     312      BestTSPSolutionAnalyzer.MaximizationParameter.ActualName = MaximizationParameter.Name;
     313    }
     314    private void ParameterizeOperators() {
     315      foreach (IPermutationCrossover op in Operators.OfType<IPermutationCrossover>()) {
     316        op.ParentsParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
     317        op.ChildParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
     318      }
     319      foreach (IPermutationManipulator op in Operators.OfType<IPermutationManipulator>()) {
     320        op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
     321      }
     322      foreach (IPermutationMoveOperator op in Operators.OfType<IPermutationMoveOperator>()) {
     323        op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
     324      }
     325      foreach (ITSPPathMoveEvaluator op in Operators.OfType<ITSPPathMoveEvaluator>()) {
     326        op.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
     327        op.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name;
     328        op.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
     329        op.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
     330        op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
     331      }
     332      string inversionMove = Operators.OfType<IMoveGenerator>().OfType<IPermutationInversionMoveOperator>().First().InversionMoveParameter.ActualName;
     333      foreach (IPermutationInversionMoveOperator op in Operators.OfType<IPermutationInversionMoveOperator>())
     334        op.InversionMoveParameter.ActualName = inversionMove;
     335      string translocationMove = Operators.OfType<IMoveGenerator>().OfType<IPermutationTranslocationMoveOperator>().First().TranslocationMoveParameter.ActualName;
     336      foreach (IPermutationTranslocationMoveOperator op in Operators.OfType<IPermutationTranslocationMoveOperator>())
     337        op.TranslocationMoveParameter.ActualName = translocationMove;
     338    }
     339
     340    private void ClearDistanceMatrix() {
     341      DistanceMatrixParameter.Value = null;
     342    }
     343    #endregion
    168344
    169345    public void ImportFromTSPLIB(string tspFileName, string optimalTourFileName) {
     
    197373      BestKnownQuality = new DoubleValue(bestKnownQuality);
    198374    }
    199 
    200     #region Events
    201     public event EventHandler SolutionCreatorChanged;
    202     private void OnSolutionCreatorChanged() {
    203       EventHandler handler = SolutionCreatorChanged;
    204       if (handler != null) handler(this, EventArgs.Empty);
    205     }
    206     public event EventHandler EvaluatorChanged;
    207     private void OnEvaluatorChanged() {
    208       EventHandler handler = EvaluatorChanged;
    209       if (handler != null) handler(this, EventArgs.Empty);
    210     }
    211     public event EventHandler OperatorsChanged;
    212     private void OnOperatorsChanged() {
    213       EventHandler handler = OperatorsChanged;
    214       if (handler != null) handler(this, EventArgs.Empty);
    215     }
    216     public event EventHandler Reset;
    217     private void OnReset() {
    218       EventHandler handler = Reset;
    219       if (handler != null) handler(this, EventArgs.Empty);
    220     }
    221 
    222     private void CoordinatesParameter_ValueChanged(object sender, EventArgs e) {
    223       Coordinates.ItemChanged += new EventHandler<EventArgs<int, int>>(Coordinates_ItemChanged);
    224       Coordinates.Reset += new EventHandler(Coordinates_Reset);
    225       ParameterizeSolutionCreator();
    226       ClearDistanceMatrix();
    227     }
    228     private void Coordinates_ItemChanged(object sender, EventArgs<int, int> e) {
    229       ClearDistanceMatrix();
    230     }
    231     private void Coordinates_Reset(object sender, EventArgs e) {
    232       ParameterizeSolutionCreator();
    233       ClearDistanceMatrix();
    234     }
    235     private void SolutionCreatorParameter_ValueChanged(object sender, EventArgs e) {
    236       SolutionCreator.PermutationParameter.ActualNameChanged += new EventHandler(SolutionCreator_PermutationParameter_ActualNameChanged);
    237       ParameterizeSolutionCreator();
    238       ParameterizeEvaluator();
    239       ParameterizeAnalyzer();
    240       ParameterizeOperators();
    241       OnSolutionCreatorChanged();
    242     }
    243     private void SolutionCreator_PermutationParameter_ActualNameChanged(object sender, EventArgs e) {
    244       ParameterizeEvaluator();
    245       ParameterizeAnalyzer();
    246       ParameterizeOperators();
    247     }
    248     private void EvaluatorParameter_ValueChanged(object sender, EventArgs e) {
    249       Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
    250       ParameterizeEvaluator();
    251       UpdateMoveEvaluators();
    252       ParameterizeAnalyzer();
    253       ClearDistanceMatrix();
    254       OnEvaluatorChanged();
    255     }
    256     private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
    257       ParameterizeAnalyzer();
    258     }
    259     private void MoveGenerator_InversionMoveParameter_ActualNameChanged(object sender, EventArgs e) {
    260       string name = ((ILookupParameter<InversionMove>)sender).ActualName;
    261       foreach (IPermutationInversionMoveOperator op in Operators.OfType<IPermutationInversionMoveOperator>()) {
    262         op.InversionMoveParameter.ActualName = name;
    263       }
    264     }
    265     private void MoveGenerator_TranslocationMoveParameter_ActualNameChanged(object sender, EventArgs e) {
    266       string name = ((ILookupParameter<TranslocationMove>)sender).ActualName;
    267       foreach (IPermutationTranslocationMoveOperator op in Operators.OfType<IPermutationTranslocationMoveOperator>()) {
    268         op.TranslocationMoveParameter.ActualName = name;
    269       }
    270     }
    271     #endregion
    272 
    273     #region Helpers
    274     [StorableHook(HookType.AfterDeserialization)]
    275     private void Initialize() {
    276       InitializeOperators();
    277       CoordinatesParameter.ValueChanged += new EventHandler(CoordinatesParameter_ValueChanged);
    278       Coordinates.ItemChanged += new EventHandler<EventArgs<int, int>>(Coordinates_ItemChanged);
    279       Coordinates.Reset += new EventHandler(Coordinates_Reset);
    280       SolutionCreatorParameter.ValueChanged += new EventHandler(SolutionCreatorParameter_ValueChanged);
    281       SolutionCreator.PermutationParameter.ActualNameChanged += new EventHandler(SolutionCreator_PermutationParameter_ActualNameChanged);
    282       EvaluatorParameter.ValueChanged += new EventHandler(EvaluatorParameter_ValueChanged);
    283       Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
    284     }
    285 
    286     private void InitializeOperators() {
    287       operators = new List<IOperator>();
    288       operators.Add(new BestTSPSolutionAnalyzer());
    289       ParameterizeAnalyzer();
    290       operators.AddRange(ApplicationManager.Manager.GetInstances<IPermutationOperator>().Cast<IOperator>());
    291       ParameterizeOperators();
    292       UpdateMoveEvaluators();
    293       InitializeMoveGenerators();
    294     }
    295     private void InitializeMoveGenerators() {
    296       foreach (IPermutationInversionMoveOperator op in Operators.OfType<IPermutationInversionMoveOperator>()) {
    297         if (op is IMoveGenerator) {
    298           op.InversionMoveParameter.ActualNameChanged += new EventHandler(MoveGenerator_InversionMoveParameter_ActualNameChanged);
    299         }
    300       }
    301       foreach (IPermutationTranslocationMoveOperator op in Operators.OfType<IPermutationTranslocationMoveOperator>()) {
    302         if (op is IMoveGenerator) {
    303           op.TranslocationMoveParameter.ActualNameChanged += new EventHandler(MoveGenerator_TranslocationMoveParameter_ActualNameChanged);
    304         }
    305       }
    306     }
    307     private void UpdateMoveEvaluators() {
    308       operators.RemoveAll(x => x is ISingleObjectiveMoveEvaluator);
    309       foreach (ITSPPathMoveEvaluator op in ApplicationManager.Manager.GetInstances<ITSPPathMoveEvaluator>())
    310         if (op.EvaluatorType == Evaluator.GetType()) {
    311           operators.Add(op);
    312         }
    313       ParameterizeOperators();
    314       OnOperatorsChanged();
    315     }
    316     private void ParameterizeSolutionCreator() {
    317       SolutionCreator.LengthParameter.Value = new IntValue(Coordinates.Rows);
    318       SolutionCreator.PermutationTypeParameter.Value = new PermutationType(PermutationTypes.RelativeUndirected);
    319     }
    320     private void ParameterizeEvaluator() {
    321       if (Evaluator is ITSPPathEvaluator)
    322         ((ITSPPathEvaluator)Evaluator).PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
    323       if (Evaluator is ITSPCoordinatesPathEvaluator) {
    324         ITSPCoordinatesPathEvaluator evaluator = (ITSPCoordinatesPathEvaluator)Evaluator;
    325         evaluator.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
    326         evaluator.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name;
    327         evaluator.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
    328       }
    329     }
    330     private void ParameterizeAnalyzer() {
    331       BestTSPSolutionAnalyzer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
    332       BestTSPSolutionAnalyzer.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
    333       BestTSPSolutionAnalyzer.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
    334       BestTSPSolutionAnalyzer.ResultsParameter.ActualName = "Results";
    335       BestTSPSolutionAnalyzer.BestKnownQualityParameter.ActualName = BestKnownQualityParameter.Name;
    336       BestTSPSolutionAnalyzer.BestKnownSolutionParameter.ActualName = BestKnownSolutionParameter.Name;
    337       BestTSPSolutionAnalyzer.MaximizationParameter.ActualName = MaximizationParameter.Name;
    338     }
    339     private void ParameterizeOperators() {
    340       foreach (IPermutationCrossover op in Operators.OfType<IPermutationCrossover>()) {
    341         op.ParentsParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
    342         op.ChildParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
    343       }
    344       foreach (IPermutationManipulator op in Operators.OfType<IPermutationManipulator>()) {
    345         op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
    346       }
    347       foreach (IPermutationMoveOperator op in Operators.OfType<IPermutationMoveOperator>()) {
    348         op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
    349       }
    350       foreach (ITSPPathMoveEvaluator op in Operators.OfType<ITSPPathMoveEvaluator>()) {
    351         op.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
    352         op.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name;
    353         op.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
    354         op.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
    355         op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
    356       }
    357       string inversionMove = Operators.OfType<IMoveGenerator>().OfType<IPermutationInversionMoveOperator>().First().InversionMoveParameter.ActualName;
    358       foreach (IPermutationInversionMoveOperator op in Operators.OfType<IPermutationInversionMoveOperator>())
    359         op.InversionMoveParameter.ActualName = inversionMove;
    360       string translocationMove = Operators.OfType<IMoveGenerator>().OfType<IPermutationTranslocationMoveOperator>().First().TranslocationMoveParameter.ActualName;
    361       foreach (IPermutationTranslocationMoveOperator op in Operators.OfType<IPermutationTranslocationMoveOperator>())
    362         op.TranslocationMoveParameter.ActualName = translocationMove;
    363     }
    364 
    365     private void ClearDistanceMatrix() {
    366       DistanceMatrixParameter.Value = null;
    367     }
    368     #endregion
    369375  }
    370376}
Note: See TracChangeset for help on using the changeset viewer.