如何以图形方式模拟K-Means算法的结果?

时间:2017-11-02 23:38:34

标签: java algorithm simulation k-means

我是巴黎计算机科学专业的学生。在今年的数学中,我们必须使用K-means算法来解决问题(适用于自助式自行车站补给的集群电容车辆路径问题)。这是我的算法:

public void run() {
    boolean hasConverged = false;
    List<Integer> nearestClusters = null;

    //A list used to check if the nearestClusters list has evolved
    //If it isn't the case, the algorithm is finish
    List<Integer> previousList = new ArrayList<Integer>();

    //Random initialization of the clusters' centroids
    for (int i = 0; i < clustersNumber; ++i) {
        clusters.add(ClusterGenerator.Generate(stationsList,colorList.get(i) ,latMin, latMax, lngMin, lngMax));
    }

    while (!hasConverged) {

        if (nearestClusters != null) {
            previousList.clear();
            previousList.addAll(nearestClusters);
        }

        nearestClusters= new ArrayList<Integer>();

        //Each point is connected to it nearest cluster
        for (int j = 0; j < stationsList.size(); ++j) {
            nearestClusters.add(getIndexOfTheNearestCluster(stationsList.get(j)));
        }

        //We move the clusters centroids to the center of the points they are connected to
        for (int k = 0; k < clusters.size(); ++k) {
            clusters.get(k).setCentre(stationsCenters(getStationsOfCluster(clusters.get(k), nearestClusters)));
        }

        if (!nearestClusters.isEmpty() && previousList.equals(nearestClusters))
            hasConverged = true;
    }
}

然而,我想用形成的集群展示算法的结果,我在互联网上发现了这项工作:https://github.com/ertugrulozcan/K-Means-Simulation

我在我的项目中导入了ClusterGenerator类,它创建了簇以及随机元素,类Item,类Graphic(我没有触及任何东西)和MainWindow类,它启动所有图形元素。

我没有设法显示这些情节,Eclipse中没有错误可以给我任何线索。

有人可以向我解释问题在哪里吗?

由于

1 个答案:

答案 0 :(得分:1)

问题是我的算法是为站点生成集群但是我没有配置类Graphic(后面我才明白这对显示来说非常重要)来正确渲染我的点。因为,我使用纬度和经度作为我的电台的坐标,我不得不把这些坐标放到窗口的比例。这是我如何做到的(使用交叉乘法):我计算&#34;间隙&#34;在图表中的两个单位之间添加了一个调整因为我不是从零开始。

double gapX = (this.getWidth() - 2 * edgeSpace) / (topX-bottomX+1); 
int adjustmentX =(int) (-bottomX*gapX);

(getWidth()给出面板的实际宽度,其中是图形,边缘空间是图形和面板边缘之间的填充空间,topX是坐标的最大值,bottomX是最小值)