我在地图上有一组点。我正在尝试创建集群。除了距离,我还在考虑每个集群的最大成本(作为另一个参数)。
请查看以下代码段。
public class Cluster{
private List<Node> clusterNodes = new ArrayList<Node>();
private Integer totalCost = 0;
private Point2D point;
//getters and setters
}
如果我尝试创建集群,它将进入无限循环。或者,地图上的两个点将分配给两个不同的群集。在每次迭代中,这两个集群的质心都在变化。 请建议我,我怎样才能做到这一点?
EDITS
Cluster.java
public class Point{
private double x = 0;
private double y = 0;
// getters and setters
//method to find the distance between 2 points
}
Point.java
/(?:[-+() ]*\d){10,13}/g
我将此链接称为基本Kmeans算法:http://www.dataonfocus.com/k-means-clustering-java-code/
答案 0 :(得分:1)
通常情况下, K -means算法可以显示为永远不会重复从上一次迭代中将节点分配给集群。
也许这在您的情况下是可行的,因为您使用 K -means传统上不存在的额外成本约束,但可能它仍然不是,我'我不确定。
我想知道您如何使用此代码提供的assignCluster()
方法。你是否有另一个循环,它不断调用assignCluster()
finalClusters =
最新的集群分配列表,clusterNodes =
所有节点列表,并保持循环,直到它结束一个与前一个相同的作业?
如果是这样,您确定cluster.addClusterNode()
是否正确地从其先前的群集中移除了节点(正如我假设如果您按照上述方式实现它那么应该这样做?)。另一件需要考虑的事情可能是(cluster.getTotalDemand() + node.getCost())
计算。我怀疑,如果您正在查看该节点已经存在的群集,您可能不希望在该计算中包含node.getCost()
,因为如果也>,它将被计为双倍包含在cluster.getTotalDemand()
。
我不得不假设你想要代码究竟做什么,或者你是如何实现代码未显示的其他方法......所以你必须指出我的代码是否有任何错误假设
答案 1 :(得分:1)
查看您提供的问题和链接的代码,我看不出任何无限循环的原因(假设您正确调整了代码),除了可能性,群集总数乘以每个群集的最大成本小于所有节点的总成本。你可以在进入循环之前迭代所有节点来检查它。
另一个问题可能是,您忘记在totalCost
方法中重置每个群集的clearClusters()
,但我认为这不会导致无限循环。
为什么你的类型Point2D
的质心而不是你自己的Point
类的对象?