/**
   * @param args
   * @throws InvalidEducationValueException
   */
  public static void main(String[] args) throws InvalidEducationValueException {
    final ClusterNumberFormat cnf = new ClusterNumberFormat();
    final ClusterTestData ctd = new ClusterTestData();

    Cluster tempClusterI = null;
    Cluster tempClusterJ = null;
    Cluster minClusterA = null;
    Cluster minClusterB = null;
    Instance tempClusterIInstance = null;
    Instance tempClusterJInstance = null;
    Instance minInstanceA = null;
    Instance minInstanceB = null;

    double dist = 0.0;
    double minDist = Double.POSITIVE_INFINITY;

    ArrayList<Cluster> clusters = ctd.getClusters();

    while (clusters.size() > 1) {
      for (int i = 0; i < clusters.size(); i++) {
        for (int j = i + 1; j < clusters.size(); j++) {
          tempClusterI = clusters.get(i);
          tempClusterJ = clusters.get(j);

          System.out.println(
              "Cluster "
                  + tempClusterI.getName()
                  + " has Instance(s) "
                  + tempClusterI.getInstancesNameSet());
          System.out.println(
              "Cluster "
                  + tempClusterJ.getName()
                  + " has Instance(s) "
                  + tempClusterJ.getInstancesNameSet());

          for (int k = 0; k < tempClusterI.size(); k++) {
            for (int l = 0; l < tempClusterJ.size(); l++) {
              tempClusterIInstance = tempClusterI.get(k);
              tempClusterJInstance = tempClusterJ.get(l);

              dist = ClusterCalculation.distance(tempClusterIInstance, tempClusterJInstance);

              System.out.println(
                  "   DIST("
                      + tempClusterIInstance.getName()
                      + ","
                      + tempClusterJInstance.getName()
                      + ") = "
                      + cnf.format(dist));

              if (dist < minDist) {
                minDist = dist;
                minClusterA = tempClusterI;
                minInstanceA = tempClusterIInstance;
                minClusterB = tempClusterJ;
                minInstanceB = tempClusterJInstance;
              }
            }
          }
        }
      }

      System.out.println(
          "*** Minimum exists between Instance "
              + minInstanceA.getName()
              + " of Cluster "
              + minClusterA.getName()
              + " and Instance "
              + minInstanceB.getName()
              + " of Cluster "
              + minClusterB.getName()
              + " with a distance of "
              + cnf.format(minDist));
      System.out.print(
          "  * Merging cluster "
              + minClusterB.getName()
              + " into cluster "
              + minClusterA.getName()
              + ": ");

      // minClusterA and minClusterB are the two clusters with the closest member Instance(s).
      // Merge B into A and remove B from the list of Clusters.
      minClusterA.merge(minClusterB);
      clusters.remove(minClusterB);

      System.out.println(
          "Cluster "
              + minClusterA.getName()
              + " now contains instance(s) "
              + minClusterA.getInstancesNameSet());

      minDist = Double.POSITIVE_INFINITY;
    }
  }