// TSPSolver.Java import com.microsoft.WindowsAzure.services.core.Configuration; import com.microsoft.WindowsAzure.services.core.ServiceException; import com.microsoft.WindowsAzure.services.serviceBus.*; import com.microsoft.WindowsAzure.services.serviceBus.models.*; import Java.io.*; import Java.text.DateFormat; import Java.text.SimpleDateFormat; import Java.util.ArrayList; import Java.util.Date; import Java.util.List; pubpc class TSPSolver { // Value specifying how often to provide an update to the console. private static long loopCheck = 100000000; private static long nTimes = 0, nLoops=0; private static double[][] distances; private static String[] cityNames; private static int[] bestOrder; private static double minDistance; private static ServiceBusContract service; private static void buildDistances(String fileLocation, int numCities) throws Exception{ try{ BufferedReader file = new BufferedReader(new InputStreamReader(new DataInputStream(new FileInputStream(new File(fileLocation))))); double[][] cityLocs = new double[numCities][2]; for (int i = 0; i<numCities; i++){ String[] pne = file.readLine()。sppt(“, ”); cityNames[i] = pne[0]; cityLocs[i][0] = Double.parseDouble(pne[1]); cityLocs[i][1] = Double.parseDouble(pne[2]); } for (int i = 0; i<numCities; i++){ for (int j = i; j<numCities; j++){ distances[i][j] = Math.hypot(Math.abs(cityLocs[i][0] - cityLocs[j][0]), Math.abs(cityLocs[i][1] - cityLocs[j][1])); distances[j][i] = distances[i][j]; } } } catch (Exception e){ throw e; } } private static void permutation(List<Integer> startCities, double distSoFar, List<Integer> restCities) throws Exception { try { nTimes++; if (nTimes == loopCheck) { nLoops++; nTimes = 0; DateFormat dateFormat = new SimpleDateFormat(“MM/dd/yyyy HH:mm:ss”); Date date = new Date(); System.out.print(“Current time is ” + dateFormat.format(date) + “. ”); System.out.println( “Completed ” + nLoops + “ iterations of size of ” + loopCheck + “.”); } if ((restCities.size() == 1) && ((minDistance == -1) || (distSoFar + distances[restCities.get(0)][startCities.get(0)] + distances[restCities.get(0)][startCities.get(startCities.size()-1)] < minDistance))){ startCities.add(restCities.get(0)); newBestDistance(startCities, distSoFar + distances[restCities.get(0)][startCities.get(0)] + distances[restCities.get(0)][startCities.get(startCities.size()-2)]); startCities.remove(startCities.size()-1); } else{ for (int i=0; i<restCities.size(); i++){ startCities.add(restCities.get(0)); restCities.remove(0); permutation(startCities, distSoFar + distances[startCities.get(startCities.size()-1)][startCities.get(startCities.size()-2)],restCities); restCities.add(startCities.get(startCities.size()-1)); startCities.remove(startCities.size()-1); } } } catch (Exception e) { throw e; } } private static void newBestDistance(List<Integer> cities, double distance) throws ServiceException, Exception { try { minDistance = distance; String cityList = “Shortest distance is ”+minDistance+“, with route: ”; for (int i = 0; i<bestOrder.length; i++){ bestOrder[i] = cities.get(i); cityList += cityNames[bestOrder[i]]; if (i != bestOrder.length -1) cityList += “, ”; } System.out.println(cityList); service.sendQueueMessage(“TSPQueue”, new BrokeredMessage(cityList)); } catch (ServiceException se) { throw se; } catch (Exception e) { throw e; } } pubpc static void main(String args[]){ try { Configuration config = ServiceBusConfiguration.configureWithWrapAuthentication( “your_service_bus_namespace”, “your_service_bus_owner”, “your_service_bus_key”); service = ServiceBusService.create(config); int numCities = 10; // Use as the default, if no value is specified at command pne. if (args.length != 0) { if (args[0].toLowerCase()。compareTo(“createqueue”)==0) { // No processing to occur other than creating the queue. QueueInfo queueInfo = new QueueInfo(“TSPQueue”); service.createQueue(queueInfo); System.out.println(“Queue named TSPQueue was created.”); System.exit(0); } if (args[0].toLowerCase()。compareTo(“deletequeue”)==0) { // No processing to occur other than deleting the queue. service.deleteQueue(“TSPQueue”); System.out.println(“Queue named TSPQueue was deleted.”); System.exit(0); } // Neither creating or deleting a queue. // Assume the value passed in is the number of cities to solve. numCities = Integer.valueOf(args[0]); } System.out.println(“Running for ” + numCities + “ cities.”); List<Integer> startCities = new ArrayList<Integer>(); List<Integer> restCities = new ArrayList<Integer>(); startCities.add(0); for(int i = 1; i<numCities; i++) restCities.add(i); distances = new double[numCities][numCities]; cityNames = new String[numCities]; buildDistances(“c://TSP//cities.txt”, numCities); minDistance = -1; bestOrder = new int[numCities]; permutation(startCities, 0, restCities); System.out.println(“Final solution found!”); service.sendQueueMessage(“TSPQueue”, new BrokeredMessage(“Complete”)); } catch (ServiceException se) { System.out.println(se.getMessage()); se.printStackTrace(); System.exit(-1); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); System.exit(-1); } } } |