एल्गोरिथ्म मापदंडों को आसानी से संशोधित करने के लिए मैं कौन सी प्रोग्रामिंग रणनीतियां ले सकता हूं?


17

वैज्ञानिक एल्गोरिदम विकसित करना एक अत्यधिक पुनरावृत्तीय प्रक्रिया है जिसमें अक्सर बहुत सारे मापदंडों को बदलना शामिल होता है जिसे मैं अपने प्रयोगात्मक डिजाइन के हिस्से के रूप में या एल्गोरिथ्म प्रदर्शन के हिस्से के रूप में अलग-अलग करना चाहूंगा। मैं इन मापदंडों को संरचित करने के लिए क्या रणनीति अपना सकता हूं ताकि मैं आसानी से पुनरावृत्तियों के बीच उन्हें बदल सकूं और ताकि मैं आसानी से नए लोगों को जोड़ सकूं?

जवाबों:


14

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

PETSc का कॉन्फ़िगरेशन सिस्टम उपयोगकर्ता द्वारा निर्दिष्ट कॉन्फ़िगरेशन के संयोजन के माध्यम से काम करता है, जो सॉल्वर ऑब्जेक्ट्स (गेट सेट और क्वेरीज़ के साथ) और विकल्प डेटाबेस द्वारा प्रबंधित होता है। सिमुलेशन का कोई भी घटक कॉन्फ़िगरेशन विकल्प, एक डिफ़ॉल्ट मान और परिणाम डालने के लिए एक स्थान घोषित कर सकता है। नेस्टेड ऑब्जेक्ट्स में उपसर्ग होते हैं जिन्हें रचना की जा सकती है, जैसे कि हर वस्तु जिसे कॉन्फ़िगरेशन की आवश्यकता होती है उसे स्वतंत्र रूप से संबोधित किया जा सकता है। विकल्प स्वयं कमांड लाइन, पर्यावरण, कॉन्फ़िगरेशन फ़ाइलों या कोड से पढ़े जा सकते हैं। जब कोई विकल्प घोषित किया जाता है, तो एक हेल्प स्ट्रिंग और मैन पेज निर्दिष्ट किया जाता है, ताकि -helpविकल्प समझ में आ जाए और ठीक से जुड़ा हुआ GUI लिखा जा सके।

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

के माध्यम से बुलाया एक विशिष्ट विन्यास

PetscObjectOptionsBegin(object); /* object has prefix and descriptive string */
PetscOptionsReal("-ts_atol",                                      /* options database key */
                 "Absolute tolerance for local truncation error", /* long description */
                 "TSSetTolerances",                               /* function and man page on topic */
                  ts->atol,                                       /* current/default value *?
                  &ts->atol,                                      /* place to store value */
                  &option_set);                                   /* TRUE if the option was set */
PetscOptionsList("-ts_type","Time stepping method","TSSetType",TSList,
                 defaultType,typeName,sizeof typeName,&option_set);
TSAdaptSetFromOptions(ts->adapt);                                 /* configures adaptive controller method */
/* ... many others */
/* ... the following is only called from implicit implementations */
SNESSetFromOptions(ts->snes);                                     /* configure nonlinear solver. */
PetscOptionsEnd();

टिप्पणियाँ:

  • PetscOptionsList()एक गतिशील सूची में से एक विकल्प के साथ उपयोगकर्ता प्रस्तुत करता है। एक प्लगइन वास्तुकला है जो नए कार्यान्वयन कॉल करने वालों के लिए प्रथम श्रेणी के रूप में खुद को उजागर करने के लिए उपयोग कर सकते हैं। (इन कार्यान्वयनों को साझा पुस्तकालयों में रखा जा सकता है और कार्यक्रमों को फिर से शुरू किए बिना प्रथम श्रेणी के रूप में उपयोग किया जाता है।)
  • SNESSetFromOptions() पुनरावर्ती रेखीय सॉल्वर्स, प्रीडोन्डिशनर्स, और किसी भी अन्य घटकों को कॉन्फ़िगर करता है जो कॉन्फ़िगरेशन की आवश्यकता होती है।

11

स्क्रैच से अपने स्वयं के सिमुलेशन कोड विकसित करते समय मुझे कई बार इस समस्या का सामना करना पड़ा है: कौन से मापदंडों को इनपुट फ़ाइल में जाना चाहिए, जिसे कमांड लाइन से लिया जाना चाहिए, आदि। कुछ प्रयोग करने के बाद, निम्नलिखित कुशल निकला। (यह पेट्सक की तरह उन्नत नहीं है।)

एक प्रयोगात्मक सिमुलेशन 'प्रोग्राम' लिखने के बजाय, मैं एक पायथन पैकेज लिखने के लिए इच्छुक हूं जिसमें सिमुलेशन चलाने के लिए आवश्यक सभी फ़ंक्शन और कक्षाएं शामिल हैं। पारंपरिक इनपुट फ़ाइल को कोड के 5 से 10 लाइनों के साथ छोटे पायथन लिपि से बदल दिया जाता है। कुछ लाइनें आम तौर पर डेटा फ़ाइलों को लोड करने और आउटपुट निर्दिष्ट करने से संबंधित होती हैं। अन्य वास्तविक गणना के लिए निर्देश हैं। पायथन पैकेज में वैकल्पिक तर्कों के लिए अच्छे डिफ़ॉल्ट मूल्य शुरुआती लोगों के लिए लाइब्रेरी का उपयोग सरल सिमुलेशन के लिए करना संभव बनाते हैं, जबकि उन्नत उपयोगकर्ता के पास अभी भी सभी घंटियाँ और सीटी तक पहुंच है।

कुछ उदाहरण:


यह बहुत अच्छा है, लेकिन मुझे लगता है कि यह कॉन्फ़िगरेशन समस्या के लिए ऑर्थोगोनल है। यदि आपको एक पदानुक्रमित या नेस्टेड एल्गोरिथ्म निर्दिष्ट करने की आवश्यकता है, तो आपके पास कई आंतरिक वस्तुओं के लिए निर्दिष्ट करने के लिए विकल्प हैं। कोड को कॉल करने वाले को वास्तव में अपने अस्तित्व के बारे में भी नहीं पता होना चाहिए क्योंकि स्तरों की संख्या और घोंसले के शिकार के प्रकार बदल सकते हैं। यह उन सभी विकल्पों की समस्या है "बुदबुदाती"। अपने उच्च-स्तरीय पायथन कोड के साथ, आप उन विकल्पों को निर्दिष्ट करने के लिए इसे "आसान" बना सकते हैं, लेकिन फिर भी आपको उन्हें कोड में निर्दिष्ट करना होगा। मुझे लगता है कि आमतौर पर यह अच्छी बात नहीं है।
जेड ब्राउन

Xmonad X के लिए अपने विंडो मैनेजर को कॉन्फ़िगर करने के लिए इस विधि का उपयोग करता है।
rcollyer

2

पहले बिंदु के रूप में, मैं एल्गोरिथ्म और सॉफ्टवेयर को यथासंभव सामान्य करूंगा। मैंने इसे कठिन तरीके से सीखा है।

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

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.