首页 > 解决方案 > 在一个单位立方体中排列 N 个球体

问题描述

我想在一个单位立方体内排列 N 个硬球,使体积密度为 eta。我有一个代码,但效率不高。

def direct_disks_box(N, sigma):
    condition = False
    while condition == False:
        L = [[random.uniform(sigma, 1.0 - sigma), random.uniform(sigma, 1.0 - sigma), random.uniform(sigma, 1.0 - sigma)]]
        
        for k in range(1, N):
            a = [random.uniform(sigma, 1.0 - sigma), random.uniform(sigma, 1.0 - sigma), random.uniform(sigma, 1.0 - sigma)]
            min_dist = min(math.sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2 + (a[2] - b[2]) ** 2) for b in L) 
            if min_dist < 2.0 * sigma: 
                condition = False
                break
            else:
                L.append(a)
                
                condition = True
    return L

如果你看上面的代码,拒绝率非常高。有什么办法可以降低拒签率?零拒绝率会很棒。太感谢了!

标签: pythonoptimizationsimulationphysics

解决方案


如果我理解正确,当距离小于 sigma 的两倍时您会拒绝,并且您想减少拒绝的次数。但是您的“L”数组和您的“a”数组是使用相同的分布(均匀,在相同的限制之间)生成的,因此(不涉及数学)距离的概率分布函数(PDF)的平均值有点远离您的“两倍西格玛”阈值并且选择最小值无济于事。为了降低拒绝的几率,您可以确保使用稍微宽松的限制生成“a”数组。例如尝试以下操作:

threshold = -1.01 # changing "a" array distribution
a = [random.uniform(sigma*threshold, 1.0 - sigma*threshold), random.uniform(sigma*threshold, 1.0 - sigma*threshold),
             random.uniform(sigma*threshold, 1.0 - sigma*threshold)]

推荐阅读