53

का परीक्षण कैसे करना चाहिए मैंने कुछ आनुवंशिक एल्गोरिदम बनाए हैं; वे काम करते हैं (वे जल्दी से एक उचित समाधान मिलते हैं)। लेकिन अब मैंने TDD खोजा है। क्या टीडीडी तरीके से genetic algorithm (जो यादृच्छिक संख्याओं पर भारी निर्भर करता है) लिखने का कोई तरीका है?मुझे आनुवंशिक एल्गोरिदम

अधिक आम तौर पर सवाल उठाने के लिए, आप एक गैर-निर्धारक विधि/फ़ंक्शन का परीक्षण कैसे करते हैं। यहां मैंने जो सोचा है:

  1. एक विशिष्ट बीज का उपयोग करें। अगर मैं कोड में पहली बार गलती करता हूं तो कौन मदद नहीं करेगा, लेकिन रीफैक्टरिंग करते समय बग खोजने में मदद करेगा।

  2. संख्याओं की एक ज्ञात सूची का उपयोग करें। उपर्युक्त की तरह ही मैं हाथ से कोड का पालन कर सकता हूं (जो बहुत कठिन होगा)।

  3. एक स्थिर संख्या का उपयोग करें। कम से कम मुझे पता है कि क्या उम्मीद करनी है। यह सुनिश्चित करना अच्छा होगा कि एक पासा हमेशा 6 पढ़ता है जब रैंडमफ्लैट (0,1) हमेशा देता है 1.

  4. जितना संभव हो सके GA से अधिक गैर-निर्धारक कोड को स्थानांतरित करने का प्रयास करें। जो मूर्खतापूर्ण लगता है क्योंकि यह इसके उद्देश्य का मूल है।

परीक्षण पर बहुत अच्छी किताबों के लिंक भी सराहना की जाएगी।

उत्तर

14

मुझे लगता है परीक्षण है कि एक ही रास्ता करने के लिए अपने सुसंगत तर्कलगातार इनपुट लागू करने के लिए है, ... या एक ही automaton जिसका राज्य से पहले और उस यात्रा के बाद परीक्षण किया जाता है के रूप में प्रत्येक यात्रा का इलाज, मोड़ निर्धारिती पुनरावृत्ति मूल्यों के आधार पर परीक्षण योग्य घटकों में समग्र नोडेटर्मिनिस्टिक प्रणाली।

के लिए विविधताओं/प्रजनन/पुनरावृत्तियों में विशेषता विरासत, प्रत्येक यात्रा की सीमाओं पर उन मूल्यों का परीक्षण करने और सफल यात्रा-subtests से ज्ञात इनपुट/आउटपुट के आधार पर सभी पुनरावृत्तियों की वैश्विक उत्पादन का परीक्षण

...

क्योंकि एल्गोरिदम पुनरावृत्त है, आप यह सुनिश्चित करने के लिए प्रेरण का उपयोग कर सकते हैं ताकि यह सुनिश्चित किया जा सके कि यह 1 पुनरावृत्ति के लिए काम करता है, एन + 1 पुनरावृत्तियों को यह साबित करने के लिए कि यह किसी दिए गए इनपुट रेंज/डोमेन के लिए सही परिणाम (डेटा निर्धारणा के बावजूद) और संभवतः बाधाओं का उत्पादन करेगा इनपुट में मूल्य।

संपादित करें मुझे यह strategies for testing nondeterministic systems मिला जो कुछ अंतर्दृष्टि प्रदान कर सकता है। टीडीडी/विकास प्रक्रिया तर्क साबित होने के बाद यह लाइव परिणामों के सांख्यिकीय विश्लेषण के लिए उपयोगी हो सकता है।

+1

उत्तर के लिए धन्यवाद। मैंने कुछ चांदी की बुलेट की उम्मीद की थी लेकिन मुझे लगता है कि यह परीक्षण करने में आसान नहीं है। अगर मैं यादृच्छिक संख्या सावधानी से उठाता हूं तो मैं प्रत्येक निष्पादन पथ का परीक्षण कर सकता हूं। मैं एक ज्ञात फिटनेस-परिदृश्य के साथ एक परीक्षण भी करूंगा ताकि मैं देख सकूं कि यह कितना अच्छा प्रदर्शन कर रहा है। –

+0

@ जेम्स, बस नोडेटर्मिनिस्टिक एल्गोरिदम के साथ याद रखें कि 'तर्क परीक्षण' और 'अपेक्षित परिणामों' का परीक्षण करने के बीच एक महत्वपूर्ण अंतर है। एक करो, फिर दूसरा। यदि पहला टूटा हुआ है, तो दूसरा अर्थहीन है। –

1

आप अपने एल्गोरिदम के परिणामों का विश्लेषण करने के लिए एक अनावश्यक तंत्रिका नेटवर्क लिख सकते हैं और आउटपुट अपेक्षित परिणामों के आधार पर रैंक किया जा सकता है। :)

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

0

एक परीक्षण जो एल्गोरिदम आपको एक ही इनपुट के लिए एक ही परिणाम देता है, आपकी मदद कर सकता है लेकिन कभी-कभी आप परिवर्तन करेंगे जो एल्गोरिदम के परिणाम लेने के व्यवहार को बदलते हैं।

मैं एक परीक्षण करने का सबसे अधिक प्रयास करता हूं जो सुनिश्चित करता है कि एल्गोरिदम आपको सही परिणाम देता है।यदि एल्गोरिदम आपको कई स्थिर बीजों और यादृच्छिक मानों के लिए सही परिणाम देता है तो एल्गोरिदम काम करता है या किए गए परिवर्तनों के माध्यम से नहीं टूटा जाता है।

टीडीडी में एक और मौका एल्गोरिदम का मूल्यांकन करने की संभावना है। यदि आप स्वचालित रूप से जांच सकते हैं कि परिणाम कितना अच्छा है, तो आप परीक्षण जोड़ सकते हैं जो दिखाते हैं कि परिवर्तन ने आपके परिणामों के गुणों को कम नहीं किया है या आपके गणना समय को अनुचित नहीं किया है।

यदि आप कई बेस बीजों के साथ अपने एल्गोरिदम का परीक्षण करना चाहते हैं तो शायद आप सूट का परीक्षण करना चाहते हैं जो प्रत्येक बचत के बाद शुरू करने के लिए एक त्वरित परीक्षण चलाता है ताकि यह सुनिश्चित किया जा सके कि आपने कुछ भी नहीं तोड़ा है और एक सूट जो चल रहा है बाद के मूल्यांकन के लिए एक लंबा समय

4

मैं कई बार परीक्षण करके यादृच्छिक कार्यों का परीक्षण करता हूं और विश्लेषण करता हूं कि वापसी मूल्यों का वितरण सांख्यिकीय अपेक्षाओं को पूरा करता है (इसमें कुछ सांख्यिकीय ज्ञान शामिल है)।

+0

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

+0

मैंने सामान्य वितरण नहीं कहा, मैंने कहा कि वितरण सांख्यिकीय निष्कर्षों को पूरा करना चाहिए, यानी।, यदि आपको लौटने के लिए एक यादृच्छिक फ़ंक्शन की आवश्यकता है, उदाहरण के लिए, बोल्टज़मान वितरण से संबंधित यादृच्छिक मान, आपको यह जांचना चाहिए कि परीक्षण की पर्याप्त संख्या में ऐसे वितरण का निर्माण होता है या नहीं। – Svante

+0

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

2

यदि आप टीडीडी बात कर रहे हैं, तो मैं निश्चित रूप से निरंतर संख्या चुनकर और वहां से अपने परीक्षण सूट को बढ़ाकर शुरू कर दूंगा। मैंने कुछ अत्यधिक गणितीय समस्याओं पर टीडीडी किया है और यह आपके द्वारा कुछ स्थिर मामलों को जानने में मदद करता है और शुरुआत से भागने के लिए हाथ से काम कर चुके हैं।

डब्ल्यू/आर/टी आपका चौथा बिंदु, जीए से नोडेटर्मिनिस्टिक कोड चल रहा है, मुझे लगता है कि यह शायद विचार करने योग्य दृष्टिकोण है। यदि आप एल्गोरिदम को विघटित कर सकते हैं और nondeterministic चिंताओं को अलग कर सकते हैं, तो यह निर्धारक भागों को सीधे परीक्षण करना चाहिए। जब तक आप चीजों को नाम देने के बारे में सावधान रहें, मुझे नहीं लगता कि आप यहां बहुत अधिक बलिदान कर रहे हैं। जब तक मैं आपको गलत समझ नहीं पा रहा हूं, तब भी GA इस कोड पर प्रतिनिधि होगा, लेकिन यह कहीं और रहता है।

जहाँ तक लिंक के रूप में (डेवलपर) मेरे पसंदीदा में परीक्षण पर बहुत अच्छी किताबें हैं:

1

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

यह आपके यूनिट परीक्षणों के लिए है। आपके एकीकरण परीक्षणों के लिए, यदि आप ऐसा कर रहे हैं, तो आप अपनी यादृच्छिक संख्या पीढ़ी का मज़ाक उड़ाते हुए इसे एल्गोरिदम के साथ बदल सकते हैं जो आपको याद रखने के लिए आवश्यक प्रत्येक यादृच्छिक संख्या के लिए ज्ञात संख्या 0..n से वापस कर देगा। http://code.google.com/p/evo-lisa-clone/

के आवेदन में सबसे सरल यादृच्छिक परिणाम विधि लेते हैं:: PointGenetics.Create है, जो एक यादृच्छिक बिंदु बनाता है, सीमाओं को देखते हुए

1

मैं एक सी # TDD आनुवंशिक एल्गोरिथम शिक्षाप्रद आवेदन लिखा था।इस विधि के लिए मैं 5 परीक्षण का इस्तेमाल किया, और उनमें से कोई एक विशिष्ट बीज पर निर्भर करता है:

http://code.google.com/p/evo-lisa-clone/source/browse/trunk/EvoLisaClone/EvoLisaCloneTest/PointGeneticsTest.cs

अनियमितता परीक्षण सरल है: एक बड़ी सीमा (कई संभावनाएं) के लिए, लगातार दो उत्पन्न अंक बराबर नहीं होना चाहिए । शेष परीक्षण अन्य बाधाओं की जांच करते हैं।

+1

प्रतिक्रिया के लिए धन्यवाद, मैं बाद में कोड देखेंगे। मैंने अब परीक्षण किया है और मुझे लगता है कि आपके लिए एक समान रूप से समान दृष्टिकोण का उपयोग किया है। मैंने विभिन्न चीजों का परीक्षण किया जो मुझे पता था कि जब मैंने इसे 'यादृच्छिक' संख्याओं के लिए विशिष्ट मान दिए थे। तब मैंने वितरण की जांच की 'लगभग 10,000 परीक्षणों से मुझे उम्मीद थी। सही नहीं है लेकिन यह करेगा। –

0

मैं आपके यूनिट परीक्षण मामलों (http://en.wikipedia.org/wiki/Mock_object) के लिए नकली वस्तुओं का उपयोग करने में अत्यधिक सुझाव देना चाहता हूं। आप उन वस्तुओं को नकल करने के लिए उनका उपयोग कर सकते हैं जो इसके बजाय अपेक्षित परिणाम प्राप्त करने के लिए यादृच्छिक अनुमान लगाते हैं।

1

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

जीए पैरामीटर (उत्परिवर्तन दर, क्रॉस-ओवर रणनीति, जो भी हो) का परीक्षण करने के संबंध में यदि आप स्वयं को उस सामान को लागू कर रहे हैं तो आप निश्चित रूप से इसका परीक्षण कर सकते हैं (आप फिर से उत्परिवर्तन तर्क आदि के आसपास इकाई परीक्षण कर सकते हैं) लेकिन आप जीए के 'ठीक-ट्यूनिंग' का परीक्षण करने में सक्षम नहीं होंगे।

दूसरे शब्दों में, यदि आप वास्तव में पाए गए समाधानों की भलाई के अलावा जीए वास्तव में अन्य प्रदर्शन करते हैं तो आप परीक्षण नहीं कर पाएंगे।

2

जीए एल्गोरिदम के गैर-निर्धारक कार्यों के यूनिट परीक्षण के लिए मैं एक तरीका है जो उस यादृच्छिक संख्याओं का उपयोग करने वाले तर्क के एक अलग कार्य में यादृच्छिक संख्याओं का चुनाव डालता है।

उदाहरण के लिए, यदि आपके पास कोई ऐसा कार्य है जो जीन (कुछ का वेक्टर) लेता है और जीन के दो यादृच्छिक बिंदु उन्हें (उत्परिवर्तन या जो कुछ भी) करने के लिए लेता है, तो आप यादृच्छिक संख्याओं की पीढ़ी को डाल सकते हैं एक समारोह, और फिर उन्हें जीन के साथ दूसरे कार्य में पास करें जिसमें उस संख्या को तर्क दिया गया हो।

इस तरह आप तर्क कार्य के साथ टीडीडी कर सकते हैं और इसे कुछ जीन और कुछ संख्याएं पास कर सकते हैं, यह जानकर कि जीन पर तर्क क्या होना चाहिए और संशोधित जीन पर आवेषण लिखने में सक्षम होना चाहिए।

यादृच्छिक संख्याओं की पीढ़ी के साथ परीक्षण करने के लिए एक और तरीका, उस पीढ़ी को किसी अन्य वर्ग में बाहरी कर रहा है, जिसे किसी संदर्भ के माध्यम से या कॉन्फ़िगरेशन मान से लोड किया जा सकता है, और परीक्षण निष्पादन के लिए अलग-अलग उपयोग किया जा सकता है। उस वर्ग के दो कार्यान्वयन होंगे, एक उत्पादन के लिए जो वास्तविक यादृच्छिक संख्या उत्पन्न करता है, और दूसरा परीक्षण के लिए, जिसके बाद संख्याएं स्वीकार करने के तरीके होंगे जो बाद में उत्पन्न होंगे। फिर परीक्षण में आप उन निश्चित संख्याओं को प्रदान कर सकते हैं जो कक्षा परीक्षण कोड को आपूर्ति करेगी।

संबंधित मुद्दे