यह परीक्षण करने का प्रयास करने के लिए कि क्या कुछ समस्या के लिए एक एल्गोरिथ्म सही है, सामान्य रूप से शुरुआती बिंदु कई सरल परीक्षण मामलों पर एल्गोरिदम को हाथ से चलाने की कोशिश करना है - इसे कुछ उदाहरण समस्या उदाहरणों पर आज़माएं, जिसमें कुछ सरल "कोने के मामले भी शामिल हैं" "। यह एक महान विधर्मी है: यह एक एल्गोरिथ्म में कई गलत प्रयासों को जल्दी से समाप्त करने का एक शानदार तरीका है, और एल्गोरिथ्म क्यों काम नहीं करता है, इसके बारे में समझ हासिल करना।
हालांकि, जब एल्गोरिदम सीखते हैं, तो कुछ छात्रों को वहां रुकने का प्रलोभन दिया जाता है: यदि उनका एल्गोरिथ्म मुट्ठी भर उदाहरणों पर सही ढंग से काम करता है, जिसमें उन सभी कोने के मामलों को भी शामिल किया जा सकता है, जिनके लिए वे प्रयास कर सकते हैं, तो उनका निष्कर्ष है कि एल्गोरिथ्म सही होना चाहिए। हमेशा एक छात्र होता है जो पूछता है: "मुझे अपने एल्गोरिथ्म को सही साबित करने की आवश्यकता क्यों है, अगर मैं इसे कुछ परीक्षण मामलों पर आज़मा सकता हूं?"
तो, आप कैसे "परीक्षण के मामलों का एक गुच्छा प्रयास" मूर्खतापूर्ण करते हैं? मैं यह दिखाने के लिए कुछ अच्छे उदाहरणों की तलाश कर रहा हूं कि यह अनुमानवादी पर्याप्त नहीं है। दूसरे शब्दों में, मैं एक एल्गोरिथ्म के एक या अधिक उदाहरणों की तलाश कर रहा हूं जो सतही रूप से ऐसा लगता है कि यह सही हो सकता है, और यह सभी छोटे इनपुटों पर सही उत्तर का आउटपुट देता है, जो किसी के साथ आने की संभावना है, लेकिन एल्गोरिथ्म वास्तव में कहां है काम नहीं करता है। हो सकता है कि एल्गोरिथ्म केवल सभी छोटे इनपुट पर सही ढंग से काम करने के लिए होता है और केवल बड़े इनपुट के लिए विफल रहता है, या केवल एक असामान्य पैटर्न के साथ इनपुट के लिए विफल रहता है।
विशेष रूप से, मैं देख रहा हूँ:
एक एल्गोरिथ्म। दोष एल्गोरिथम स्तर पर होना चाहिए। मैं कार्यान्वयन बग की तलाश नहीं कर रहा हूं। (उदाहरण के लिए, एक नंगे न्यूनतम पर, उदाहरण भाषा-अज्ञेय होना चाहिए, और दोष सॉफ्टवेयर इंजीनियरिंग या कार्यान्वयन मुद्दों के बजाय एल्गोरिथम चिंताओं से संबंधित होना चाहिए।)
एक एल्गोरिथ्म जो किसी व्यक्ति के साथ आ सकता है। स्यूडोकोड को कम से कम प्रशंसनीय रूप से सही दिखना चाहिए (उदाहरण के लिए, कोड जो कि अस्पष्ट है या स्पष्ट रूप से संदिग्ध एक अच्छा उदाहरण नहीं है)। बोनस अंक अगर यह एक एल्गोरिथ्म है कि कुछ छात्र वास्तव में होमवर्क या परीक्षा की समस्या को हल करने की कोशिश करते समय आए थे।
एक एल्गोरिथ्म जो उच्च संभावना के साथ एक उचित मैनुअल टेस्ट रणनीति पास करेगा। कोई है जो हाथ से कुछ छोटे परीक्षण मामलों की कोशिश करता है, को दोष की खोज करने की संभावना नहीं होनी चाहिए। उदाहरण के लिए, "क्विकचेक को एक दर्जन छोटे परीक्षण मामलों पर हाथ से अनुकरण करें" यह प्रकट करने की संभावना नहीं होनी चाहिए कि एल्गोरिथ्म गलत है।
अधिमानतः, एक नियतात्मक एल्गोरिथ्म। मैंने देखा है कि कई छात्रों को लगता है कि "हाथ से कुछ परीक्षण के मामलों की कोशिश करें" यह जांचने का एक उचित तरीका है कि क्या एक नियतात्मक एल्गोरिथ्म सही है, लेकिन मुझे संदेह है कि अधिकांश छात्र यह नहीं मानेंगे कि कुछ परीक्षण मामलों की कोशिश संभाव्यता को सत्यापित करने का एक अच्छा तरीका है एल्गोरिदम। संभाव्य एल्गोरिदम के लिए, यह बताने का कोई तरीका नहीं है कि क्या कोई विशेष आउटपुट सही है; और आप आउटपुट वितरण पर कोई उपयोगी सांख्यिकीय परीक्षण करने के लिए पर्याप्त उदाहरण हाथ से क्रैंक नहीं कर सकते। इसलिए, मैं नियतात्मक एल्गोरिदम पर ध्यान केंद्रित करना चाहता हूं, क्योंकि वे छात्र गलत धारणाओं के दिल में अधिक सफाई से आते हैं।
मैं आपके एल्गोरिथ्म को सही साबित करने के महत्व को सिखाना चाहता हूं, और मैं इस तरह के कुछ उदाहरणों का उपयोग करने की उम्मीद कर रहा हूं ताकि शुद्धता के प्रमाणों को प्रेरित करने में मदद मिल सके। मैं ऐसे उदाहरणों को प्राथमिकता दूंगा जो अंडरगार्मेंट्स के लिए अपेक्षाकृत सरल और सुलभ हों; ऐसे उदाहरण जिनके लिए भारी मशीनरी की आवश्यकता होती है या एक टन गणितीय / एल्गोरिथम पृष्ठभूमि कम उपयोगी होती है। इसके अलावा, मुझे ऐसे एल्गोरिदम नहीं चाहिए जो "अप्राकृतिक" हों; हालांकि, कुछ अजीब कृत्रिम एल्गोरिथ्म का निर्माण करना आसान हो सकता है ताकि हेयूरिस्टिक को बेवकूफ बनाया जा सके, अगर यह अत्यधिक अप्राकृतिक लगता है या इस स्पष्टवादी को बेवकूफ बनाने के लिए एक स्पष्ट बैकडोर का निर्माण किया गया है, तो यह संभवतः छात्रों को आश्वस्त नहीं करेगा। कोई अच्छा उदाहरण?