मैं एक ग्रह विज्ञान शोधकर्ता हूं और एक परियोजना जिस पर मैं काम कर रहा हूं वह है शनि के छल्ले के एन- व्यक्ति सिमुलेशन। इस विशेष अध्ययन का लक्ष्य कणों को अपने आत्म-गुरुत्वाकर्षण के तहत एक साथ टकराते हुए देखना है और सेल में सभी कणों के औसत वेग बनाम क्लंप के कुल द्रव्यमान को मापना है। हम यह पता लगाने की कोशिश कर रहे हैं कि क्या यह सैटर्नियन गर्मियों के संक्रांति के दौरान कैसिनी अंतरिक्ष यान द्वारा किए गए कुछ अवलोकनों की व्याख्या कर सकता है जब बड़ी संरचनाओं को लगभग किनारे के छल्ले पर छाया डालते हुए देखा गया था। नीचे एक स्क्रीनशॉट दिया गया है जो किसी भी टाइमस्टेप जैसा दिखता है। (प्रत्येक कण 2 मीटर व्यास का होता है और सिमुलेशन सेल अपने आप में लगभग 700 मीटर होती है।)
मैं पहले से उपयोग कर रहा कोड हर टाइमस्टेप पर औसत वेग निकालता हूं। क्लंप्स में कणों के द्रव्यमान को निर्धारित करने के लिए मुझे क्या करना चाहिए और उनके बीच आवारा कणों का पता नहीं लगाना चाहिए। मैं हर कण की स्थिति, द्रव्यमान, आकार इत्यादि को जानता हूं, लेकिन मुझे आसानी से पता नहीं है कि, कहो, कण 30,000-40,000 के साथ-साथ 102,000-105,000 एक स्ट्रैंड बनाते हैं जो कि मानव आंख के लिए स्पष्ट है।
इसलिए, मुझे जिस एल्गोरिथ्म को लिखने की आवश्यकता है, उसे कुछ कोड के साथ उपयोगकर्ता के रूप में दर्ज किए जाने की आवश्यकता होगी जो संभव हो (प्रतिकृति और निष्पक्षता के लिए) जो कि सभी कण पदों से गुजरेंगे, यह पता लगाएंगे कि कण किस कण से संबंधित हैं और फिर गणना करें द्रव्यमान। यह बहुत अच्छा होगा यदि यह "प्रत्येक" क्लंप / स्ट्रैंड के लिए ऐसा कर सकता है जैसा कि सेल के ऊपर सब कुछ है, लेकिन मुझे नहीं लगता कि मैं वास्तव में था उन्हें अलग करने की आवश्यकता है।
केवल एक चीज जो मैं सोच रहा था, वह एन 2 के कुछ प्रकार कर रही थी डिस्टेंस कैलकुलेशन के जहाँ मैं हर कण के बीच की दूरी की गणना करूँगा और अगर, कहूँ, निकटतम 100 कण एक निश्चित दूरी के भीतर थे, तो वह कण एक का हिस्सा माना जाएगा क्लस्टर। लेकिन यह बहुत ही टेढ़ा लगता है और मैं उम्मीद कर रहा था कि आप सीएस लोग और प्रोग्रामर एक और अधिक सुंदर समाधान के बारे में जान सकते हैं?
मेरे समाधान के साथ संपादित: क्या मैंने किया था निकटतम-पड़ोसी / क्लस्टर दृष्टिकोण का एक तरह से लेते हैं और जल्दी-एन-गंदा करने के लिए था एन 2 पहले कार्यान्वयन। इसलिए, हर कण को लें, अन्य सभी कणों से दूरी की गणना करें, और एक क्लस्टर में थ्रेशोल्ड के लिए या नहीं, क्या डी दूरी के भीतर एन कण थे (दो मापदंडों को एक प्राथमिकता तय करनी होगी , दुर्भाग्य से, लेकिन जैसा कि कुछ ने कहा था प्रतिक्रियाएँ / टिप्पणियाँ, मैं उनमें से कुछ नहीं होने के साथ दूर नहीं जा रहा था)।
फिर मैंने इसे दूरियों को छाँटकर नहीं देखा, लेकिन केवल एक क्रम N खोज कर d के भीतर के कणों के लिए एक काउंटर बढ़ा दिया, और उस सामान को 6. के एक कारक द्वारा भर दिया। तब मैंने एक "बेवकूफ प्रोग्रामर का पेड़" जोड़ा (क्योंकि मुझे पता है) पेड़ कोड के बारे में कुछ भी नहीं)। मैं सिमुलेशन सेल को ग्रिड के एक सेट संख्या में विभाजित करता हूं (सबसे अच्छा परिणाम जब ग्रिड आकार up7 घ ) जहां सेल के साथ मुख्य ग्रिड लाइनें ऊपर होती हैं, एक ग्रिड एक्स और वाई में आधे से ऑफसेट होती है , और अन्य दो द्वारा ऑफसेट होते हैं X और । Y में 1/4 । कोड तब कणों को ग्रिड में विभाजित करता है, फिर प्रत्येक कण एन केवल उस सेल में अन्य कणों की गणना की दूरी होती है।
सैद्धांतिक रूप से, अगर यह एक वास्तविक पेड़ था, तो मुझे एन 2 लॉग के विपरीत ऑर्डर एन * लॉग ( एन ) प्राप्त करना चाहिए । मुझे दोनों के बीच कहीं मिला, जहां 50,000-कण उप-सेट के लिए मुझे गति में 17x की वृद्धि हुई, और 150,000-कण सेल के लिए, मुझे गति में 38x की वृद्धि हुई। पहले के लिए 12 सेकंड, दूसरे के लिए 53 सेकंड, 500,000-कण सेल के लिए 460 सेकंड। वे तुलनात्मक गति हैं कि सिमुलेशन 1 टाइमस्टेप को आगे बढ़ाने में कोड को कितना समय लगता है, इसलिए इस बिंदु पर यह उचित है। ओह - और यह पूरी तरह से पिरोया गया है, इसलिए इसे जितने प्रोसेसर मैं ले जाऊंगा, उतना ही मैं इसे फेंकूंगा।