package kmeans;
import java.util.*;
public class Kmeans {
public ArrayList allGenerals = null;
public int totalNumber = 0;// 得到所有的武将数目
public int K = 0;// 假设K=10
public Kmeans() {
allGenerals = new DomParser().prepare();
totalNumber = allGenerals.size();
K = 3;
}
// 第一次随机选取聚类中心
public Set firstRandom() {
Set center = new HashSet();// 聚类中心的点的id,采用set保证不会有重复id
Random ran = new Random();
int roll = ran.nextInt(totalNumber);
while (center.size()
roll = ran.nextInt(totalNumber);
center.add(roll);
}
return center;
}
// 根据聚类中心初始化聚类信息
public ArrayList init(Set center) {
ArrayList cluster = new ArrayList();// 聚类 的数组
Iterator it = center.iterator();
while (it.hasNext()) {
Cluster c = new Cluster();// 代表一个聚类
c.setCenter(it.next());
cluster.add(c);
}
return cluster;
}
/**
* 计算各个武将到各个聚类中心的距离,重新聚类
*
* @param cluster
* 聚类数组,用来聚类的,根据最近原则把武将聚类
* @param center
* 中心点id,用于计算各个武将到中心点的距离 return cluster 聚类后的所有聚类组成的数组
*/
public ArrayList juLei(Set center,
ArrayList cluster) {
ArrayList distence = new ArrayList();// 存放距离信息,表示每个点到各个中心点的距离组成的数组
General source = null;
General dest = null;
int id = 0;// 目的节点id
int id2 = 0;// 源节点id
Object[] p = center.toArray();// p 为聚类中心点id数组
boolean flag = false;
// 分别计算各个点到各个中心点的距离,并将距离最小的加入到各个聚类中,进行聚类
for (int i = 0; i
// 每个点计算完,并聚类到距离最小的聚类中就清空距离数组
distence.clear();
// 计算到j个类中心点的距离,便利各个中心点
for (int j = 0; j
// 如果该点不在中心点内 则计算距离