paint-brush
ज़ोंबी स्टेट में क्लासिक मशीन लर्निंग और रीकरंट न्यूरल नेटवर्क का उपयोग करके मिशन जनरेशनद्वारा@evlko
3,703 रीडिंग
3,703 रीडिंग

ज़ोंबी स्टेट में क्लासिक मशीन लर्निंग और रीकरंट न्यूरल नेटवर्क का उपयोग करके मिशन जनरेशन

द्वारा evlko15m2024/05/01
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

हम रोगलाइक गेम्स के लिए क्लासिक मशीन लर्निंग और रिकरेंट न्यूरल नेटवर्क का उपयोग करके मिशन तैयार करने की बड़ी तस्वीर देखेंगे।
featured image - ज़ोंबी स्टेट में क्लासिक मशीन लर्निंग और रीकरंट न्यूरल नेटवर्क का उपयोग करके मिशन जनरेशन
evlko HackerNoon profile picture
0-item
1-item

शायद आप प्रक्रियात्मक स्तर निर्माण से परिचित हों; खैर, इस पोस्ट में, यह सब प्रक्रियात्मक मिशन निर्माण के बारे में है। हम रॉगलाइक गेम के लिए क्लासिक मशीन लर्निंग और आवर्तक तंत्रिका नेटवर्क का उपयोग करके मिशन बनाने की बड़ी तस्वीर के माध्यम से चलेंगे।


नमस्ते सभी! मेरा नाम लेव कोबेलेव है, और मैं MY.GAMES में गेम डिज़ाइनर हूँ। इस लेख में, मैं क्लासिकल ML और सरल न्यूरल नेटवर्क का उपयोग करने के अपने अनुभव को साझा करना चाहता हूँ क्योंकि मैं समझाता हूँ कि कैसे और क्यों हमने प्रक्रियात्मक मिशन निर्माण पर समझौता किया, और हम ज़ोंबी स्टेट में प्रक्रिया के कार्यान्वयन में भी गहराई से उतरेंगे।


अस्वीकरण: यह लेख केवल सूचनात्मक/मनोरंजन उद्देश्यों के लिए है, और किसी विशेष समाधान का उपयोग करते समय, हम आपको सलाह देते हैं कि आप किसी विशेष संसाधन के उपयोग की शर्तों की सावधानीपूर्वक जांच करें और कानूनी कर्मचारियों से परामर्श करें!

मिशन “बॉक्स” की मूल बातें: तरंगें, स्पॉन और बहुत कुछ

☝🏻 सबसे पहले, कुछ शब्दावली: " एरेनास ", " स्तर ", और " स्थान " इस संदर्भ में समानार्थी हैं, साथ ही " क्षेत्र ", " ज़ोन " और " स्पॉन क्षेत्र " भी।


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


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


स्पॉन का पहला प्रकार खिलाड़ी के पास है। खिलाड़ी के पास उपस्थिति एक सेक्टर के माध्यम से निर्दिष्ट की जाती है, जिसे दो रेडी द्वारा वर्णित किया जाता है: बाहरी और आंतरिक (आर और आर), सेक्टर की चौड़ाई (β), खिलाड़ी के सापेक्ष रोटेशन का कोण (α), और दुश्मन की उपस्थिति की वांछित दृश्यता (या अदृश्यता)। एक सेक्टर के अंदर दुश्मनों के लिए आवश्यक संख्या में अंक होते हैं - और यहीं से वे आते हैं!

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

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

इसलिए, मिशन पर काम करने से पहले ही हमने कुछ नियम निर्धारित कर लिए हैं:


  1. कार्रवाई की निरंतर भावना बनाए रखने के लिए, खिलाड़ी के निकट दृश्य बिंदुओं पर नियमित रूप से ज़ोम्बीज़ को उत्पन्न करना सुनिश्चित करें।
  2. बाहर निकलने के रास्ते को उजागर करने या खिलाड़ी को एक निश्चित दिशा से धकेलने के लिए, मुख्य रूप से दीवारों के पास लंबी दूरी के युद्ध दुश्मनों को पैदा करने का प्रयास करें
  3. कभी-कभी, खिलाड़ी के सामने विशेष शत्रुओं को उत्पन्न करें, लेकिन अदृश्य बिंदुओं पर।
  4. कभी भी खिलाड़ी से X मीटर से अधिक निकट शत्रुओं को उत्पन्न न करें
  5. एक ही समय में X से अधिक शत्रुओं को उत्पन्न न करें


एक समय पर, हमारे पास लगभग सौ मिशन तैयार थे, लेकिन कुछ समय बाद, हमें और भी ज़्यादा मिशन की ज़रूरत पड़ी। दूसरे डिज़ाइनर और मैं एक और सौ मिशन बनाने में बहुत ज़्यादा समय और मेहनत नहीं लगाना चाहते थे, इसलिए हमने मिशन बनाने के लिए एक तेज़ और सस्ती विधि की तलाश शुरू कर दी।

मिशन जनरेशन

मिशन विघटन

सभी जनरेटर कुछ नियमों के अनुसार काम करते हैं, और हमारे मैन्युअल रूप से बनाए गए मिशन भी कुछ सिफारिशों के अनुसार किए गए थे। इसलिए, हम मिशनों के भीतर पैटर्न के बारे में एक परिकल्पना के साथ आए, और वे पैटर्न जनरेटर के लिए नियमों के रूप में कार्य करेंगे।


✍🏻 कुछ शब्द जो आपको पाठ में मिलेंगे:

  • क्लस्टरिंग किसी दिए गए संग्रह को गैर-अतिव्यापी उपसमूहों (क्लस्टर) में विभाजित करने का कार्य है, ताकि समान वस्तुएं एक ही क्लस्टर से संबंधित हों, और विभिन्न क्लस्टरों की वस्तुएं काफी भिन्न हों।

  • श्रेणीबद्ध विशेषताएँ वे डेटा हैं जो एक परिमित सेट से मान लेते हैं और उनका कोई संख्यात्मक प्रतिनिधित्व नहीं होता है। उदाहरण के लिए, स्पॉन वॉल टैग: उत्तर, दक्षिण, आदि।

  • श्रेणीबद्ध विशेषताओं का कोडिंग कुछ पूर्व-निर्दिष्ट नियमों के अनुसार श्रेणीबद्ध विशेषताओं को संख्यात्मक प्रतिनिधित्व में परिवर्तित करने की एक प्रक्रिया है। उदाहरण के लिए, उत्तर → 0, दक्षिण → 1, आदि।

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


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


क्लस्टरिंग कुछ N-आयामी अंतरिक्ष में काम करता है, और ML विशेष रूप से संख्याओं के साथ काम करता है। इसलिए सभी स्पॉन वेक्टर बन जाएंगे:

  • श्रेणीबद्ध चर को कोडित किया गया
  • सभी डेटा सामान्यीकृत किया गया


इसलिए, उदाहरण के लिए, स्पॉन जिसे "2 मीटर के इंडेंटेशन, 10 की चौड़ाई और 5 की लंबाई वाले क्षेत्र में उत्तरी दीवार पर 10 ज़ोंबी शूटरों को स्पॉन करें" के रूप में वर्णित किया गया था, वेक्टर [0.5, 0.25, 0.2, 0.8, ..., 0.5] बन गया (←ये संख्याएं अमूर्त हैं)।


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

क्लस्टरिंग एल्गोरिथम


कई क्लस्टरिंग एल्गोरिदम हैं: K-Means, DBSCAN, स्पेक्ट्रल, हाइरार्किकल, इत्यादि। ये सभी अलग-अलग विचारों पर आधारित हैं लेकिन इनका लक्ष्य एक ही है: डेटा में क्लस्टर ढूँढना। नीचे, आप चुने गए एल्गोरिदम के आधार पर एक ही डेटा के लिए क्लस्टर ढूँढने के अलग-अलग तरीके देख सकते हैं।

के-मीन्स एल्गोरिथ्म ने स्पॉन के मामले में सबसे अच्छा प्रदर्शन किया।


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


इस विधि के बारे में निम्नलिखित बातें समझना महत्वपूर्ण है:

  • यह क्लस्टरों का समान आकार सुनिश्चित नहीं करता है - हमारे लिए, यह कोई समस्या नहीं थी क्योंकि एक मिशन के भीतर क्लस्टरों का वितरण असमान हो सकता है।
  • यह डेटा के अंदर क्लस्टर की संख्या निर्धारित नहीं करता है, लेकिन इसके लिए इनपुट के रूप में एक निश्चित K संख्या की आवश्यकता होती है, यानी क्लस्टर की वांछित संख्या। कभी-कभी, यह संख्या पहले से निर्धारित होती है, और कभी-कभी, यह नहीं होती है। इसके अलावा, क्लस्टर की "सर्वोत्तम" संख्या खोजने के लिए कोई आम तौर पर स्वीकृत विधि नहीं है।


आइये दूसरे बिन्दु पर थोड़ा और विस्तार से नजर डालें।

क्लस्टरों की संख्या

कोहनी विधि का उपयोग अक्सर क्लस्टर की इष्टतम संख्या का चयन करने के लिए किया जाता है। विचार बहुत सरल है: हम एल्गोरिथ्म चलाते हैं और 1 से N तक सभी K को आज़माते हैं, जहाँ N कुछ उचित संख्या है। हमारे मामले में, यह 10 था - अधिक क्लस्टर ढूँढना असंभव था। अब, आइए प्रत्येक क्लस्टर के भीतर वर्ग दूरी का योग ज्ञात करें (एक स्कोर जिसे WSS या SS के रूप में जाना जाता है)। हम यह सब एक ग्राफ पर प्रदर्शित करेंगे और एक बिंदु का चयन करेंगे जिसके बाद y-अक्ष पर मान महत्वपूर्ण रूप से बदलना बंद कर देता है।


उदाहरण के लिए, हम एक सुप्रसिद्ध डेटासेट का उपयोग करेंगे। आइरिस फूल डेटा सेट आइए 1 से 10 तक K के साथ एल्गोरिथ्म चलाएं और देखें कि K के आधार पर उपरोक्त अनुमान कैसे बदलता है। लगभग K=3 पर, अनुमान में बहुत अधिक परिवर्तन होना बंद हो जाता है - और मूल डेटासेट में वास्तव में इतनी ही कक्षाएं थीं।

यदि आप कोहनी नहीं देख पा रहे हैं, तो आप सिल्हूट विधि का उपयोग कर सकते हैं, लेकिन यह लेख के दायरे से बाहर है।


ऊपर और नीचे दी गई सभी गणनाएँ पाइथन में एमएल और डेटा विश्लेषण के लिए मानक पुस्तकालयों का उपयोग करके की गई थीं: पांडा, न्यूमपी, सीबॉर्न और स्केलेर्न। मैं कोड साझा नहीं कर रहा हूँ क्योंकि लेख का मुख्य उद्देश्य तकनीकी विवरणों में जाने के बजाय क्षमताओं को चित्रित करना है।


प्रत्येक क्लस्टर का विश्लेषण


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


  • संभावना की गणना करने के लिए दुश्मन का वजन। उदाहरण के लिए, एक सामान्य ज़ोंबी = 5, और एक हेलमेट वाला ज़ोंबी = 1। इसलिए, एक सामान्य ज़ोंबी की संभावना 5/6 है, और एक हेलमेट वाला ज़ोंबी 1/6 है। वजन संचालित करने के लिए अधिक सुविधाजनक हैं।
  • मान सीमाएँ, उदाहरण के लिए, ज़ोन या इसकी चौड़ाई के घूर्णन का न्यूनतम और अधिकतम कोण। प्रत्येक पैरामीटर को उसके अपने खंड द्वारा वर्णित किया जाता है, जिसका कोई भी मान समान रूप से संभावित होता है।
  • श्रेणीबद्ध मान, उदाहरण के लिए, दीवार टैग या बिंदु दृश्यता, को शत्रु सेटिंग्स के रूप में वर्णित किया जाता है, और यह भार के माध्यम से होता है।


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


क्लस्टर 1 तालिका

दुश्मन

प्रकार

आर

आर-डेल्टा

ROTATION

चौड़ाई

दृश्यता

ज़ॉम्बी_कॉमन_3_5=4, ज़ॉम्बी_भारी=1

खिलाड़ी

10-12

1-2

0-30

30-45

दृश्यमान=9, अदृश्य=1


यहां दो उपयोगी तरकीबें दी गई हैं:


  • यह दुश्मनों की कोई निश्चित संख्या नहीं है जिसे निर्दिष्ट किया जाता है, बल्कि एक खंड होता है जिसमें से उसकी संख्या का चयन किया जाएगा। यह अलग-अलग समूहों में लेकिन अलग-अलग मात्रा में एक ही दुश्मन के साथ काम करने में मदद करता है।
  • यह बाहरी त्रिज्या (R) नहीं है जिसे निर्दिष्ट किया गया है, बल्कि आंतरिक त्रिज्या (r) के सापेक्ष डेल्टा (R-डेल्टा) है, ताकि नियम R > r का सम्मान किया जा सके। इस प्रकार, R-डेल्टा को यादृच्छिक r में जोड़ा जाता है, r+R-डेल्टा > r किसी भी R-डेल्टा > 0 के लिए, जिसका अर्थ है कि सब कुछ ठीक है।


यह कार्य प्रत्येक क्लस्टर के साथ किया गया, तथा इनकी संख्या 10 से भी कम थी, इसलिए इसमें अधिक समय नहीं लगा।


क्लस्टरिंग के बारे में कुछ रोचक बातें


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



मिशन का समय


स्पॉन पैटर्न के अतिरिक्त, हमने एक मिशन के भीतर दुश्मनों के कुल स्वास्थ्य की उसके पूरा होने के अपेक्षित समय पर निर्भरता का अध्ययन करने का निर्णय लिया, ताकि जनरेशन के दौरान इस पैरामीटर का उपयोग किया जा सके।


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


💡 रैखिक प्रतिगमन एक विधि है जिसमें एक चर की दूसरे या कई अन्य चर पर निर्भरता को एक रैखिक निर्भरता फ़ंक्शन के साथ फिर से बनाया जाता है। नीचे दिए गए उदाहरण केवल एक चर से रैखिक प्रतिगमन पर विचार करेंगे: f(x) = wx + b.


आइये निम्नलिखित शब्दों से परिचय करें:

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


तो, HP = DPS * कार्रवाई का समय + खाली समय। मैन्युअल चैप्टर बनाते समय, हमने प्रत्येक मिशन का अपेक्षित समय रिकॉर्ड किया; अब, हमें कार्रवाई का समय ढूँढना होगा।


यदि आप अपेक्षित मिशन समय जानते हैं, तो आप कार्रवाई के समय की गणना कर सकते हैं और इसे अपेक्षित समय से घटा कर खाली समय प्राप्त कर सकते हैं: खाली समय = मिशन समय - कार्रवाई का समय = मिशन समय - HP * DPS। इस संख्या को फिर मिशन में दुश्मनों की औसत संख्या से विभाजित किया जा सकता है, और आपको प्रति दुश्मन खाली समय मिलता है। इसलिए, जो कुछ भी बचता है वह केवल अपेक्षित मिशन समय से प्रति दुश्मन खाली समय तक एक रैखिक प्रतिगमन बनाना है।

इसके अतिरिक्त, हम मिशन समय से कार्रवाई समय के हिस्से का प्रतिगमन भी तैयार करेंगे।


आइए गणनाओं का एक उदाहरण देखें और देखें कि इन प्रतिगमनों का उपयोग क्यों किया जाता है:

  1. दो संख्याएं दर्ज करें: मिशन समय और DPS 30 और 70
  2. मिशन समय से कार्रवाई समय के हिस्से का प्रतिगमन देखें और उत्तर प्राप्त करें, 0.8
  3. कार्रवाई समय की गणना 30*0.8=6 सेकंड के रूप में करें
  4. HP की गणना 6*70=420 के रूप में करें
  5. मिशन समय से प्रति शत्रु खाली समय का प्रतिगमन देखें और उत्तर प्राप्त करें, जो 0.25 सेकंड है।


यहाँ एक सवाल है: हमें दुश्मन के लिए खाली समय जानने की आवश्यकता क्यों है? जैसा कि पहले उल्लेख किया गया है, स्पॉन समय के अनुसार व्यवस्थित होते हैं। इसलिए, i-वें स्पॉन के समय की गणना (i-1)वें स्पॉन के एक्शन समय और उसके भीतर खाली समय के योग के रूप में की जा सकती है।


और यहां एक और प्रश्न उठता है: क्रिया समय और खाली समय का हिस्सा स्थिर क्यों नहीं है?


हमारे खेल में, किसी मिशन की कठिनाई उसकी अवधि से संबंधित होती है। यानी, छोटे मिशन आसान होते हैं, और लंबे मिशन ज़्यादा कठिन होते हैं। कठिनाई मापदंडों में से एक प्रति दुश्मन खाली समय है। ऊपर दिए गए ग्राफ़ में कई सीधी रेखाएँ हैं और उनका ढलान गुणांक (w) समान है, लेकिन ऑफ़सेट (b) अलग है। इस प्रकार, कठिनाई को बदलने के लिए, ऑफ़सेट को बदलना ही काफ़ी है: b को बढ़ाने से खेल आसान हो जाता है, घटाने से यह ज़्यादा कठिन हो जाता है, और नकारात्मक संख्याओं की अनुमति होती है। ये विकल्प आपको अध्याय दर अध्याय कठिनाई बदलने में मदद करते हैं।


मेरा मानना है कि सभी डिजाइनरों को रिग्रेशन की समस्या पर गहराई से विचार करना चाहिए, क्योंकि यह अक्सर अन्य परियोजनाओं को विघटित करने में मदद करता है:



नये मिशन तैयार करना


तो, हम जनरेटर के लिए नियमों को खोजने में कामयाब रहे, और अब हम उत्पादन प्रक्रिया पर आगे बढ़ सकते हैं।


यदि आप अमूर्त रूप से सोचते हैं, तो किसी भी मिशन को संख्याओं के अनुक्रम के रूप में दर्शाया जा सकता है, जहाँ प्रत्येक संख्या एक विशिष्ट स्पॉन क्लस्टर को दर्शाती है। उदाहरण के लिए, मिशन: 1, 2, 1, 1, 2, 3, 3, 2, 1, 3। इसका मतलब है कि नए मिशन बनाने का कार्य नए संख्यात्मक अनुक्रम बनाने पर निर्भर करता है। जनरेशन के बाद, आपको क्लस्टर सेटिंग्स के अनुसार प्रत्येक संख्या को व्यक्तिगत रूप से "विस्तारित" करना होगा।


मूल दृष्टिकोण


यदि हम अनुक्रम उत्पन्न करने की एक तुच्छ विधि पर विचार करते हैं, तो हम किसी अन्य स्पॉन के बाद किसी विशेष स्पॉन की सांख्यिकीय संभावना की गणना कर सकते हैं। उदाहरण के लिए, हमें निम्नलिखित आरेख मिलता है:

आरेख का शीर्ष वह क्लस्टर है जिसकी ओर यह जाता है, एक शीर्ष है, तथा किनारा भार क्लस्टर के अगले होने की संभावना है।


ऐसे ग्राफ के माध्यम से चलते हुए, हम एक अनुक्रम उत्पन्न कर सकते हैं। हालाँकि, इस दृष्टिकोण में कई नुकसान हैं। इनमें, उदाहरण के लिए, स्मृति की कमी (यह केवल वर्तमान स्थिति को जानता है) और एक स्थिति में "फंसने" की संभावना है यदि इसके अपने आप में बदल जाने की उच्च सांख्यिकीय संभावना है।


✍🏻 यदि हम इस ग्राफ को एक प्रक्रिया के रूप में मानते हैं, तो हमें एक सरल मार्कोव श्रृंखला मिलती है।


आवर्तक तंत्रिका नेटवर्क


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

ये नेटवर्क कैसे काम करते हैं, इसका विवरण इस लेख के दायरे से बाहर है, क्योंकि यह एक बहुत बड़ा विषय है। इसके बजाय, आइए देखें कि प्रशिक्षण के लिए क्या आवश्यक है:


  • L लंबाई के N अनुक्रमों का एक सेट
  • N अनुक्रमों में से प्रत्येक का उत्तर है एक-गर्म वेक्टर, अर्थात C लंबाई का एक वेक्टर जिसमें C-1 शून्य और एक 1 शामिल है, जो उत्तर को इंगित करता है।
  • C उत्तरों के समूह की घात है।


N=2, L=3, C=5 के साथ एक सरल उदाहरण। आइए अनुक्रम 1, 2, 3, 4, 1 लें और इसके अंदर L+1 लंबाई के उप-अनुक्रमों की तलाश करें: [1, 2, 3, 4], [2, 3, 4, 1]। आइए अनुक्रम को L वर्णों के इनपुट और एक उत्तर (लक्ष्य) - (L+1)वें वर्ण* में विभाजित करें। उदाहरण के लिए, [1, 2, 3, 4] → [1, 2, 3] और [4]। हम उत्तरों को वन-हॉट वेक्टर, [4] → [0, 0, 0, 0, 1] में एनकोड करते हैं।

इसके बाद, आप टेंसरफ्लो या पाइटॉर्च का उपयोग करके पायथन में एक सरल न्यूरल नेटवर्क का स्केच बना सकते हैं। आप नीचे दिए गए लिंक का उपयोग करके देख सकते हैं कि यह कैसे किया जाता है। बस इतना ही बाकी है कि ऊपर वर्णित डेटा पर प्रशिक्षण प्रक्रिया शुरू करें, प्रतीक्षा करें, और... फिर आप उत्पादन में जा सकते हैं!


मशीन लर्निंग मॉडल में कुछ मेट्रिक्स होते हैं, जैसे सटीकता। सटीकता सही तरीके से दिए गए उत्तरों का अनुपात दिखाती है। हालाँकि, इसे सावधानी से देखा जाना चाहिए क्योंकि डेटा में वर्ग असंतुलन हो सकता है। यदि कोई नहीं है (या लगभग कोई नहीं है), तो हम कह सकते हैं कि मॉडल अच्छी तरह से काम करता है यदि यह यादृच्छिक रूप से उत्तरों की तुलना में बेहतर भविष्यवाणी करता है, यानी सटीकता > 1/C; यदि 1 के करीब है, तो यह बहुत अच्छा काम करता है।


हमारे मामले में, मॉडल ने अच्छी सटीकता दिखाई। इन परिणामों का एक कारण क्लस्टरों की छोटी संख्या है जो दुश्मनों को उनके प्रकार और उनके संतुलन के अनुसार मैप करने के कारण प्राप्त हुई थी।


रुचि रखने वालों के लिए RNN पर अधिक सामग्री यहां उपलब्ध है:


पीढ़ी प्रक्रिया

जनरेटर सेटअप


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


मॉडल के साथ इंटरैक्ट करने के लिए, यूनिटी में एक कस्टम विंडो बनाई जाती है जहां गेम डिजाइनर सभी आवश्यक मिशन पैरामीटर सेट कर सकते हैं:

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


सेटिंग्स में जाने के बाद, बस एक बटन दबाना है और एक फ़ाइल प्राप्त करनी है जिसे यदि आवश्यक हो तो संपादित किया जा सकता है। हाँ, मैं पहले से ही मिशन बनाना चाहता था, न कि खेल के दौरान, ताकि उन्हें बदला जा सके।

पीढ़ी के चरण

आइये पीढ़ी प्रक्रिया पर नजर डालें:


  1. मॉडल इनपुट के रूप में एक अनुक्रम प्राप्त करता है और एक उत्तर तैयार करता है - संभावनाओं का एक वेक्टर कि i-th क्लस्टर अगला होगा। एल्गोरिथ्म पासा घुमाता है, यदि संख्या त्रुटि संभावना से अधिक है, तो हम सबसे संभावित एक लेते हैं, अन्यथा यादृच्छिक। यह तरकीब थोड़ी रचनात्मकता और विविधता जोड़ती है।
  2. यह प्रक्रिया एक निश्चित संख्या में पुनरावृत्तियों तक जारी रहती है। यह मैन्युअल रूप से बनाए गए किसी भी मिशन में स्पॉन की संख्या से अधिक है।
  3. यह क्रम चलता रहता है; अर्थात्, प्रत्येक संख्या क्लस्टर के सहेजे गए डेटा तक पहुंचती है और उनसे यादृच्छिक मान प्राप्त करती है।
  4. डेटा के अंदर स्वास्थ्य का सारांश निकाला जाता है, तथा अपेक्षित स्वास्थ्य से अधिक होने वाली हर चीज को अनुक्रम से बाहर निकाल दिया जाता है (इसकी गणना ऊपर चर्चा की गई थी)
  5. स्पॉन्स को निर्दिष्ट स्वास्थ्य वितरण के आधार पर तरंगों में विभाजित किया जाता है और फिर समूहों में विभाजित किया जाता है (ताकि कई दुश्मन एक साथ दिखाई दें), और उनके प्रकट होने का समय स्पॉन्स के पिछले समूह की कार्रवाई और खाली समय के योग के रूप में दिया जाता है।
  6. मिशन तैयार है!


निष्कर्ष

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


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


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


चित्रण: shabbyrtist