【问题标题】:Better way to solve this grid-search problem?解决这个网格搜索问题的更好方法?
【发布时间】:2011-03-04 17:22:57
【问题描述】:

我有一个网格(不一定是正方形,但我将其画成正方形以简化它)以及与每个较小正方形相关的某些值。给定一个半径为x 的圆,我试图找到值之和为最大值的区域。下面这张图就清楚了:

我的猜测是,如果使用大量小正方形将平面划分为网格,将圆近似为正方形只会导致一些过度近似,这对我来说最初是可以的,因为我还没有最终确定如何解决圆与部分正方形重叠的情况(它的值是多少?)。

我能想到的最简单的方法是蛮力:也许从左下角开始,然后开始以之字形路径移动,直到我们到达右上角并输出总和最大的区域。我对这种方法很好,但是对于大平面区域,会有大量的正方形,并且在某些情况下这种方法可能会被证明是昂贵的。我不确定是否有更好的方法来解决这个问题,但如果有人对如何解决这个问题有其他想法,我将不胜感激。

【问题讨论】:

  • 圆心允许的位置有哪些?沿着边缘?在顶点?任何地方?
  • 空间数据库有可能吗? R-Tree 怎么样?
  • @belisarius:到目前为止,我到处都在思考(因为我的区域是离散的,它主要是整数或者可能是 0.5 的增量),但是问题在当前状态下确实是开放的,并且可以改变只要我能够获得感兴趣的区域(总和更高),我就可以构建场景。
  • @rlb.usa:很有趣。你能详细说明一下吗?我没有想到空间数据库,想确定你的意思。
  • 您是否正在寻找一种方法来优化您的搜索以优化更大的总和区域大小或更大的网格进行搜索?

标签: algorithm optimization search artificial-intelligence max


【解决方案1】:

除非较小方块中的数据存在趋势,否则我认为可能确实需要一种蛮力方法,尽管您可能想找出一种不会花费我认为的多项式或指数时间的方法需要一种天真的蛮力方法。

但是,如果存在趋势(例如较高的值往往被归为一组,或者您更有可能在一侧遇到比另一侧更高的值),您可以设置一个算法来预测您的区域更可能包含更高值的网格。

当然,我可能会遗漏一些东西。

【讨论】:

  • +1。谢谢你。实际上,我对您所说的算法的后半部分更感兴趣,该算法将找到可能包含更高值的区域。您能否指出可以使用哪种算法的方向?
【解决方案2】:

为了在规则网格中的矩形中求和,实际上有一个简单的算法可以在 O(n) 中完成。令 G 为该网格,g(x,y) 为单元格 (x,y) 处的值

令 H 为一个新网格,使得 h(x,y) = sum g(i,j) for all i

现在,矩形 (x1,y1)..(x2,y2) 中的和等于 h(x2,y2)-h(x1,y2)-h(x2,y1)+h(x1,y1) .

我知道你原来的问题比这更复杂,但也许可以采用类似的方法?

【讨论】:

    【解决方案3】:

    矩形情况和圆形情况完全不同。

    如果你正在寻找最好的矩形区域,你的蛮力方法是O(nk)(n=瓷砖的总数,k=区域内的瓷砖数量),可以很容易地改进为@987654323 @ 通过沿行/列缓存一些部分和 - 这是您可以做的最好的事情,因为您必须至少查看每个图块一次。如果您需要经常这样做,对于不断变化的区域或图块,空间数据结构将比 O(n) 更快,但需要进行一些初始设置。

    对于圆形情况,如果圆形的中心仅限于平铺边缘,我不确定您将如何改进 O(nk) 蛮力算法。

    但是,如果圆真的可以像您所说的那样在任何地方,您就不能天真地暴力破解每个可能的圆位置,因为有无限可能的位置!

    相反,你需要一些更聪明的东西;参见例如this answer (将每个图块的中心视为加权点)。请注意,由于点是加权的,因此您必须记住,最好的圆可能只有一个点!

    【讨论】:

      【解决方案4】:

      我有一个想法可能有助于加快搜索圆圈大小远大于小方块大小的情况。

      不是一次移动一个小方块,而是先用不重叠的圆平铺整个平面,然后计算每个圆的值。这将让您确定所有剩余圆圈的可能总和的上限。

      例如,假设您在 3x3 的平面图平铺中只有九个圆圈,它们的总和是:

      10 10 10
      10  1  1
      1   1  1
      

      那么你知道任何圆最多可以有 31,而 31 的圆必须与左上角的 4 个圆重叠:0,0 0,1 1,0 和 1,1(行,col 位置从左上角开始)。

      鉴于上述数字,您可以立即忽略仅位于右下角区域内的所有圆圈:1,1 1,2, 2,1 2,2。

      实现这个算法会有点棘手,但如果圆圈比正方形大得多并且数字分布不均匀(也就是说,如果某些区域的数字往往更大比其他人)。

      【讨论】:

      • 您声称您的程序建立了所有剩余圆圈的可能总和的上限是错误的。考虑一个平铺为 2x2 的 8x8 网格,即有 4 个直径为 4 的圆。假设每个角单元中都有 -3; 4 个中心单元格中的每一个都有 2 个;所有其他单元格均为 0。您的四个圆圈每个都有 -1,给出了错误的上限 -1,尽管最好的圆圈是一个值为 8 的中心圆圈。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 2011-11-23
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多