示例#1
0
        public bool FindInsertionPlace(int city, int routeToAvoid, bool allowInfeasible, out int route, out int place)
        {
            route = -1;
            place = -1;
            double minDetour = double.MaxValue;

            VRPEvaluation eval             = ProblemInstance.Evaluate(this);
            bool          originalFeasible = ProblemInstance.Feasible(eval);

            for (int tour = 0; tour < Tours.Count; tour++)
            {
                if (tour != routeToAvoid)
                {
                    double length = eval.Quality;

                    for (int i = 0; i <= Tours[tour].Stops.Count; i++)
                    {
                        bool   feasible;
                        double detour = ProblemInstance.GetInsertionCosts(eval, this, city, tour, i, out feasible);

                        if (feasible || allowInfeasible)
                        {
                            if (route < 0 || detour < minDetour)
                            {
                                route     = tour;
                                place     = i;
                                minDetour = detour;
                            }
                        }
                    }
                }
            }

            return(route >= 0 && place >= 0);
        }
示例#2
0
 private void EvalBestKnownSolution()
 {
     if (BestKnownSolution != null)
     {
         //call evaluator
         BestKnownQuality          = new DoubleValue(ProblemInstance.Evaluate(BestKnownSolution.Solution).Quality);
         BestKnownSolution.Quality = BestKnownQuality;
     }
     else
     {
         BestKnownQuality = null;
     }
 }
 private void EvalBestKnownSolution()
 {
     if (BestKnownSolution == null)
     {
         return;
     }
     try {
         //call evaluator
         BestKnownQuality          = new DoubleValue(ProblemInstance.Evaluate(BestKnownSolution.Solution).Quality);
         BestKnownSolution.Quality = BestKnownQuality;
     } catch {
         BestKnownQuality  = null;
         BestKnownSolution = null;
     }
 }
        protected override void PerformMove()
        {
            PotvinCustomerRelocationMove move = CustomerRelocationMoveParameter.ActualValue;

            PotvinEncoding newSolution = move.Individual.Clone() as PotvinEncoding;

            Apply(newSolution, move, ProblemInstance);
            newSolution.Repair();
            VRPToursParameter.ActualValue = newSolution;

            //reset move quality
            VRPEvaluation eval = ProblemInstance.Evaluate(newSolution);

            MoveQualityParameter.ActualValue.Value = eval.Quality;

            //update memory
            VariableCollection memory = MemoriesParameter.ActualValue;
            string             key    = AdditionFrequencyMemoryKeyParameter.Value.Value;

            if (memory != null)
            {
                if (!memory.ContainsKey(key))
                {
                    memory.Add(new Variable(key,
                                            new ItemDictionary <PotvinCustomerRelocationMoveAttribute, IntValue>()));
                }
                ItemDictionary <PotvinCustomerRelocationMoveAttribute, IntValue> additionFrequency =
                    memory[key].Value as ItemDictionary <PotvinCustomerRelocationMoveAttribute, IntValue>;

                PotvinCustomerRelocationMoveAttribute attr = new PotvinCustomerRelocationMoveAttribute(0, move.Tour, move.City);
                if (!additionFrequency.ContainsKey(attr))
                {
                    additionFrequency[attr] = new IntValue(0);
                }

                additionFrequency[attr].Value++;
            }
        }
 protected double GetQuality(PrinsEncoding individual)
 {
     return(ProblemInstance.Evaluate(individual).Quality);
 }