我試圖用「粒子」(由3D XYZ向量表示)以最佳方式填充3D球體體積,同時需要保持彼此之間的特定距離,同時嘗試最小化量他們之間存在的自由空間。用較小的球體最佳填充3D球體
雖然有一個捕獲 - 粒子本身可能會落在球形體積的邊界上 - 它們不能在其外部存在。理想情況下,我想最大化落在這個邊界上的粒子數量(這使得這是一種球形填充問題,我想),然後向內填充剩餘的體積。
有沒有可以解決這類事情的任何種算法?它並不需要精確,但關鍵在於最終解決方案的密度需要相當準確(「完美」解決方案的+/- 5%)。
我試圖用「粒子」(由3D XYZ向量表示)以最佳方式填充3D球體體積,同時需要保持彼此之間的特定距離,同時嘗試最小化量他們之間存在的自由空間。用較小的球體最佳填充3D球體
雖然有一個捕獲 - 粒子本身可能會落在球形體積的邊界上 - 它們不能在其外部存在。理想情況下,我想最大化落在這個邊界上的粒子數量(這使得這是一種球形填充問題,我想),然後向內填充剩餘的體積。
有沒有可以解決這類事情的任何種算法?它並不需要精確,但關鍵在於最終解決方案的密度需要相當準確(「完美」解決方案的+/- 5%)。
您的約束條件有點含糊不清,所以很難說,但我會嘗試使用字段方法。第一次看到:
和子鏈接在這裏你可以找到這種方法的一些例子。
現在算法中:
地方N
顆粒隨機內球
N
應該是安全的低,因此它更小那麼你的解決方案的粒子計數。
開始場模擬
所以使用您的解決方案規則創建的吸引力和排斥力,推動通過牛頓D'蘭伯特物理學的粒子。不要忘記增加摩擦力(所以運動將在一段時間後停止)和球體積邊界。
停止當你的粒子停止移動
所以如果max(|particles_velocity|)<threshold
停止。
現在檢查是否所有的粒子都正確放置
沒有違反任何規則。如果是,那麼記住這個位置作爲解決方案,並再次嘗試從#1與N+1
顆粒。如果不停止並使用最後的正確解決方案。
爲了加快速度,您可以添加更多的粒子,而不是使用類似於二分查找的(N+1)
(添加32個粒子,直到您可以...然後只是16 ...)。另外,您不需要在其他運行中使用#1中的隨機位置。您可以讓其他粒子開始放置在上次運行解決方案中的位置。
如何確定解決方案的準確性是完全不同的問題。由於您沒有提供確切的規則,我們只能猜測。我會嘗試估計理想的顆粒密度並根據球體積計算理想的顆粒計數。你也可以使用這個來初始猜測N
,然後和最後的N
比較。