public Tour createRandomTour() {
    Tour tour = new Tour();
    List<City> newPath = new ArrayList<>();

    int tourSize = allCities.size();
    int index;
    Set<Integer> seen = new HashSet<>();
    City city;

    newPath.add(allCities.get(0));
    // System.out.println("** " + allCities.get(0).getName());
    for (int i = 1; i < tourSize; i++) {
      index = (int) (Math.random() * tourSize);
      while (index == 0 || seen.contains(index)) {
        // System.out.println("in " + index);
        index = (int) (Math.random() * tourSize);
      }

      seen.add(index);
      city = allCities.get(index);
      // System.out.println("** " + index + " " + allCities.get(index).getName());
      newPath.add(city);
    }
    // System.out.println("");

    if (allCities.size() > 1) {
      // System.out.println("** last :" + allCities.get(0).getName());
      newPath.add(allCities.get(0));
    }

    tour.setPath(newPath);
    return tour;
  }
  private void createEdges() {
    City c1, c2;

    for (int i = 0; i < allCities.size(); i++) {
      for (int j = 0; j < allCities.size(); j++) {
        if (i == j) continue;

        c1 = allCities.get(i);
        c2 = allCities.get(j);

        c1.addCityToMap(c2);
        c2.addCityToMap(c1);

        // System.out.println("c1 " + c1.getName() + " , c2 " + c2.getName() + " dist : " +
        // c1.getdMap().get(c2));
      }
    }
    sortEdges(allCities);
  }
  // initialize..
  // create cities and edges between them
  public void initiateProblem(final String fileName) {
    InputStream inputStream = getClass().getClassLoader().getResourceAsStream(fileName);
    BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));

    // Read File Line By Line
    try {
      String strLine;
      while ((strLine = br.readLine()) != null) {
        String[] tokens = strLine.split(" ");
        if (tokens.length < 3) {
          continue;
        }

        City city = new City(tokens[0], Integer.parseInt(tokens[1]), Integer.parseInt(tokens[2]));
        allCities.add(city);
      }
      createEdges();
    } catch (Exception e) {
      e.printStackTrace();
      System.err.println("Exception occurred while initiating the problem .. " + e);
    }
  }