【问题标题】:Arranging N spheres in a unit cube在一个单位立方体中排列 N 个球体
【发布时间】:2021-06-29 13:32:13
【问题描述】:

我想在一个单位立方体内排列 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

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

【问题讨论】:

    标签: python optimization simulation physics


    【解决方案1】:

    如果我理解正确,当距离小于 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)]
    

    【讨论】:

    • 非常感谢您的回复。我正在尝试做的是在一个单位立方体内模拟 N 个硬球,使球不会相互重叠(因此小于 sigma 条件的两倍)。如果我实施您建议的阈值,某些球体不会留在框外吗?
    猜你喜欢
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多