我首先要解决我试图解决的问题。这是一个医疗保健问题,因此我将使用“会员”这一术语。和'提供商。'基本上,我们希望尝试与提供商签订合同,直到覆盖一定比例的成员。"
有了这个,让我来定义"覆盖":如果在给定的里程数内有合同提供者,则会覆盖成员(让我们称这个最大距离为最大距离)。因此,如果我们的maxd = 15,并且有一个距离我12英里的提供商,那么该提供商就会覆盖它。每个成员只需要由一个提供者承保。
这里的目标是覆盖一定比例的数字(假设90%),同时必须签订最少数量的提供商。在这种情况下,生成一个列表是有帮助的,鉴于我们当前的状态(当前状态是我们的合同提供商列表),向我们显示哪些提供商将覆盖已经涵盖的大多数成员。< / p>
到目前为止,我是如何做到这一点的。我有一套contracted_providers,告诉我我签约了谁。它可能是空的。首先,我发现成员已经被覆盖并忘记了他们,因为成员只需要被覆盖一次。
maxd = 15 # maximum distance to be covered, 15 for example
for p in contracted_providers:
for m in members:
if dist(p,m) <= maxd:
members.remove(m)
然后我计算每个提供商的覆盖率(按百分比计算)对尚未发现的成员的重新计算。
uncovered_members = members # renaming this for clarity
results = dict()
for p in not_contracted_providers:
count = 0
for m in uncovered_members: # this set now just contains uncovered members
if dist(p,m) <= maxd:
count++
results[p] = count/uncovered_members.size() # percentage of uncovered members that this provider would cover.
好的,谢谢你对我的评价。现在我可以问我的问题。这些数据集非常大。在规模较大的一端,我们可能拥有10,000个提供商和40,000个成员。有没有比蛮力更好的方法呢?
我正在思考代表热图的数据结构,然后用它来寻找最佳供应商。基本上允许我作弊的东西,而不必为每个提供者,成员组合计算每个单独的距离。我试图研究这个,但我甚至不知道要搜索什么,所以任何方向都会有所帮助。如果相关,则所有位置均由地理位置(纬度,长度)表示。
作为旁注,如果蛮力几乎是唯一的选择,Hadoop之类的东西是不是很快就能做到的好选择?