这项工作的主要目标是通过满足以下条件,用指定数量的具有指定半径的球体填充一个大盒子:
- 每个球体至少与另一个球体接触(没有任何重叠,只是接触)(可以指定每个球体的最小接触数,例如每个球体可以与 [1 到 n] 个其他球体接触)。总介质必须是连续的,即所有球体都必须有到其他球体的连接路径;没有任何分离的球体组。
- 球体是随机分布的(以避免将它们并排排列,例如排成一排,因此,避免空隙空间分布的严重差异)在整个盒子体积中分布相当均匀,而不仅仅是从盒子的一侧填充一些百分比,并且像那样。
预期的模型将是:
为此,一开始我去找了一些优化库,比如pyomo,但是对于大数据(大约 100000 到 500000 个球体)使用优化方法根本不适合这个问题,因为我搜索了那些(就时间和 …)。
所以,我尝试了另一种创新的方法:
为了这个目的并且为了在大盒子中均匀分布球体以使球体之间的空隙分布均匀,我将大盒子分割成数千个部分(具有相同大小),包含相对相同的球体体积(就总体积而言)该段中的球体)。为每个框指定了球体的数量及其半径(因此,我在此示例中为每个段创建了两组球体):
示例半径文件:https ://drive.google.com/file/d/1RIL6n0yGSNBYmI-t_FmuW1vL29ncDUK8/view?usp=sharing
在我的小例子中,我有两个盒子粘在一起(这些盒子是那个片段的例子),我会用球体填充它们。框的每个顶点的坐标和 ID 可用,例如:
IDs = np.array([np.array([9, 8, 7, 6, 3, 2, 1, 0]), np.array([11, 10, 9, 8, 5, 4, 3, 2])])
Vertices = [[np.array([0.1, 0., 0.1]), np.array([-0.1, 0., 0.1]), np.array([0.1, -0.2, 0.1]), np.array([-0.1, -0.2, 0.1]),
np.array([0.1, 0., -0.1]), np.array([-0.1, 0., -0.1]), np.array([0.1, -0.2, -0.1]), np.array([-0.1, -0.2, -0.1])],
[np.array([0.1, 0.2, 0.1]), np.array([-0.1, 0.2, 0.1]), np.array([0.1, 0., 0.1]), np.array([-0.1, 0., 0.1]),
np.array([0.1, 0.2, -0.1]), np.array([-0.1, 0.2, -0.1]), np.array([0.1, 0., -0.1]), np.array([-0.1, 0., -0.1])]]
将球体放置在盒子壁的指定距离内(随机);如果我们可以按预期直接分配球体,则可以省略此步骤:
rng = np.random.default_rng(85)
max_rad = 0.0375
Rand_Pos = []
No_Spheres = [542, 543]
for i, j in enumerate(IDs):
min_coord = np.amin(Vertices[i], axis=0)
max_coord = np.amax(Vertices[i], axis=0)
rand_pos_cell = []
for m in range(No_Spheres[i]):
rand_x = rng.uniform(min_coord[0] + max_rad, max_coord[0] - max_rad, 1)
rand_y = rng.uniform(min_coord[1] + max_rad, max_coord[1] - max_rad, 1)
rand_z = rng.uniform(min_coord[2] + max_rad, max_coord[2] - max_rad, 1)
rand_pos_cell.append([rand_x, rand_y, rand_z])
Rand_Pos.append(rand_pos_cell)
结果初始创建的坐标文件 ( Rand_Pos
):https ://drive.google.com/file/d/1Aphl8ndEYnfv78cIUfiP-8vMi05Tjb8K/view?usp=sharing
之后,由于我不知道任何合适的pythonic代码可以做到这一点,我用另一个软件在它们之间进行了排斥(它们是重叠的),但是无法控制距离并且它们失去了联系:
此图像中的分布是可以接受的;球体分布在盒子的所有部分。但是,很明显,球体之间没有接触(它们之间没有任何接触)。我认为这项工作与Voronoi tessellation
非常相似,也许可以通过scipy和...中的此类相关算法来处理。但是,不知道能不能。
如果有人帮助实现目标,我将不胜感激。建议的答案在处理大数据的时间方面必须是有效的。
仅用于固化重叠的测试数据,如果需要,由 7 个球体(红色圆盘显示球体重叠位置)
半径:https ://drive.google.com/file/d/1EJkYk8AuvJjtqFdFerAjFQtvMmGtrRfi/view?usp=分享 位置:https ://drive.google.com/file/d/1ERzXZN79jxXnGbO3IhHfOgYtpcZN2STj/view?usp=sharing