public override IOperation Apply() { IVRPMove move = VRPMoveParameter.ActualValue as IVRPMove; ITabuMaker moveTabuMaker = move.GetTabuMaker(); (moveTabuMaker as IVRPMoveOperator).VRPMoveParameter.ActualName = VRPMoveParameter.Name; OperationCollection next = new OperationCollection(base.Apply()); next.Insert(0, ExecutionContext.CreateOperation(moveTabuMaker)); return(next); }
private void UpdateMoveParameters() { IMoveMaker oldMoveMaker = MoveMaker; ISingleObjectiveMoveEvaluator oldMoveEvaluator = MoveEvaluator; ITabuChecker oldTabuChecker = TabuChecker; ITabuMaker oldTabuMoveMaker = TabuMaker; ClearMoveParameters(); if (MoveGenerator != null) { List <Type> moveTypes = MoveGenerator.GetType().GetInterfaces().Where(x => typeof(IMoveOperator).IsAssignableFrom(x)).ToList(); foreach (Type type in moveTypes.ToList()) { if (moveTypes.Any(t => t != type && type.IsAssignableFrom(t))) { moveTypes.Remove(type); } } var operators = Problem.Operators.Where(op => moveTypes.Any(m => m.IsInstanceOfType(op))).ToList(); IMoveMaker defaultMoveMaker = operators.OfType <IMoveMaker>().FirstOrDefault(); ISingleObjectiveMoveEvaluator defaultMoveEvaluator = operators.OfType <ISingleObjectiveMoveEvaluator>().FirstOrDefault(); ITabuChecker defaultTabuChecker = operators.OfType <ITabuChecker>().FirstOrDefault(); ITabuMaker defaultTabuMaker = operators.OfType <ITabuMaker>().FirstOrDefault(); foreach (IMoveMaker moveMaker in operators.OfType <IMoveMaker>()) { MoveMakerParameter.ValidValues.Add(moveMaker); } foreach (ISingleObjectiveMoveEvaluator moveEvaluator in operators.OfType <ISingleObjectiveMoveEvaluator>()) { MoveEvaluatorParameter.ValidValues.Add(moveEvaluator); } foreach (ITabuChecker tabuMoveEvaluator in operators.OfType <ITabuChecker>()) { TabuCheckerParameter.ValidValues.Add(tabuMoveEvaluator); } foreach (ITabuMaker tabuMoveMaker in operators.OfType <ITabuMaker>()) { TabuMakerParameter.ValidValues.Add(tabuMoveMaker); } if (oldMoveMaker != null) { IMoveMaker mm = MoveMakerParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveMaker.GetType()); if (mm != null) { MoveMaker = mm; } else { oldMoveMaker = null; } } if (oldMoveMaker == null && defaultMoveMaker != null) { MoveMaker = defaultMoveMaker; } if (oldMoveEvaluator != null) { ISingleObjectiveMoveEvaluator me = MoveEvaluatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveEvaluator.GetType()); if (me != null) { MoveEvaluator = me; } else { oldMoveEvaluator = null; } } if (oldMoveEvaluator == null && defaultMoveEvaluator != null) { MoveEvaluator = defaultMoveEvaluator; } if (oldTabuMoveMaker != null) { ITabuMaker tmm = TabuMakerParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldTabuMoveMaker.GetType()); if (tmm != null) { TabuMaker = tmm; } else { oldTabuMoveMaker = null; } } if (oldTabuMoveMaker == null && defaultTabuMaker != null) { TabuMaker = defaultTabuMaker; } if (oldTabuChecker != null) { ITabuChecker tme = TabuCheckerParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldTabuChecker.GetType()); if (tme != null) { TabuChecker = tme; } else { oldTabuChecker = null; } } if (oldTabuChecker == null && defaultTabuChecker != null) { TabuChecker = defaultTabuChecker; } } }