基于Zipcode和Ranges Within创建用户团队算法



在我的应用程序中,我们有基于用户位置(邮编)的用户团队,然后是100英里的半径(以内的邮编)。

我的问题是:用户一注册了,并根据他的邮政编码和包含它的半径指定了一个团队。当用户二注册时,他有一个邮政编码,比方说在第一个用户团队的半径内,那么我们应该将他分配到同一个团队中。然而,第二个用户的半径超过了团队指定的半径,因为他在自己的邮政编码内操作,而不是用户a.

因此,现在的问题是,我们需要为每个邮政编码创建一个新的团队,以确保该团队中的每个用户都有正确的半径。但这不是一个解决方案。我们不可能每个邮政编码都有一个新的团队。

我的第一个想法是根据包含邮政编码的地区创建团队,然后将用户分配给该团队,因为他们的邮政编码在该地区。不过我不喜欢这种想法。

如有任何帮助,我们将不胜感激。这对我来说是一个非常困难的算法,所以请花时间尽可能简单地解释,这样我就能清楚地理解你的解决方案。

如果您知道如何将邮政编码解析为一对坐标(例如使用Google Maps API),问题是找到N个团队,每个团队至少有一个用户。并且同一团队内的任意2个用户之间的距离小于或等于100英里。

你可以使用基于距离的聚类算法将用户聚类到最小数量的团队中(这就是你直觉上认为的"区域")

这就像为每个用户创建一个团队,然后一次迭代地删除一个团队、将其用户重新分配给现有团队,直到您无法删除团队,因为您会违反100英里规则(或者随着应用程序的发展,这是一个更复杂的规则)。

你会在这里找到一个PHP实现(这个将英里转换为像素,但你可以很容易地修改它)http://rtsoftwaregroup.io/server-side-google-map-markers-clustering/

这里有更多理论http://www.cs.colostate.edu/~cs545/fall13/dokuwiki/lib/exe/fetch.php?media=wiki:12_clustering.pdf

还有一个关于优化(和扩展)它的非常有用的问题:地图聚类算法

您可以在php中尝试服务器端集群http://www.appelsiini.net/2008/introduction-to-marker-clustering-with-google-maps.

最新更新