在一些处理数字程序中,我有一个函数,它可以在三维中只有1或0。我事先并不知道这个函数,但我需要知道函数的总“表面”等于零。在类似的问题中,我可以在英国地图的2D表示上绘制一个矩形。该函数在海上等于0,在地球上等于1。我需要知道水的总面积。我想知道什么是最好的并行算法或方法。
我首先想到了以下方法; a)将2D地图区域划分为矩形网格。对于属于每个单元中心的每个点,检查它是否是水的地球。这可以并行完成。在程序结束时,我将有一个带有1和0的矩阵。我会精确地得到这个区域。现在我想增加这个精度,所以b)选择在零和1之间的边界区域中的单元格(执行此操作的最佳标准是什么?)并在这些单元格中,将它们再次划分为连续的单元格并重复该过程直到获得所需的准确度。我想在这个过程中,关键参数是每个新阶段的网格大小,以及如何存储和检查属于边界区域的单元格。最后,从计算的角度来看,最优化的方法是执行最少数量的检查,以获得具有所需精度的总表面值。
答案 0 :(得分:2)
首先,看起来您正在谈论 3D 功能,例如对于两个坐标x和y,如果(x,y)属于海,则f(x, y) = 0
,否则为f(x, y) = 1
。
话虽如此,您可以使用以下简单方法。
当然,您可以使用任何其他方法来计算表面,Mothe Carlo就是一个例子。但想法是一样的:将你的问题细分为N个子问题,并行求解,然后结合结果。
更新:对于蒙特卡罗方法,误差估计值减少为1 / sqrt(N),其中N是样本数。例如,要将误差减少2倍,则需要将采样点数量增加4倍。
答案 1 :(得分:1)
我相信你的态度是合理的。
选择0和1之间边界区域中的区域(执行此操作的最佳标准是什么?)
每个细胞有8个sorrunding细胞(3x3),或24个sorrunding细胞(5x5)。如果9或25个细胞中至少有一个含有土地,并且这些细胞中至少有一个含有水 - 增加整个细胞块(3x3或5x5)的准确度并再次查询。
当准确度足够好 - 而不是分裂时,只需将土地面积添加到总和中。
<强>效率强>
使用生产者 - 消费者队列。创建 n 个线程,其中 n 等于计算机上的核心数。所有线程应该做同样的工作:
首先,只需将整个区域划分为合理大小的单元格并将其全部排除。
您还可以通过在混合时不添加所有9或25个单元格进行优化,但检查模式(仅限顶部/底部/左/右单元格)。
修改强>
在准确性和性能之间存在权衡:如果初始单元尺寸太大,您可能会错过小湖泊或小岛屿。因此,优化标准应该是:从可能的最大单元开始,以确保足够的精度。