저는 행성 과학 연구원이고 제가 진행하고있는 프로젝트 중 하나 는 토성의 고리 에 대한 N- 몸 시뮬레이션입니다. 이 특정 연구의 목표는 입자들이 그들 자신의 중력 하에서 함께 응집되는 것을 관찰하고, 세포 내의 모든 입자의 평균 속도에 대한 덩어리의 총 질량을 측정하는 것입니다. 우리는 이것이 거대한 구조물이 거의 가장자리 고리에 그림자를 드리 우는 Saturnian 여름 동지 동안 Cassini 우주선이 관찰 한 것을 설명 할 수 있는지 알아 내려고 노력하고 있습니다 . 아래는 주어진 타임 스텝이 어떻게 보이는지에 대한 스크린 샷입니다. (각 입자의 직경은 2m이고 시뮬레이션 셀 자체는 약 700m입니다.)
내가 사용하는 코드는 이미 모든 시간 단계에서 평균 속도를 내뿜습니다. 내가해야 할 일은 덩어리 사이의 입자의 질량을 결정하는 방법을 알아내는 것입니다. 나는 모든 입자의 위치, 질량, 크기 등을 알고 있지만, 102,000-105,000과 함께 입자 30,000-40,000이 사람의 눈에 명백한 하나의 가닥을 구성한다는 것을 쉽게 알지 못합니다.
따라서 내가 작성해야하는 알고리즘은 모든 입자 위치를 통과하고, 어떤 입자가 덩어리에 속하는지 알아 낸 다음 가능한 한 사용자가 입력 한 매개 변수 (복제 성 및 객관성)가 적은 코드 여야합니다. 질량. 셀의 모든 것에 반대되는 "각"덩어리 / 가닥에 대해 할 수 있다면 좋을 것입니다. 그러나 실제로 분리하기 위해 필요 하지는 않습니다 .
내가 생각한 유일한 것은 모든 입자 사이의 거리를 계산하는 일종의 N 2 거리 계산을 수행하는 것입니다. 예를 들어, 가장 가까운 100 입자가 특정 거리 내에 있으면 그 입자는 클러스터. 그러나 그것은 꽤 조잡 해 보였고 CS 사람들과 프로그래머가보다 우아한 해결책을 알고 싶었습니까?
내 솔루션으로 편집 : 내가 한 일은 가장 가까운 이웃 / 클러스터 접근 방식을 취하고 quick-n-dirty N 2 구현을 먼저 수행하는 것이 었습니다 . 따라서 모든 파티클을 가져 와서 다른 모든 파티클까지의 거리를 계산하십시오. 클러스터에서 임계 값은 d 거리 내에 N 개의 파티클 이 있는지 여부입니다 ( 불행히도 우선 순위를 설정 해야하는 두 가지 매개 변수). 응답 / 의견, 그중 일부가 없어도 도망 가지 않을 것입니다).
그런 다음 거리를 정렬하지 않고 단순히 순서 N 검색을 수행하고 d 내의 입자에 대한 카운터를 증가 시키고 그 계수를 6의 계수만큼 증가시킵니다 . 그런 다음 "어리석은 프로그래머의 나무"를 추가했습니다 트리 코드에 대해서는 아무것도 옆에 없습니다). 시뮬레이션 셀을 설정된 그리드 수로 나눕니다 (그리드 크기 ≈7 d 일 때 가장 좋은 결과 ) 주 그리드가 셀과 정렬되고 하나의 그리드는 x 와 y의 절반으로 오프셋되고 다른 하나는 1/4 ± X 및 ± Y . 그런 다음 코드는 파티클을 그리드로 나누고 각 파티클 N 은 해당 셀의 다른 파티클까지 거리를 계산하면됩니다.
이론적으로 이것이 실제 트리라면 N 2 속도 와 반대로 N * log ( N ) 차수 를 가져와야 합니다. 50,000 입자 하위 세트의 경우 속도가 17 배 증가하고 150,000 입자 셀의 경우 속도가 38 배 증가했습니다. 첫 번째는 12 초, 두 번째는 53 초, 500,000 입자 셀의 경우 460 초입니다. 이는 코드가 시뮬레이션을 한 단계 앞당겨 실행하는 데 걸리는 시간과 비교할 수있는 속도이므로이 시점에서 합리적입니다. 아-그리고 그것은 완전히 스레드되어 있으므로 그것을 던질 수있는만큼 많은 프로세서가 필요합니다.