- Timestamp:
- 07/25/10 01:04:14 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs
r4047 r4098 120 120 set { BestKnownSolutionParameter.Value = value; } 121 121 } 122 private List<IOperator> operators;123 122 public IEnumerable<IOperator> Operators { 124 123 get { return operators; } … … 129 128 #endregion 130 129 130 [Storable] 131 private List<IOperator> operators; 132 133 [StorableConstructor] 134 private TravelingSalesmanProblem(bool deserializing) : base() { } 131 135 public TravelingSalesmanProblem() 132 136 : base() { … … 155 159 ParameterizeEvaluator(); 156 160 157 Initialize(); 158 } 159 [StorableConstructor] 160 private TravelingSalesmanProblem(bool deserializing) : base() { } 161 InitializeOperators(); 162 AttachEventHandlers(); 163 } 161 164 162 165 public override IDeepCloneable Clone(Cloner cloner) { 163 166 TravelingSalesmanProblem clone = (TravelingSalesmanProblem)base.Clone(cloner); 167 clone.operators = operators.Select(x => (IOperator)cloner.Clone(x)).ToList(); 164 168 clone.DistanceMatrixParameter.Value = DistanceMatrixParameter.Value; 165 clone. Initialize();169 clone.AttachEventHandlers(); 166 170 return clone; 167 171 } 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 168 344 169 345 public void ImportFromTSPLIB(string tspFileName, string optimalTourFileName) { … … 197 373 BestKnownQuality = new DoubleValue(bestKnownQuality); 198 374 } 199 200 #region Events201 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 #endregion272 273 #region Helpers274 [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 #endregion369 375 } 370 376 }
Note: See TracChangeset
for help on using the changeset viewer.