纸质男孩的聚类算法

时间:2009-02-18 21:25:06

标签: algorithm language-agnostic cluster-analysis

我需要帮助根据特定标准选择或创建聚类算法。

想象一下,你正在管理报纸送货人员。

  • 您有一组街道地址,每个地址都经过地理编码。
  • 您希望对地址进行群集,以便将每个群集分配给送货人。
  • 交货人或集群的数量不固定。如果需要,我总是可以雇用更多的送货人员,或者将他们解雇。
  • 每个群集应具有大约相同数量的地址。但是,如果群集的地址更加分散,则群集可能具有更少的地址。 (另一种方式:每个群集包含最大地址数的最小群集数,群集中的任何地址必须以最大距离分隔。)
  • 对于奖励积分,当数据集被更改(地址被添加或删除),并且算法被重新运行时,如果群集保持尽可能不变(例如,这排除了简单的k均值)将会很好聚类,其本质上是随机的)。否则送货人会发疯。

所以...想法?

更新

如Arachnid的答案所述,街道网络图不可用。

17 个答案:

答案 0 :(得分:19)

我在Java中编写了一个低效但简单的算法,看看我可以在一组点上做一些基本的聚类,或多或少如问题所述。

如果指定为ps的(x,y)坐标int,该算法将在列表上工作。它还需要三个其他参数:

  1. radius(r):给定一个点,扫描附近点的半径是多少
  2. 最大地址(maxA):每个群集的最大地址数(点数)是多少?
  3. 分钟地址(minA):每个群集的最小地址
  4. 设置limitA=maxA主要迭代: 初始化空列表possibleSolutions。 对p中的每个点ps进行外部迭代:。 初始化空列表pclusters。 定义了点wps=copy(ps)的工作清单。 工作点wp=p内部迭代:,而wps不为空。 移除wp中的wps点。确定wpsInRadius中距离<{1}}的所有点wps来自r的{​​{1}}。根据与wp的距离,按升序排序wpsInRadius。保留wp中的第一个min(limitA, sizeOf(wpsInRadius))点。这些点形成一个新的集群(点列表)wpsInRadius。将pcluster添加到pcluster。从pclusters中移除pcluster中的积分。如果wps不为空,wps并继续内部迭代。 结束内部迭代。 获得了簇wp=wps[0]的列表。将其添加到pclusters结束外部迭代。

    possibleSolutions中的每个p都有ps中的pclusters群集possibleSolutions。然后对每个pclusters进行加权。如果avgPCpossibleSolutions(全局)中每个群集的平均点数,avgCSize是每个pclusters(全局)的群集平均数,那么这就是函数使用这两个变量来确定权重:

      private static WeightedPClusters weigh(List<Cluster> pclusters, double avgPC, double avgCSize)
      {
        double weight = 0;
        for (Cluster cluster : pclusters)
        {
          int ps = cluster.getPoints().size();
          double psAvgPC = ps - avgPC;
          weight += psAvgPC * psAvgPC / avgCSize;
          weight += cluster.getSurface() / ps;
        }
        return new WeightedPClusters(pclusters, weight);
      }
    

    现在最好的解决方案是权重最小的pclusters。我们重复主要迭代,只要我们能找到比前一个limitA=max(minA,(int)avgPC)更好的解决方案(重量更轻)。 结束主要迭代。

    请注意,对于相同的输入数据,此算法将始终产生相同的结果。列表用于保留订单,并且没有随机

    要了解此算法的行为,这是32点测试模式的结果图像。如果是maxA=minA=16,那么我们会找到2个16个地址的群集。

    alt text

    接下来,如果我们通过设置minA=12减少每个群集的最小地址数,我们会找到3个12/12/8点的群集。

    alt text

    为了证明该算法远非完美,这里是maxA=7的输出,但我们得到6个簇,其中一些很小。所以在确定参数时你仍然需要猜太多。请注意,r此处仅为5。

    alt text

    出于好奇,我在更大的随机选择点上尝试了算法。我添加了下面的图片。

    结论?这花了我半天,它效率低下,代码看起来很丑,而且相对较慢。但它表明可以在短时间内产生一些结果。当然,这只是为了好玩;将其变成实际有用的东西是困难的部分。

    alt text

    alt text

答案 1 :(得分:10)

我认为你需要hierarchical agglomeration技术而不是k-means。如果您的算法正确,您可以在拥有正确数量的聚类时停止它。正如其他人提到的那样,您可以使用以前的解决方案为后续群集提供种子,这可能会给您带来显着的性能提升。

您可能需要仔细查看所使用的距离函数,尤其是问题具有较高维度时。欧几里德距离是最容易理解的,但可能不是最好的,看看马哈拉诺比斯等替代品。

我认为你真正的问题与提供报纸无关......

答案 2 :(得分:10)

您所描述的是(多个) - 车辆路径问题(VRP)。关于这个问题的不同变体有很多学术文献,使用了大量的技术(启发式,现成的求解器等)。通常作者试图为具体实例找到好的或最优的解决方案,这也意味着站点的聚类(一辆车的路线上的所有站点)。

但是,群集可能会受到重大更改,只有稍微不同的实例,这是您要避免的。不过,VRP-Papers中的某些东西可能会激励你......

如果您决定坚持使用显式群集步骤,请不要忘记将分布包含在所有群集中,因为它是每条路径的一部分。

使用街道网格的图形表示来评估聚类可能会比连接白色地图上的点产生更真实的结果(尽管两者都是TSP变体)。如果图表模型不可用,您可以使用出租车公制(| x_1 - x_2 | + | y_1 - y_2 |)作为距离的近似值。

答案 3 :(得分:6)

您是否考虑过使用基于经济/市场的解决方案?将设置除以任意(但常数以避免随机效应)拆分为偶数子集(由交付人数确定)。

为每个点分配一个成本函数,它将增加到图表的数量,并为每个额外点提供经济价值。

迭代允许每个人轮流拍卖他们的最差点,并给每个人一个最大的预算。

这可能与送货人在现实生活中的想法非常吻合,因为人们会发现互换,或者会说“如果我不这样做,我的生活会变得那么容易。它也很漂亮灵活的(例如,允许相对容易地给予任何其他人一英里的距离)。

答案 4 :(得分:4)

我会采用不同的方式:将街道网络视为一个图形,每条街道的每一边都有一条边,找到一个图形划分为n个段,每个段不超过给定长度,这样每个报童都可以从路线的开始到结束,沿着一条连续的路径行驶。通过这种方式,您可以避免向人们提供要求他们重复骑行相同路段的路线(例如,当被要求覆盖街道的两侧而不覆盖所有周围的街道时)。

答案 5 :(得分:4)

这是一种发现“群集”所在位置的快速而肮脏的方法。这是受到“扫雷”游戏的启发。

将整个交付空间划分为正方形网格。注意 - 在这将很好地工作之前,需要对网格的大小进行一些调整。我的直觉告诉我,一个大小与物理邻域区块大小相当的正方形大小将是一个很好的起点。

遍历每个广场并存储每个街区内的交付地点(房屋)数量。使用第二个循环(或第一遍的一些聪明方法)来存储每个相邻块的传递点数。

现在,您可以使用与照片处理软件类似的方式操作此网格。您可以通过查找某些相邻块中没有交付点的块来检测簇的边缘。

最后,您需要一个系统,该系统结合了多次交付以及行进的总距离来创建和分配路线。可能存在一些孤立的集群,只需要进行少量交付,并且一个或两个超级集群与许多房屋彼此非常接近,需要在同一集群中有多个交付人员。必须访问每个家庭,这是你的第一个约束。

获得任何一个交付人员在一次运行中行进的最大允许距离。接下来对每人的交付数量做同样的事情。

首次运行路由算法会分配一个交付人员,将其发送到任何未完成所有交付的随机群集,让他们交付,直到达到他们的交付限制或他们已交付到群集中的所有家庭。如果他们达到了交付限制,请通过将其发送回本垒来结束路线。如果他们可以安全地前往最近的群集然后回家而没有达到他们的最大行程距离,那么就这样做,并重复上述步骤。

当前送货人员完成路线后,检查是否有房屋尚未交货。如果是,请指定另一个交付人员,并重复上述算法。

这将生成初始路线。我会存储所有信息 - 每个广场的位置和尺寸,广场内的房屋数量及其所有直接邻居,每个广场所属的集群,交付人员及其路线 - 我会存储所有这些在数据库中。

我将把recalc程序留给你 - 但是在数据库中拥有所有当前路线,集群等将使您能够保留所有历史路线,并尝试各种方案以了解如何最好地适应变化创建对现有路线的尽可能少的更改。

答案 6 :(得分:3)

这是一个值得optimized solution而不是试图解决“OPTIMUM”的问题的典型例子。它在某些方面与“Travelling Salesman Problem”类似,但您还需要在优化过程中细分位置。

我使用了三种不同的优化算法来很好地解决这样的问题:

  1. Simulated Annealing
  2. Great Deluge Algorithm
  3. Genetic Algoritms
  4. 使用优化算法,我认为您已经描述了以下“目标”:

    1. 每篇论文的地理区域 男孩应该尽量减少。
    2. 所服务的订阅者数量 每个应该大致相等。
    3. 每个人的行进距离 应该大致相等。
    4. (还有一个你没说,但可能 这条路线应该在哪里结束 它开始了。
    5. 希望这能让你开始!

      *编辑*

      如果你不关心路线本身,那就取消了上面的目标3和4,也许可以让问题更适合你的奖金要求。

      如果您考虑人口统计信息(例如人口密度,订阅采用率和订阅取消率),您可以使用上述优化技术来消除在订阅者采用或放弃您的服务时重新运行算法的需要。优化群集后,它们将保持平衡,因为单个群集的每个群集的速率与其他群集的速率相匹配。

      您必须重新运行算法的唯一时间是外部因素(例如经济衰退/萧条)导致人口统计群体的行为发生变化。

答案 7 :(得分:2)

我认为您确实需要Set Covering位置模型的一些变体而不是群集模型,并且需要额外的约束来覆盖每个设施所覆盖的地址数量。我无法在网上找到一个很好的解释。您可以查看this page,但他们使用区域单位解决它,您可能希望在欧几里德或网络空间中解决它。如果您愿意以死树格式挖掘内容,请查看Daskin的Network and Discrete Location的第4章。

答案 8 :(得分:2)

这与问题没有直接关系,但我听说过,如果这确实是你的路线规划问题,应该考虑哪些问题。这会影响分配给每个驱动程序的集合中的地址顺序。

UPS拥有可为其送货人员提供最佳路线的软件。该软件试图最大化在路线期间采取的右转弯数。这为他们节省了大量的交货时间。

对于那些不住在美国的人来说,这样做的原因可能不会立即显现出来。在美国,人们在道路的右侧行驶,所以当右转时,如果灯是绿色的,则不必等待迎面而来的车辆。此外,在美国,当你在红灯右转时,你(通常)不必在你去之前等待果岭。如果你总是向右转,那你永远不必等待灯光。

这里有一篇关于它的文章: http://abcnews.go.com/wnt/story?id=3005890

答案 9 :(得分:2)

我知道这个问题的一种非常新颖的方法,我已经看到应用于生物信息学,尽管它适用于任何类型的聚类问题。它当然不是最简单的解决方案,但我认为非常有趣。基本前提是聚类涉及多个目标。对于想要最小化群集数量的群体,trival解决方案是包含所有数据的单个群集。第二个标准目标是最小化集群内的方差量,平凡的解决方案是许多集群,每个集群只有一个数据点。当您尝试包含这两个目标并优化权衡时,会产生有趣的解决方案。

提出的方法的核心是一种称为memetic algorithm的东西,它有点像遗传算法,这是史蒂夫提到的,但它不仅能很好地探索解空间,而且还能够专注于有趣的地区,即解决方案。至少我建议阅读一些关于这个主题的论文,因为模因算法是一种不寻常的方法,虽然是警告;它可能会引导你阅读自私基因,我仍然没有决定这是否是一件好事...如果算法不感兴趣,那么也许你可以尝试表达你的问题,因为格式需要并使用源代码提供。相关论文和代码可以在这里找到:Multi Objective Clustering

答案 10 :(得分:2)

也许是客户的最小生成树,根据纸质男孩的地点分成几组。 PrimsKruskal获取MST与房屋之间的距离。

答案 11 :(得分:2)

对简单聚类算法的良好调查。还有更多: http://home.dei.polimi.it/matteucc/Clustering/tutorial_html/index.html

答案 12 :(得分:1)

一个微不足道的答案,没有得到任何奖励积分:

每个地址一个送货人。

答案 13 :(得分:1)

我承认这不一定会提供大小相等的集群:

数据聚类中最好的当前技术之一是证据积累。 (Fred和Jain,2005) 你做的是:

给定具有n个模式的数据集。

  1. 在k的范围内使用类似k-means的算法。或者使用一组不同的算法,目标是产生一组分区。

  2. 创建大小为n x n的协同关联矩阵C.

  3. 对于整体中的每个分区p:
    3.1更新共同关联矩阵:对于属于p中相同簇的每个模式对(i,j),设置C(i,j)= C(i,j)+ 1 / N.

    < / LI>
  4. 使用群集算法(如单链路)并应用矩阵C作为邻近度量。单链接给出树形图作为结果,我们选择具有最长寿命的聚类。

  5. 如果您有兴趣,我会提供SL和k-means的说明。

答案 14 :(得分:1)

  
      
  • 你有一套街道   地址,每个地址都是地理编码的。      
        
    • 您希望对每个群集的地址进行群集   分配给送货员。
    •   
    • 交货人或集群的数量不固定。如果需要的话,   我总能雇用更多的送货服务   人员,或将他们解雇。
    •   
    • 每个群集应具有大约相同数量的地址。然而,   如果a,群集可能具有较少的地址   集群的地址更加传播   出。 (另一种方式:最低限度   每个集群的集群数量   包含最大数量   地址,以及其中的任何地址   群集必须以最大值分隔   距离。)
    •   
    • 对于奖励积分,当数据集被更改时(地址被添加或   删除),重新运行算法,   如果集群会很好   保持尽可能不变(即。   这排除了简单的k-means   聚类,其本质上是随机的)。   否则送货人员会去   疯狂。
    •   
  •   

正如已经提到的,车辆路径问题可能更适合......虽然严格来说并没有考虑到集群,但它会根据最近的地址进行优化分配。因此,您的群集实际上将是推荐的路线。

如果您提供最多数量的递送者,并尝试达到最佳解决方案,则应告诉您所需的最小值。这涉及第2点。

通过提供对要访问的地址数量的限制,可以获得相同数量的地址,基本上分配一个股票价值(现在是一个有限的车辆路径问题)。

如果地址更加分散,那么添加交货人工作的时间窗口或小时数有助于减少负荷(现在是时间窗口的车辆路径问题)。

如果您使用最近邻居算法,那么每次都可以获得相同的结果,删除单个地址不应该对最终结果产生太大影响,因此应该处理最后一点。

我实际上正在开发一个C#类库来实现这样的目标,并认为它可能是最好的路径,尽管不太容易被阻止。

答案 15 :(得分:1)

通过将先前的群集用作群集功能,您可以使K均值或预期最大化保持不变。让每个集群拥有相同数量的项目似乎有点棘手。我可以考虑如何通过k方式然后将某些点混合直到事物平衡但这看起来效率不高来作为后聚类步骤。

答案 16 :(得分:-1)

我会使用基本算法根据他们居住的地方和订阅者的当前位置创建第一套paperboy路线,然后:

当纸尿裤是:

  • 补充说:他们从一个或多个纸尿男的位置开始,他们在新人居住的同一区域工作。
  • 删除:他的位置是给其他的纸尿裤,使用最近的路线位置。

当地点是:

  • 添加:同样的事情,该位置被添加到最近的路线。
  • 删除:刚从那个男孩的路线上移走。

每季度一次,您可以重新计算整个事物并更改所有路线。