यदि वेब समस्या से निपटने के लिए आप एक नियम इंजन बना सकते हैं जहां प्रत्येक विशिष्ट नियम स्वतंत्र रूप से कोडित है। इसके लिए एक और शोधन नियम बनाने के लिए एक डोमेन विशिष्ट भाषा (डीएसएल) बनाने के लिए होगा, हालांकि एक डीएसएल केवल एक कोड आधार (मुख्य) से दूसरे (डीएसएल) तक समस्या को विस्थापित करता है। संरचना के बिना डीएसएल मूल भाषा (जावा, सी # आदि) से बेहतर नहीं होगा, इसलिए हम एक बेहतर संरचनात्मक दृष्टिकोण प्राप्त करने के बाद वापस आ जाएंगे।
मूल मुद्दा यह है कि आपको एक मॉडलाइजेशन समस्या हो रही है। जब भी आप इस तरह के जुझारू स्थितियों का सामना करते हैं, तो यह एक स्पष्ट संकेत है कि आपका मॉडल अमूर्त स्थिति का वर्णन करता है जो बहुत कठिन है। आप उन तत्वों के संयोजन की संभावना रखते हैं जो किसी एकल इकाई में विभिन्न मॉडलों से संबंधित होने चाहिए।
यदि आप अपने मॉडल को तोड़ते रहते हैं तो आप अंततः इस संयोजन प्रभाव को पूरी तरह से भंग कर देंगे। हालाँकि इस रास्ते को लेते समय अपने डिजाइन में खो जाना आसान होता है और इससे भी बड़ी गड़बड़ पैदा होती है, यहाँ पूर्णतावाद जरूरी नहीं कि आपका दोस्त ही हो।
परिमित राज्य मशीनें और नियम इंजन इस बात का एक उदाहरण हैं कि कैसे इस समस्या को तोड़ा जा सकता है और अधिक प्रबंधनीय बनाया जा सकता है। यहाँ मुख्य विचार यह है कि इस तरह के एक कॉम्बिनेटरियल समस्या से छुटकारा पाने का एक अच्छा तरीका यह है कि अक्सर एक डिज़ाइन बनाया जाए और जब तक आपका सिस्टम संतोषजनक ढंग से प्रदर्शन नहीं करता तब तक इसे अमूर्त के नेस्टेड स्तरों में एड-न्यूमेस दोहराएं । अक्रिन कैसे फ्रैक्चर को जटिल पैटर्न बनाने के लिए उपयोग किया जाता है। यदि आप अपने सिस्टम को माइक्रोस्कोप से या उच्च पक्षी की नज़र से देखते हैं तो नियम समान नहीं रहते हैं।
इसे अपने डोमेन पर लागू करने का उदाहरण।
आप मॉडल बनाने की कोशिश कर रहे हैं कि गाय एक इलाके के माध्यम से कैसे आगे बढ़ रही हैं। हालाँकि, आपके प्रश्न में विवरण का अभाव है, मुझे लगता है कि आपकी बड़ी मात्रा में निर्णय के टुकड़े शामिल हैं, if cow.isStanding then cow.canRun = true
लेकिन जैसे ही आप उदाहरण के लिए इलाके का विवरण जोड़ते हैं। तो हर क्रिया के लिए आपको अपने हर पहलुओं की जाँच करनी होगी जो आप सोच सकते हैं और अगली क्रिया के लिए इन सत्यापनों को दोहरा सकते हैं।
पहले हमें अपने दोहराए जाने वाले डिजाइन की आवश्यकता है, जो इस मामले में सिमुलेशन के बदलते राज्यों को मॉडल करने के लिए एक एफएसएम होगा। तो पहली बात जो मैं करता हूं वह एक संदर्भ FSM को लागू करना है, एक राज्य इंटरफ़ेस, एक संक्रमण इंटरफ़ेस और शायद एक संक्रमण संदर्भ को परिभाषित करनाजिसमें अन्य दो को उपलब्ध कराई जाने वाली साझा जानकारी हो सकती है। एक बुनियादी FSM कार्यान्वयन संदर्भ की परवाह किए बिना एक संक्रमण से दूसरे में बदल जाएगा, यह वह जगह है जहां एक नियम इंजन आता है। नियम इंजन साफ-साफ उन शर्तों को घेरता है जो संक्रमण होने पर मिलने चाहिए। यहां एक नियम इंजन नियमों की एक सूची के रूप में सरल हो सकता है, जिनमें से प्रत्येक एक बूलियन का मूल्यांकन करने वाला फ़ंक्शन होता है। यह जांचने के लिए कि क्या संक्रमण होना चाहिए, नियमों की सूची को पुनरावृत्त करें और यदि उनमें से कोई गलत का मूल्यांकन करता है, तो संक्रमण नहीं होता है। संक्रमण में FSM (और अन्य संभावित कार्यों) की वर्तमान स्थिति को संशोधित करने के लिए व्यवहार कोड होगा ।
अब, अगर मैं GOD स्तर पर एक बड़े FSM के रूप में सिमुलेशन को लागू करना शुरू कर देता हूं, तो मैं बहुत से संभावित राज्यों, बदलावों आदि के साथ समाप्त होता हूं। अगर-और गड़बड़ दिखती है तो यह तय है लेकिन यह वास्तव में बस चारों ओर फैला है: प्रत्येक IF है अब एक नियम जो संदर्भ की एक विशिष्ट जानकारी के खिलाफ एक परीक्षण करता है (जो इस बिंदु पर बहुत कुछ होता है) और प्रत्येक IF शरीर कहीं संक्रमण कोड में है।
भग्न टूटने में प्रवेश करें: पहला कदम प्रत्येक गाय के लिए एक FSM बनाना होगा जहां राज्य गाय के अपने आंतरिक राज्य हैं (खड़े, दौड़ना, चलना, चराई आदि) और उनके बीच के संक्रमण पर्यावरण से प्रभावित होंगे। यह संभव है कि ग्राफ पूरा नहीं हुआ है, उदाहरण के लिए चराई केवल खड़ी अवस्था से सुलभ है, किसी भी अन्य संक्रमण को असमान किया जाता है क्योंकि बस मॉडल से अनुपस्थित है। यहां आप डेटा को दो अलग-अलग मॉडल, गाय और इलाके में प्रभावी ढंग से अलग करते हैं। प्रत्येक के पास इसके अपने गुण सेट हैं। यह ब्रेकडाउन आपको अपने समग्र इंजन डिजाइन को सरल बनाने की अनुमति देगा। अब एक एकल नियम इंजन होने के बजाय जो आप सभी को तय करता है कि आपके पास कई, सरल नियम इंजन (प्रत्येक बदलाव के लिए एक) है जो कुछ विशिष्ट विवरणों पर निर्णय लेते हैं।
क्योंकि मैं FSM के लिए समान कोड का पुनः उपयोग कर रहा हूं, यह मूल रूप से FSM का एक विन्यास है। याद है जब हमने DSL के पहले का उल्लेख किया था? यह वह जगह है जहाँ DSL बहुत अच्छा कर सकता है यदि आपके पास लिखने के लिए बहुत सारे नियम और बदलाव हैं।
गहराई तक जा रहे हैं
अब GOD को गाय की आंतरिक अवस्थाओं के प्रबंधन पर सभी जटिलताओं से नहीं जूझना पड़ता है, लेकिन हम इसे और आगे बढ़ा सकते हैं। उदाहरण के लिए इलाके के प्रबंधन में अभी भी बहुत सारी जटिलताएँ शामिल हैं। यह वह जगह है जहां आप तय करते हैं कि ब्रेकडाउन पर्याप्त कहां है। यदि आपके GOD में उदाहरण के लिए आप इलाके की गतिशीलता (लंबी घास, मिट्टी, सूखी मिट्टी, छोटी घास आदि) का प्रबंधन करते हैं, तो हम उसी पैटर्न को दोहरा सकते हैं। राज्यों और शायद सरल नियमों के बीच संक्रमण के साथ एक नए इलाके FSM में सभी इलाके राज्यों (लंबी घास, छोटी घास, मैला, सूखा, आदि) को निकालने से इलाके में इस तरह के तर्क को स्वयं को रोकने से कुछ भी नहीं है। उदाहरण के लिए मैला अवस्था में जाने के लिए नियम इंजन को तरल पदार्थ खोजने के लिए संदर्भ की जांच करनी चाहिए, अन्यथा यह संभव नहीं है। अब GOD और भी सरल हो गया।
आप उन्हें स्वायत्त बनाकर एफएसएम की प्रणाली को पूरा कर सकते हैं और उन्हें प्रत्येक धागा दे सकते हैं। यह अंतिम चरण आवश्यक नहीं है, लेकिन यह आपको सिस्टम के इंटरैक्शन को गतिशील रूप से समायोजित करने की अनुमति देता है कि आप अपने निर्णय लेने (विशेष FSM लॉन्च करने या पूर्व-निर्धारित स्थिति वापस करने) को कैसे व्यवस्थित करते हैं।
याद रखें कि हमने कैसे उल्लेख किया है कि संक्रमण "अन्य संभावित कार्य" भी कर सकता है? आइए जानें कि विभिन्न मॉडलों (एफएसएम) के लिए एक-दूसरे के साथ संवाद करने की संभावना को जोड़कर। आप घटनाओं के एक सेट को परिभाषित कर सकते हैं और प्रत्येक FSM को इन घटनाओं के लिए श्रोता को पंजीकृत करने की अनुमति दे सकते हैं। इस प्रकार, यदि, उदाहरण के लिए, एक गाय एक इलाके में प्रवेश करती है तो हेक्स संक्रमण परिवर्तन के लिए श्रोताओं को पंजीकृत कर सकता है। यहाँ यह थोड़ा मुश्किल हो जाता है क्योंकि प्रत्येक FSM को विशिष्ट डोमेन के किसी भी ज्ञान के बिना उच्च स्तर पर लागू किया जाता है। हालाँकि, आप गाय को घटनाओं की एक सूची प्रकाशित करके इसे प्राप्त कर सकते हैं और अगर वह उन घटनाओं को देख सकता है, जिन पर वह प्रतिक्रिया कर सकता है, तो सेल रजिस्टर कर सकती है। यहां इवेंट परिवार का एक अच्छा पदानुक्रम एक अच्छा निवेश है।
आप पोषक तत्वों के स्तर और घास के विकास चक्र को मॉडलिंग करके अभी भी गहरा धक्का दे सकते हैं, आपने अनुमान लगाया है ... इलाके के पैच मॉडल में एक घास FSM एम्बेडेड है।
यदि आप इस विचार को बहुत दूर तक धकेल देते हैं कि GOD के पास बहुत कम काम है क्योंकि सभी पहलू बहुत अधिक स्व प्रबंधित हैं, अधिक ईश्वरीय चीजों पर खर्च करने के लिए समय को मुक्त करते हैं।
संक्षिप्त
जैसा कि यहां एफएसएम के ऊपर कहा गया है, यह समाधान नहीं है, केवल यह वर्णन करने का एक साधन है कि इस तरह की समस्या का समाधान प्रति कोड में नहीं मिलता है लेकिन आप अपनी समस्या को कैसे मॉडल करते हैं। मेरे एफएसएम प्रस्ताव की तुलना में सबसे अधिक संभावना है कि अन्य समाधान संभव हैं और सबसे अधिक संभव हैं। हालाँकि "फ्रैक्टल्स" दृष्टिकोण इस कठिनाई को प्रबंधित करने का एक अच्छा तरीका है। यदि सही तरीके से किया जाए तो आप सरलता से गहरे स्तर आवंटित कर सकते हैं जहां यह सरल मॉडल देते समय मायने रखता है जहां यह कम मायने रखता है। जब संसाधन अधिक उपलब्ध हो जाते हैं तो आप परिवर्तनों को कतारबद्ध कर सकते हैं और उन्हें लागू कर सकते हैं। एक एक्शन सीक्वेंस में यह सब महत्वपूर्ण नहीं हो सकता है कि गाय से घास के पैच तक पोषक तत्व हस्तांतरण की गणना करें। आप हालांकि इन बदलावों को रिकॉर्ड कर सकते हैं और बाद के समय में बदलावों को लागू कर सकते हैं या केवल एक शिक्षित अनुमान के साथ लगभग केवल नियम इंजनों को बदलकर या शायद उन तत्वों के लिए एक सरल भोले संस्करण के साथ पूरी तरह से FSM कार्यान्वयन की जगह ले सकते हैं जो प्रत्यक्ष क्षेत्र में नहीं हैं ब्याज (क्षेत्र के दूसरे छोर पर गाय) ध्यान केंद्रित करने और संसाधनों का एक बड़ा हिस्सा पाने के लिए और अधिक विस्तृत बातचीत की अनुमति देने के लिए। यह सब एक पूरे के रूप में कभी भी सिस्टम को पुनर्जीवित किए बिना; चूंकि प्रत्येक भाग को अच्छी तरह से अलग किया जाता है, इसलिए अपने मॉडल की गहराई को सीमित करने या फैलाने के लिए ड्रॉप-इन प्रतिस्थापन बनाना आसान हो जाता है। एक मानक डिजाइन का उपयोग करके आप उस पर निर्माण कर सकते हैं और नियमों को परिभाषित करने के लिए डीएसएल जैसे उपकरणों में अधिकतम निवेश कर सकते हैं या घटनाओं के लिए एक मानक शब्दावली, फिर से बहुत उच्च स्तर पर शुरू कर सकते हैं और आवश्यकतानुसार परिशोधन जोड़ सकते हैं। चूंकि प्रत्येक भाग को अच्छी तरह से अलग किया जाता है, इसलिए अपने मॉडल की गहराई को सीमित करने या फैलाने के लिए ड्रॉप-इन प्रतिस्थापन बनाना आसान हो जाता है। एक मानक डिजाइन का उपयोग करके आप उस पर निर्माण कर सकते हैं और नियमों को परिभाषित करने के लिए डीएसएल जैसे उपकरणों में अधिकतम निवेश कर सकते हैं या घटनाओं के लिए एक मानक शब्दावली, फिर से बहुत उच्च स्तर पर शुरू कर सकते हैं और आवश्यकतानुसार परिशोधन जोड़ सकते हैं। चूंकि प्रत्येक भाग को अच्छी तरह से अलग किया जाता है, इसलिए आपके मॉडल की गहराई को सीमित करने या फैलाने के लिए ड्रॉप-इन प्रतिस्थापन बनाना आसान हो जाता है। एक मानक डिजाइन का उपयोग करके आप उस पर निर्माण कर सकते हैं और नियमों को परिभाषित करने के लिए डीएसएल जैसे उपकरणों में अधिकतम निवेश कर सकते हैं या घटनाओं के लिए एक मानक शब्दावली, फिर से बहुत उच्च स्तर पर शुरू कर सकते हैं और आवश्यकतानुसार परिशोधन जोड़ सकते हैं।
मैं एक कोड उदाहरण प्रदान करूंगा, लेकिन यह सब मैं अभी कर सकता हूं।