Пример #1
0
        public float Calculate()
        {
            float temperature = max_temperature;
            tour  current     = new tour();
            tour  next;

            current.route = new List <int>();
            // Create random route
            for (int i = 0; i < verticles; i++)
            {
                current.route.Add(i);
            }
            current.fitness = calculateTourCost(current);
            bestResult      = current.fitness;
            int iteration = 0;

            //iterations
            while (temperature > min_temperature && iteration < max_iterations)
            {
                if (current.fitness < bestResult)
                {
                    bestResult = current.fitness;
                }
                next       = new tour();
                next.route = new List <int>();
                for (int i = 0; i < current.route.Count; i++)
                {
                    next.route.Add(current.route[i]);
                }

                int verticleA, verticleB; //temp for swap
                verticleA = random.Next(0, verticles);
                do
                {
                    verticleB = random.Next(0, verticles);
                } while (verticleA == verticleB);

                Swap <int>(next.route, verticleA, verticleB);
                next.fitness = calculateTourCost(next);


                if (next.fitness < current.fitness)
                {
                    current = next;
                    result  = new List <int>(next.route);
                }
                else if (calculateProbability(current, next, temperature))
                {
                    current = next;
                }

                temperature *= cooling_rate;
                iteration++;
            }

            return(bestResult);
        }
Пример #2
0
        private float calculateTourCost(tour path)
        {
            float tourCost = 0;

            for (int i = 1; i < path.route.Count(); i++)
            {
                tourCost += getDistance(path.route[i - 1], path.route[i]);
            }
            tourCost += getDistance(path.route.Count - 1, path.route[0]);
            return(tourCost);
        }
Пример #3
0
        private bool calculateProbability(tour current, tour next, float temperature)
        {
            int    RAND_MAX = 32767;
            double prob     = random.Next(0, RAND_MAX);
            double e        = Math.Exp(-1.0 * (changeInCost(next, current) / temperature));

            if (prob / (1.0 * RAND_MAX) < e)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
Пример #4
0
 private float changeInCost(tour x, tour y)
 {
     return(x.fitness - y.fitness);
 }