地図上に一連のポイントがあります。クラスターを作成しようとしています。距離とともに、各クラスターの最大コスト(別のパラメーターとして)を検討しています。
以下のコードスニペットを見つけてください。
private void assignCluster(List<Cluster> finalClusters, List<Node> clusterNodes, int maxCostLimit) {
double max = Double.MAX_VALUE;
double min = max;
int clusterIndex = 0;
double distance = 0.0;
for (Node node : clusterNodes) {
min = max;
for (int i = 0; i < finalClusters.size(); i++) {
Cluster cluster = finalClusters.get(i);
distance = Point.getDistanceBetweenPoints(node.getPoint(), cluster.getPoint());
if (distance < min && (cluster.getTotalCost() + node.getCost()) <= maxCostLimit) {
min = distance;
clusterIndex = i;
}
}
if (min != max) {
Cluster cluster = finalClusters.get(clusterIndex);
cluster.setTotalCost(cluster.getTotalCost() + node.getCost());
cluster.addClusterNode(node);
}
}
}
クラスターを作成しようとすると、無限ループになります。または、マップ上の2つのポイントが2つの異なるクラスターに割り当てられます。各反復で、これら2つのクラスターの重心が変化します。私に提案してください、どうすればこれを達成できますか?
編集
Cluster.java
public class Cluster{
private List<Node> clusterNodes = new ArrayList<Node>();
private Integer totalCost = 0;
private Point2D point;
//getters and setters
}
Point.java
public class Point{
private double x = 0;
private double y = 0;
// getters and setters
//method to find the distance between 2 points
}
基本的なKmeansアルゴリズムについては、このリンクを参照しています:http://www.dataonfocus.com/k-means-clustering-java-code/
通常、K -meansアルゴリズムは、前の反復からクラスターへのノードの割り当てを繰り返さないことを示すことができます。
おそらくこれはあなたの場合に可能です。これは、K -meansを使用する場合に従来は存在しなかった、導入したコストの追加の制約のためですが、それでもそうではないかどうかはわかりません。
assignCluster()
コードを提供したこのメソッドをどのように使用しているのか疑問に思います。あなたは呼び出し続け、その周りに別のループ持っていますassignCluster()
とfinalClusters =
、クラスタの最新の割り当てのリスト、およびclusterNodes =
すべてのノードのリスト、そしてそれは前のものと同じである割り当てで終わるまでループし続けるの?
もしそうならcluster.addClusterNode()
、ノードをその前のクラスターから正しく削除しますか(上記のように実装した場合はそうすべきだと思いますか?)。注目すべきもう1つのことは、(cluster.getTotalDemand() + node.getCost())
計算です。あなたは、このノードは、あなたには、したくない場合があり、中にすでにあることをクラスタに注目することが起こる場合、私は、それを疑うnode.getCost()
それがいた場合、それは、二重にカウントされますから、その計算にも含まcluster.getTotalDemand()
。
コードに何をさせたいのか、またはコードが表示されていない他のメソッドをどのように実装したのかについて、いくつかの仮定を立てる必要がありました。そのため、仮定に誤りがあるかどうかを指摘する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加