【问题标题】:Dealing with huge amounts of data in continuum percolation在连续渗透中处理大量数据
【发布时间】:2017-10-03 18:48:20
【问题描述】:

对于我目前参与的一个小组项目,我们必须模拟以下内容: 取一个边长为 n 的正方形。在正方形上均匀分布一定数量的单位圆盘。找到所需的磁盘数量,直到有一个从正方形的左侧延伸到右侧的磁盘的连通分量。然后找到所需的磁盘数量,直到正方形完全被磁盘填满。

没有明确说明,但我们假设这是在 Matlab 中完成的,因为我们在本课程的其他部分使用它。对于第一个问题,找到从左到右的路径,我编写了两种可行的方法。一个使用邻接表和 Matlab 中的图形工具来查找连接的节点。这种方法足够快,但是对于我们需要做的事情来说占用了太多的内存。另一种方法使用递归搜索算法,不存储邻接信息,但速度太慢。

当我们需要正方形的大小为 n=1000n=10 000 时,问题就出现了。我们预测这将需要数千万圈或更多圈,我们根本看不到我们应该如何处理这个问题,因为任何邻接列表或矩阵都会大得离谱,而且不使用似乎需要大量的时间。感谢您的任何想法和想法,谢谢

【问题讨论】:

  • A) 找到不需要那么多内存的不同算法。 B) 获得更多内存。
  • 这是一个概率问题,没有“磁盘数量”可以解决,对吧?您能否更清楚地定义数学问题(例如“完全填充”)?如果你能提供一个玩具例子会更好。
  • @user2999345 是的,它非常具有概率性 - 这个项目是概率和统计课程的一部分 :) 已经在下面得到了答案,但无论如何感谢!如果您有兴趣,我们应该对每个 n 进行大量模拟,以找到所需的预期磁盘数量,并稍微分析数据

标签: algorithm matlab continuum large-data


【解决方案1】:

让我们将您的问题重新表述为这样的决策问题:

从 PRNG 的种子 s 开始,在 n x n 方格中随机分布 m 个单位圆盘,并确定它们是否从左侧到右侧形成一条连通路径。

和:

从 PRNG 的种子 s 开始,在 n x n 方格中随机分布 m 个单位圆盘,并确定它们是否覆盖整个正方形。

如果你能解决这些决策问题,那么你可以通过对可能的值进行二分搜索来找到 m 的最小值。

您可以通过像这样生成磁盘来解决这些决策问题,而无需使用大量 RAM:

  1. 用给定的种子 s 初始化您的 PRNG
  2. 对于每个磁盘 1 ... m,随机选择它将进入的列(即 floor(center.x))。累积所有列的计数以确定每个列中有多少磁盘。设 COUNT(col) 为列 col 中要生成的磁盘数
  3. 对于 0 ... n-1 中的每个列,生成在该列中均匀分布的 COUNT(col) 个磁盘。

现在您主要从左到右生成磁盘。上述两个决策问题都有从左到右的解决方案,一次只需要查看一两列中的磁盘,因此您只需要记住一两列磁盘。

对于完全覆盖问题,从左到右工作,并使用该列和相邻列中的磁盘确定方形中的每一列是否被完全覆盖。没有其他磁盘可以到达。

对于左右路径问题,使用 union-find 从左到右工作,以跟踪当前列中哪些磁盘连接到左侧并相互连接。当您到达最后一列时,您可以检查最后一列中是否有任何磁盘连接到左侧并超出右侧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-19
    • 2018-10-01
    • 2017-04-26
    • 1970-01-01
    • 2022-06-11
    • 2021-08-06
    • 2020-04-01
    • 2010-11-29
    相关资源
    最近更新 更多