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); }
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); }
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); } }
private float changeInCost(tour x, tour y) { return(x.fitness - y.fitness); }