Beispiel #1
0
        private static List <Type> GetMostSpecificMoveOperatorTypes(IMoveGenerator generator)
        {
            List <Type> moveTypes = generator.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);
                }
            }
            return(moveTypes);
        }
        private void UpdateMoveOperators()
        {
            IMoveGenerator oldMoveGenerator = MoveGenerator;
            IMoveMaker     oldMoveMaker     = MoveMaker;
            ISingleObjectiveMoveEvaluator oldMoveEvaluator = MoveEvaluator;

            ClearMoveParameters();

            if (problem != null)
            {
                foreach (IMultiMoveGenerator generator in problem.Operators.OfType <IMultiMoveGenerator>().OrderBy(x => x.Name))
                {
                    MoveGeneratorParameter.ValidValues.Add(generator);
                }
                foreach (IExhaustiveMoveGenerator generator in problem.Operators.OfType <IExhaustiveMoveGenerator>().OrderBy(x => x.Name))
                {
                    MoveGeneratorParameter.ValidValues.Add(generator);
                }

                if (oldMoveGenerator != null)
                {
                    IMoveGenerator newMoveGenerator = MoveGeneratorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveGenerator.GetType());
                    if (newMoveGenerator != null)
                    {
                        MoveGenerator = newMoveGenerator;
                    }
                }

                ChooseMoveOperators(oldMoveMaker, oldMoveEvaluator);
            }
        }
Beispiel #3
0
        private void UpdateMoveGenerator()
        {
            IMoveGenerator oldMoveGenerator     = MoveGenerator;
            IMoveGenerator defaultMoveGenerator = Problem.Operators.OfType <IMoveGenerator>().FirstOrDefault();

            MoveGeneratorParameter.ValidValues.Clear();
            if (Problem != null)
            {
                foreach (IMoveGenerator generator in Problem.Operators.OfType <IMoveGenerator>().OrderBy(x => x.Name))
                {
                    MoveGeneratorParameter.ValidValues.Add(generator);
                }
            }
            if (oldMoveGenerator != null)
            {
                IMoveGenerator newMoveGenerator = MoveGeneratorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveGenerator.GetType());
                if (newMoveGenerator != null)
                {
                    MoveGenerator = newMoveGenerator;
                }
                else
                {
                    oldMoveGenerator = null;
                }
            }
            if (oldMoveGenerator == null && defaultMoveGenerator != null)
            {
                MoveGenerator = defaultMoveGenerator;
            }
            if (MoveGenerator == null)
            {
                ClearMoveParameters();
            }
        }
Beispiel #4
0
        private void UpdateMoveGenerator()
        {
            IMoveGenerator oldMoveGenerator     = MoveGenerator;
            IMoveGenerator defaultMoveGenerator = Problem.Operators.OfType <IMoveGenerator>().FirstOrDefault();

            MoveGeneratorParameter.ValidValues.Clear();
            if (Problem != null)
            {
                // only add move generators that also have a corresponding tabu-checker and tabu-maker
                foreach (IMoveGenerator generator in Problem.Operators.OfType <IMoveGenerator>().OrderBy(x => x.Name))
                {
                    // get all interfaces equal to or derived from IMoveOperator that this move generator implements
                    var moveTypes = generator.GetType().GetInterfaces().Where(x => typeof(IMoveOperator).IsAssignableFrom(x)).ToList();
                    // keep only the most specific interfaces (e.g. IPermutationTranslocationMoveOperator);
                    // by removing all interfaces for which a derived interface is also contained in the moveTypes set
                    foreach (var type in moveTypes.ToList())
                    {
                        if (moveTypes.Any(t => t != type && type.IsAssignableFrom(t)))
                        {
                            moveTypes.Remove(type);
                        }
                    }
                    // keep move generator only if there is a tabu checker and a tabu maker that is derived from the same move interface
                    if (Problem.Operators.OfType <ITabuChecker>().Any(op => moveTypes.Any(m => m.IsInstanceOfType(op))) &&
                        Problem.Operators.OfType <ITabuMaker>().Any(op => moveTypes.Any(m => m.IsInstanceOfType(op))))
                    {
                        MoveGeneratorParameter.ValidValues.Add(generator);
                    }
                }
            }
            if (oldMoveGenerator != null && MoveGeneratorParameter.ValidValues.Any(x => x.GetType() == oldMoveGenerator.GetType()))
            {
                MoveGenerator = MoveGeneratorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveGenerator.GetType());
            }
            if (MoveGenerator == null && defaultMoveGenerator != null)
            {
                MoveGenerator = defaultMoveGenerator;
            }

            if (MoveGenerator == null)
            {
                ClearMoveParameters();
            }
        }