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

时间:2014-04-17 14:57:30

标签: php algorithm range

在我的应用程序中,我们拥有基于其位置(邮政编码)的用户团队,然后是一个包含半径100英里(内部的邮政编码)的用户。

我的问题是:用户注册并被指定为基于他的邮政编码和包含它的半径的团队。当用户2注册,并且他有一个在第一个用户团队半径范围内的邮政编码时,我们应该将他分配到同一个团队。但是,第二个用户的半径超过了指定半径的团队,因为他在他的邮政编码中操作,而不是用户A.

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

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

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

2 个答案:

答案 0 :(得分:0)

鉴于您知道如何将邮政编码解析为一对坐标(例如使用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

关于优化(和缩放)它的一个非常有用的问题: Map Clustering Algorithm

答案 1 :(得分:0)