集群中的分组/链接

Posted

技术标签:

【中文标题】集群中的分组/链接【英文标题】:Grouping/linking in a cluster 【发布时间】:2015-08-11 14:53:20 【问题描述】:

我正在使用处理,到目前为止,我有一个绘制随机球的草图,并在一定半径内连接时绘制一条线。

for(int i=0;i<=people.size()-1;i++)
   Person p = people.get(i);
      for(Person pp: people)
        if(pp!=p)
          if(p.isIntersecting(pp))
            // Draw the line connecting the two here
            line(p.loc.x,p.loc.y,pp.loc.x,pp.loc.y);
            // Store the other person in this persons "connections" list
            if(!p.connections.contains(pp)) p.connections.add(pp);

           else 
             p.connections.remove(pp);
          
        
      
  

这非常适合直观地显示哪些组聚集在一起。 但是现在我如何将这组连接的对象存储到一个 ArrayList 中,同时它们是连接的?所以我可以将它们召回用于其他功能。

就像我的意思一样,当 4 个人在屏幕上链接时,我可以很容易地直观地看到。但是我怎样才能告诉计算机它们都已链接呢?

链接存储在每个对象的连接列表中。 但是每个单独的对象如何知道其他对象的连接以对它们进行分组。

所以我可以在它们被链接时在它们周围画一个“组块”。

我尝试了很多方法,但似乎总是遇到递归/*** 错误。因为很明显我只是递归地查看所有连接来链接它们,这太多了。

知道如何将连接的线作为组存储在 ArrayList 中吗?

【问题讨论】:

【参考方案1】:

我假设您将“集群”定义为一组对象,这些对象与该集群中的任何其他对象相差 Person 对象,它们通过connections 列表链接。请注意,这并不是传统计算机科学意义上的真正“集群”,因此它可能会影响您的 google 搜索。

作为第一次尝试,您可能会考虑将集群组织成 ArrayListArrayListsPerson 对象。让我们称之为ArrayList&lt;ArrayList&lt;Person&gt;&gt; clusters。每个内部ArrayList 代表一个连接的Person 对象的“集群”。你还有另一个ArrayList&lt;Person&gt; 代表你已经访问过的Person 对象,称之为visited。然后,您尝试做的基本操作是:

ArrayList<Person> visited;
ArrayList<ArrayList<Person>> clusters;

void createGroups()
   for(Person p : people)

      //if we've already added this Person, skip it
      if(!visited.contains(p))
         //since we haven't seen this Person, it isn't clustered yet
         ArrayList<Person> newCluster = new ArrayList<Person>();
         clusters.add(newCluster);

         //start the recursion
         addMe(p, newCluster);
      
   


void addMe(Person p, ArrayList<Person> cluster)

   //if we've already added this Person, skip it
   if(visited.contains(p))
      return;
   

   //add me first
   cluster.add(p);
   //remember that we've already visited me
   visited.add(p);

   //now add my neighbors
   for(Person n : p.connections)
      addMe(n, cluster);
   

请注意,我还没有测试过这段代码,但基础知识已经存在:您需要跟踪您已经访问过的人,并跳过他们以避免无限递归。这是您的基本情况

另请注意,您可能想研究“真正的”聚类算法。 Google 是您的朋友,因为集群本身就是一个完整的领域。

【讨论】:

【参考方案2】:

看起来您有一个名为Person 的类,因此我将在该类中包含 ArrayList。不知道你的完整代码,它可能看起来像这样:

class Person 
  ArrayList<Person> connected = new ArrayList<Person>();

  Person() 
    // create as you already are doing
  

  void checkConnections() 
    connected.clear();               // delete existing connections
    for (Person other : persons) 
      if (dist(x,y, other.x,other.y) < 100) 
        connected.add(other):
      
    
  

这首先清除 ArrayList,然后检查它自己与所有其他人之间的距离。如果距离足够短(在我的示例中为 100 像素),则将其添加到 ArrayList。

已根据您的评论进行编辑: 这本质上是一个关于图和节点的问题。请参阅this examples 作为起点。

【讨论】:

这就是我正在做的事情。在检查它们是否相交后,我将连接推入人员连接数组。这也是您上面的代码所做的。我真正的问题是。如何从所有子连接中获取所有连接。例如....可以说它们都链接在一条线上。 6个连接。每个都连接成一条链。第一个元素如何告诉它连接到最后一个元素。当它实际上是通过一系列连接进行连接时。不是直接联系。我不确定我这样说是否有意义? 也许您需要一个 Group 类...来保存 Person 的连接实例? 我明白了——你的问题不是很清楚。请参阅我的更新答案以及示例链接。

以上是关于集群中的分组/链接的主要内容,如果未能解决你的问题,请参考以下文章

MySQL集群架构05分组复制架构和NDB集群架构

WEKA 中的集群评估是啥?

如何从 Python 中的 scipy 中的链接/距离矩阵计算集群分配?

根据与 LDA 主题/特征集群的相似性对文本进行分组

在大小相等的 k 个集群中对 n 个点进行分组

rabbitmq集群搭建