2017-11-02 5 views
-4

私はパリのコンピューティング・サイエンスの学生です。今年の数学では、問題を解決するためにK平均アルゴリズムを使用する必要があります(セルフサービス自転車ステーションの再補給に適用されるクラスター容量車両ルーティング問題)。ここに私のアルゴリズムです: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には何の手がかりも与えないエラーはありません。

誰かが私に説明してください問題がどこにありますか?

おかげ

+0

これはEclipseプロジェクトなので、ソースフォルダを取得してプロジェクトを自分で作成することをお勧めします。プロジェクトは彼の設定ファイルと同じです。また、Java 1.8を使用しています。 –

+2

また、あなたの質問 - タイトルと質問内のあなたの質問は、2つの全く異なるものです! – sascha

+0

引用したプログラムが正しく同期されていません。どんな結果も可能です。 [* Initial Threads *](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)を参照してください。また、 "Swingプログラムは' paint() 'を無効にするのではなく' paintComponent() 'をオーバーライドする必要があります。" - [* AWTとSwingのペイント:ペイントメソッド*](http://www.oracle.com/technetwork/java /painting-140037.html#callbacks)。 – trashgod

答えて

1

は、問題は私のアルゴリズムは、ステーションのためのクラスタを生成したということでしたが、私は正確に私のポイントをレンダリングするために(私は後で表示するために非常に重要だった理解)クラスのグラフィックを設定しませんでした。私は自分の駅の座標として緯度と経度を使用していたので、私はこれらの座標をウィンドウの縮尺に合わせなければなりませんでした。私はこれをどのようにして行ったのですか(クロス乗算を使用して):グラフの2つのユニット間の「ギャップ」を計算し、ゼロから開始しないため調整を追加しました。

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

(のgetWidth()、edgespaceグラフとパネルのエッジとの間のパディングスペースグラフであるパネルの実際の幅を与え、topX座標とbottomX最小の最大値であります値)

関連する問題