TSP Anneal::anneal(TSP Tsp, double coolingRate) { double temperature = pow((double)tsp.getDimension(), 2) * 1000.0; double absoluteTemperature = 0.00001; this->tsp = Tsp; dimension = tsp.getDimension(); Greedy greedy; currentOrder = greedy.greedy(tsp).getSolution(); //currentOrder.resize(dimension); //for (int i = 0; i < dimension; i++) currentOrder[i] = i; vector<int> bestOrder = currentOrder; int iteration = -1; double deltaDistance = 0; double distance = getTotalDistance(currentOrder); double bestDistance = distance; uniform_real_distribution<double> distribution(0.0, 1.0); default_random_engine generator; while (temperature > absoluteTemperature) { nextOrder = getNextOrder(currentOrder); deltaDistance = getTotalDistance(nextOrder) - distance; if ((deltaDistance < 0) || (distance > 0 && exp(-deltaDistance / temperature) > distribution(generator))) { currentOrder = nextOrder; distance = deltaDistance + distance; } if (distance < bestDistance) bestOrder = currentOrder; else if (distance > bestDistance * 1.5) { currentOrder = bestOrder; distance = bestDistance; } temperature *= coolingRate; iteration++; } tsp.updateSolution(bestOrder); return tsp; }
int main() { std::cout << "=== Exercise 03 from Chapter 04 ===" << std::endl; std::vector<double> distances = collectDistances(); std::cout << "Total distance: " << getTotalDistance(distances) << std::endl; std::cout << "Smallest distance: " << getSmallestDistance(distances) << std::endl; std::cout << "Largest distance: " << getLargestDistance(distances) << std::endl; std::cout << "Mean distance: " << getMeanDistance(distances) << std::endl; return 0; }
void displayDistance(){ int a,b,c,d; double totalDis = getTotalDistance(); if(totalDis >= 1000 ){ // only allow display four digits, max display 9999 a = 9; b = 9; c = 9; setDecimalAnode2(true); d = 9; }else{ //3 digit + decimal a = totalDis / 100; b = (totalDis - a * 100) / 10; c = (totalDis - a * 100 - b * 10); setDecimalAnode2(true); d = (totalDis - a * 100 - b * 10 - c) * 10; } displayNumbers(a,b,c,d); }