2011-05-31 23 views
6

सरल अध्ययन किया जाता है: चींटी जीवन सिमुलेशनचींटी सिमुलेशन: प्रत्येक चींटी या कुछ और के लिए प्रक्रिया/थ्रेड बनाना बेहतर है?

मैं एक OO संरचना कि बांबी, चींटी के लिए एक कक्षा और पूरे सिम्युलेटर के लिए एक कक्षा के लिए एक कक्षा को देखने बना रहा हूं।

अब मैं "कैसे" बनाने पर विचार विमर्श कर रहा हूँ चींटियों 'जी' ...

मुझे पता है कि यह सिर्फ शुरू किया, लेकिन मैं कर रहा हूँ बुद्धिशीलता जैसी परियोजनाओं हैं कि, मैं कर रहा हूँ नहीं की तलाश में एक बस तैयार करने के लिए खाने-पकवान

ईमानदारी से मुझे "बेहतर क्या है", पीएथॉन में AFAIK थ्रेड, समझने के लिए कुछ परीक्षण करना है, प्रक्रियाओं की तुलना में कम स्मृति का उपयोग करें।

सिमुलेशन शुरू करते समय "चींटियों" को क्या करना है बस: यादृच्छिक दिशा के साथ घूमना, अगर उन्हें खाना मिल जाता है -> खाने/खाने के लिए लाएं, अगर उन्हें भोजन की परिवहन करने वाली किसी अन्य चीज से दूसरी चींटी मिलती है -> हमला -> भोजन इकट्ठा करें -> क्या करना है .... और इसी तरह ... इसका मतलब है कि मुझे चींटियों और पूरे वातावरण में जानकारी "साझा" करना है।

इसलिए मैं फिर से लिखता हूं: प्रत्येक चींट या किसी और चीज के लिए प्रक्रिया/थ्रेड बनाना बेहतर है?

संपादित करें: मेरे प्रश्न "बेहतर क्या है" के कारण, मैं प्राप्त किए गए सभी स्मार्ट उत्तरों को उखाड़ फेंक दूंगा, और मैंने उन पर भी एक टिप्पणी की। मेरे परीक्षणों के बाद, मैं सबसे अच्छा जवाब स्वीकार करूंगा।

+2

प्रति चींटी एक पूर्ण धागा ओवरकिल लगता है। वे प्रक्रियाओं से सस्ता हैं, हाँ, लेकिन उनके पास अभी भी * कुछ * ओवरहेड है (यदि केवल संदर्भ स्विचिंग) और सीपीथॉन में वे समानांतर में भी नहीं चल सकते हैं (और यदि वे कर सकते हैं, तब भी, आप अभी भी सीमित हैं कोर का नंबर)। – delnan

+1

प्रक्रियाओं और धागे की सापेक्ष लागत अंतर्निहित ओएस पर भी निर्भर होगी। मैं @ डेलनान से सहमत हूं: प्रति थ्रेड एक थ्रेड ओवरकिल है और प्रति चींटी एक प्रक्रिया थर्मोन्यूक्लियर ओवरकिल है। –

+0

आप दोनों को धन्यवाद (थर्मोन्यूक्लियर ओवरकिल के लिए एलओएल), आप क्या सुझाव देते हैं? – MiPnamic

उत्तर

1

मैं @ डेलन से सहमत हूं - यह प्रति चींटी के पूरे धागे को आवंटित करने की तरह लगता है, खासकर यदि आप इसे पूरी तरह से स्केल करने वाले हजारों क्रिटर्स के साथ स्केल करने के लिए देख रहे हैं।

इसके बजाय आप एक "चक्र" में कई चींटियों को अपडेट करने के लिए थ्रेड का उपयोग करने पर विचार कर सकते हैं। आप इसे कैसे लिखते हैं इसके आधार पर - आपको ध्यान से विचार करना होगा कि कौन से डेटा को साझा करने की आवश्यकता है - आप अपने सिमुलेशन को बढ़ाने के लिए इन धागे के पूल का उपयोग करने में भी सक्षम हो सकते हैं।

यह भी ध्यान रखें कि सीपीथॉन में जीआईएल एक ही समय में कोड को निष्पादित करने से कई देशी धागे को रोकता है।

+0

एक थ्रेड -> कई चींटियों ... यह एक असली विकल्प हो सकता है, वैसे भी, जैसा कि आपने बताया था, मुझे साझा डेटा पर विचार करना होगा ... विभिन्न चीजों से चींटियों की कल्पना करें जिन्हें जीवित रहने के लिए "लड़ना" है ... – MiPnamic

1

मुझे लगता है कि थ्रेड समाधान सबसे अच्छा है। यहां तक ​​कि अगर चींटियों व्यक्ति होते हैं, तो वे पर्यावरण साझा करते हैं, थ्रेड का उपयोग करते समय वास्तव में क्या अनुमति है। प्रक्रिया समाधान वास्तविकता से मेल खाता है, पर्यावरण के साथ संचार प्रणाली लागू करना कठिन होगा।

एक और समाधान यह परिभाषित करना होगा कि चींटियां तब होती हैं जब टिक टिक होती है। फिर, थ्रेड या प्रक्रिया का उपयोग करने की कोई आवश्यकता नहीं है।

उदाहरण के लिए:

import time 
... 
while True: 
    for ant in ants: 
     ant.act() 
    time.sleep(tickwait) 

इस बीच, इस समाधान लागू करना आसान है।

+0

आसान एक अच्छी बात है =) वास्तव में चींटी को निरंतर कार्य करने के लिए कुछ ऐसा करना पड़ता है जो ट्रिगर्स को सक्रिय कर सकता है, जैसे भोजन, अन्य चींटियों की तरह ... इसलिए आम तौर पर ant.move() एक और "घटना तक लूप करेगा " – MiPnamic

2

मैंने एक चींटी सिमुलेशन लिखा (एक अच्छा टीएसपी-समाधान खोजने के लिए) और एक थ्रेड-सॉल्यूशन की अनुशंसा नहीं करेगा। मैं अगले चरण में प्रत्येक चींटी की गणना करने के लिए एक लूप का उपयोग करता हूं, इसलिए मेरी चींटियां वास्तव में एक साथ व्यवहार नहीं करती हैं (लेकिन प्रत्येक चरण के बाद सिंक्रनाइज़ होती हैं)।

मुझे उन चींटियों को थ्रेड के साथ मॉडल करने का कोई कारण नहीं दिखता है। रन-टाइम व्यवहार के मामले में इसका कोई फायदा नहीं है और न ही यह गठबंधन (कोड के) के मामले में एक लाभ है!

असली चींटियों समवर्ती होने के बाद, यह स्वीकार्य रूप से थ्रेड का उपयोग करने के लिए थोड़ा अधिक यथार्थवादी हो सकता है, लेकिन सिमुलेशन उद्देश्यों के लिए यह IMHO उपेक्षित है।

+0

ट्रिगर किया गया था अपने अनुभव को साझा करने के लिए धन्यवाद, मैं थ्रेड के साथ 10 चींटियों की नकल करने के साथ शुरू करूंगा, मैं समझना चाहता हूं कि" सिस्टम संसाधनों में कितना खर्च हो सकता है, तो मुझे – MiPnamic

4

मैं stackless पर एक नज़र डालने की सलाह दूंगा। स्टैक्लेसलेस टास्कलेट्स को पेश करता है जो माइक्रॉथ्रेड्स के उत्साहित हैं जो परंपरागत धागे से जुड़े प्रदर्शन और जटिलता समस्याओं के बिना थ्रेड-आधारित प्रोग्रामिंग के लाभ प्राप्त करने की अनुमति देता है

स्टैकलेस के साथ एक संभावित समस्या यह है कि जहां तक ​​मुझे पता है कि आपको उपयोग करने की आवश्यकता है microthreads का उपयोग करने के लिए एक संशोधित दुभाषिया या pypy। हालांकि यह कुछ फायदेमंद हो सकता है, क्योंकि कुछ ऐसी कंपनियां हैं जो बड़ी सफलता के साथ स्टैकलेस का उपयोग करती हैं (उदाहरण के लिए। इसका उपयोग ईवी ऑनलाइन के लिए किया जाता है)

greenlet पर भी एक नज़र डालें जो आपको बिना किसी प्रकार का माइक्रोथ्रेड प्रदान करता है दुभाषिया की जगह। हालांकि स्टैकलेस ग्रीनलेट की तुलना में केवल सीमित फीचरेट प्रदान करता है।

+0

दिखाई देगा, मैं बेकार कोशिश करूंगा जल्द से जल्द :) धन्यवाद – MiPnamic

+0

मैं उत्सुक हूँ, यह आपके लिए कैसे काम करता है? क्या आपको स्टैकलेस देखने का मौका मिला? – circus

+0

मैं इस सप्ताहांत को स्टैकलेस के साथ परीक्षण करूंगा =) (कोई फ्रीटाइम माफ नहीं) xD – MiPnamic

3

यदि आप जीपीएल को नहीं मानते हैं, तो मेरा सुझाव है कि आप Khronos सिमुलेशन फ्रेमवर्क का उपयोग करें, जो आपको प्रत्येक चींटी को जनरेटर के रूप में परिभाषित करने की अनुमति देता है ताकि आपको धागे बनाने की आवश्यकता न हो। ख्रोनोस इंजन शेड्यूलिंग का ख्याल रखता है।

मैं वास्तव में GarlicSim नामक एक प्रतिस्पर्धी प्रोजेक्ट विकसित कर रहा हूं जिसे आप अपने सिमुलेशन के लिए भी उपयोग कर सकते हैं, लेकिन आपके मामले के लिए ख्रोनोस बेहतर होगा। (जब तक आपको जीपीएल के साथ कोई समस्या न हो।)

+0

से शुरू करने के लिए एक और शानदार बिंदु ... जैसा कि मैं वें ख्रोनोस वेबसाइट पर पढ़ सकता हूं, यह "मुझे क्या चाहिए" ... मैं इसे आजमाउंगा जितनी जल्दी हो सके, धन्यवाद – MiPnamic