स्पेल कास्टिंग - प्रति सेकंड नुकसान का अनुकूलन कैसे करें


23

कल्पना कीजिए कि हमारे पास एक जादूगर है जो कुछ मंत्र जानता है। प्रत्येक मंत्र में 3 विशेषताएं होती हैं: नुकसान, ठंडा समय और एक कच्चा समय। सुंदर मानक आरपीजी सामान।

Cooldown time: समय की मात्रा (t) उस स्पेल को फिर से कास्ट करने में सक्षम होने से पहले लेती है। जिस समय यह कास्टिंग शुरू होती है उस समय एक जादू "कोल्डाउन" पर चला जाता है।

कास्ट समय: समय की मात्रा (टी) यह एक जादू का उपयोग करने के लिए लेता है। हालांकि विज़ार्ड कुछ और कास्टिंग कर रहा है और उसे रद्द नहीं किया जा सकता है।

सवाल यह है कि आप मंत्रों के विभिन्न सेटों को अधिकतम नुकसान कैसे पहुंचाएंगे?

प्रति डाली समय में उच्चतम क्षति की गणना करना आसान है। लेकिन उन स्थितियों के बारे में क्या है जहां इंतजार करना बेहतर होता है जब बहुत अधिक उपलब्ध होने पर "डंक" को कम नुकसान के लिए कास्टिंग करना पड़ता है?

उदाहरण के लिए,

  1. आग का गोला: 3000 नुकसान, 3 सेकंड कास्ट टाइम, 6 सेकंड कूल डाउन।

  2. फ्रॉस्टबोल्ट: 20 क्षति, 4 सेकंड कास्ट टाइम, 4 सेकंड कूल डाउन।

  3. Fireblast: 3 नुकसान, 3 सेकंड कास्ट टाइम, 3 सेकंड कूल डाउन।

इस स्थिति में प्रति सेकंड आपकी क्षति अधिक है यदि आपने फ्रॉस्टबोल्ट के बजाय कम डीपीसीटी स्पेल (फायरब्लास्ट) के लिए जाना चुना। इसलिए हमें एक मंत्र चुनने के परिणामों पर विचार करना चाहिए। वैकल्पिक शब्द

निम्नलिखित उदाहरण में "ओवर कास्टिंग" और "प्रतीक्षा" के मामले हैं। वैकल्पिक शब्द


मैं इस स्थिति में 1-3-1 क्यों करूंगा? 1-2-1 क्यों नहीं? 1-2-3-1 क्यों नहीं, जो 1-3-1-X से अधिक कुशल है अगर 1-3-1 अकेले लक्ष्य को नहीं मारेंगे?

@ जोए Wrigchnig: यह इंगित करने के लिए धन्यवाद। मेरे उदाहरण में एक गलती थी। इसे अब केवल 2 मामलों में सरल बना दिया।
अनारफेयर

1
लालची, जब भी संभव हो उच्चतम उपलब्ध dps जादू का चयन करें। अन्य तर्क की उपेक्षा करना। इंतज़ार कर रही।
अनारफोरन

1
बस पानी को मैला करना है। एक मंत्र पर विचार करें जो ∞ नुकसान करता है, लेकिन कास्ट करने में 50 सेकंड लगते हैं। यह dps / dpct ∞ है, लेकिन इसे 50 सेकंड से कम समय में अन्य साधनों से निशाना बनाया जा सकता है, तो इसे कभी नहीं उठाना चाहिए।
deft_code

जवाबों:


23

सभी ऐ खोज है!

जब आप एअर इंडिया की हिम्मत में पड़ते हैं तो यह आश्चर्यजनक है कि यह वास्तव में कितना खोजा गया है

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

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

यूसीएस का उपयोग करने के कुछ और फायदे यह है कि आप केवल 3 वेरिएबल्स के साथ प्रदान किए गए से अधिक जटिल परिस्थितियों के लिए इष्टतम कास्ट ऑर्डर पा सकते हैं। कुछ अन्य पहलू जो आसानी से जुड़ सकते हैं:

  • वक्त के साथ बर्बादी
  • ताज़ा मंत्र अन्य मंत्र के cooldown को कम करने के लिए
  • जल्दबाजी में अन्य मंत्र तेजी से डालते हैं।
  • बूस्टर को नुकसान पहुंचाता है, जिससे अन्य मंत्र अधिक नुकसान कर सकते हैं।

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


2

यह एक विशेष दहनशील अनुकूलन समस्या है। जैसे-जैसे मंत्रों की संख्या बढ़ती है, मंत्रों के इष्टतम संयोजन / पैटर्न को खोजने में कठिनाई काफी बढ़ जाती है। इस समस्या को हल करने में जो समस्याएँ हल करने के लिए इस्तेमाल होती हैं, वैसी ही ह्यूरिस्टिक्स भी मूल्यवान होंगी।


1

आपको 'कास्टिंग टाइम की प्रति यूनिट क्षति' (DPCT) के संदर्भ में सोचने की जरूरत है - उदाहरण के लिए, 3 सेकंड की कास्ट वाली आग का गोला और 3000 नुकसान करने वाले 1000 DPCT करेंगे।

यदि आपको कास्टिंग करने से पहले कोल्डाउन के लिए 3 सेकंड इंतजार करना पड़ता है, तो यह 500 DPCT (3000 क्षति, 6 सेकंड कुल विभाजित, प्रतीक्षा सहित) को कम कर देगा

इसलिए आपको बस प्रत्येक वर्तनी के नुकसान-प्रति-काल-समय को निर्धारित करने की आवश्यकता है, जिसमें कोल्डाउन के लिए कोई शेष प्रतीक्षा भी शामिल है। उच्चतम DPCT के साथ एक को चुनें, यदि आवश्यक हो तो प्रतीक्षा करें, फिर इसे डालें। बॉस के मरने तक दोहराएं :)


समस्या यह है कि DPCT बहुत भ्रामक हो सकता है। उदाहरण के लिए कहें कि हम मिश्रण में 2 और मंत्र जोड़ते हैं आग का गोला: 3000 क्षति, 3 सेकंड कास्ट, 6 सेकंड कोल्डाउन, DPCT: 1000 वर्तनी # 2: 20 क्षति, 4 सेकंड कास्ट, 4 सेकंड कोल्डाउन, DPCT: 5 वर्तनी / 3: 3 क्षति, 3 सेकंड कास्ट, 3 सेकंड कोल्डाउन, डीपीसीटी: 1 (याद रखें, कॉल्डाउन उस पल की शुरुआत करता है, जिसमें स्पेल डाला गया है) भले ही स्पेल # 3 में डीपीसीटी कम है, इसका परिणाम उच्च डीपीएस (1-3-1-3) होगा। ।) स्पेल # 2 (1-2-1-2 ...) की तुलना में।
अनारफेयर

1

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

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

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


0

इस एल्गोरिथ्म का पता लगाया जो मेरे उद्देश्यों के लिए अच्छी तरह से काम करता है।

लोगों ने कुछ बेहतरीन बिंदु उठाए। इसे अंतिम लक्ष्य मानदंड देने से सामान्य खोज एल्गोरिदम को अपनी चीज करने की अनुमति मिलेगी। अर्थात। टी सेकंड में अधिकतम नुकसान करते हैं, इष्टतम समय में एक्स नुकसान करते हैं।

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

पहला कदम वर्तनी की पहचान प्रति डाली समय में सबसे अधिक नुकसान के साथ है। यह वर्तनी "आधार रेखा" बन जाती है क्योंकि यह प्रति सेकंड उच्चतम क्षति की गारंटी देगी। मतलब, आपको इस वर्तनी को हमेशा रखना चाहिए यदि निम्न 2 शर्तें पूरी होती हैं: 1) आधार रेखा वर्तनी उपलब्ध है (कोल्डडाउन पर नहीं)। 2) आप वर्तमान में एक जादू नहीं कर रहे हैं।

तो यह अन्य मंत्रों में भरने का विषय बन जाता है जबकि बेसलाइन मंत्र कोल्डाउन पर होता है। के बीच (कास्ट टाइम) और (कोल्डाउन - कास्ट टाइम)। हालांकि, कुछ अतिव्यापी हो सकता है (नियम 2 ऊपर गलत है)।

यह सभी गैर-बेसलाइन मंत्रों के माध्यम से पुनरावृत्ति का मामला बन जाता है, जो मंत्रों के सभी अनुक्रमों को खोजने के लिए करते हैं जो 2 नियमों का उल्लंघन नहीं करते हैं।

उन मंत्रों के लिए जो आपको ओवरलैप करना चाहिए संभावित नुकसान के लिए उन्हें दंडित करना चाहिए आधारभूत वर्तनी हो सकती है (अधिकतम नुकसान तक)।

उदाहरण के लिए, 2 मंत्र लें

1: 300 क्षति, 3 एस कास्ट टाइम, 10 एस कोल्डाउन

2: 290 क्षति, 3 एस कास्ट टाइम, 3 एस कोल्डाउन

सबसे अधिक नुकसान अनुक्रम 1 - 2 - 2 - 2. से होता है, जो संभावित # 1 कलाकारों में 2 सेकंड के ओवरलैप का कारण बनता है। हालाँकि, यह तब से लाभकारी है, जब आप तीसरा स्पेल नहीं डालते हैं (यानी 1 - 2 - 2), आप 1 सेकंड के लिए स्पेयर के साथ 880 नुकसान करेंगे। यदि आप अतिरिक्त # 2 स्पेल डालते हैं, तो आप # 1 का 1170 - 2 सेकंड जो कि 200 है। ऐसा लगता है कि 970 नुकसान आपका सापेक्ष नुकसान है।


-2

आप एक सरल "सुरक्षा स्तर" स्टाइल स्विच केस कर सकते हैं।

मेरे थके हुए राज्य के विचार के स्तर से परे तर्क की त्रुटियों के कारण यह मेरे सिर के ठीक ऊपर है, लेकिन मुझे आशा है कि यह आपको आरंभ कर सकता है।

अपना समय मानते हुए ब्लॉक पूर्णांक में किया जाता है -

// after casting spell
int remainingTime = (coolDown - castTime);
switch(spellJustCast)
{
  // assuming the cast method will have some input validation for whether the spell
  // is off cooldown or not, pass the time as a parameter
  case 3 : castSpell1(remainingTime);
           castSpell2(remainingTime);
           break;
  case 1 : castSpell2(remainingTime);
           castSpell3(remainingTime);
           break;
  case 2 : castSpell1(remainingTime);
           castSpell3(remainingTime);
           break;
  default: System.out.println("Debug!");
           break;
}

आपके वर्तनी समय के कारण कुछ विधि कॉल अनावश्यक हैं, लेकिन इस तरह से अपडेट के लिए हमेशा जगह है।

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


मुझे वास्तव में पता नहीं है कि आप यहां क्या प्राप्त करने की कोशिश कर रहे हैं, लेकिन किसी भी आधुनिक गेम इंजन में castSpell1 और castSpell2 जैसे कार्य नहीं हैं।

1
@Joe Wreschnig मेरा मतलब था कि उनके कस्टम खेल कक्षाओं में उनके अपने तरीके होने के नाते, यह सिर्फ एक सार उदाहरण है, विस्तृत विवरण नहीं।
कायली

1
ठीक है, यह नहीं है कि आधुनिक इंजनों में मंत्र कैसे काम करते हैं। एक कैस्पेल फ़ंक्शन है जो एक ऑब्जेक्ट लेता है जिसके फ़ील्ड को फ़ाइल से पढ़ा जाता है। इस तरह के एक स्विच स्टेटमेंट को किसी भी वास्तविक इंजन में बनाए रखना असंभव होगा, और किसी प्रकार के प्लानिंग एल्गोरिदम की आवश्यकता होती है।

@Joe Wreschnig मैं समझता हूं। मैं केवल एक रास्ता दे रहा था जिसमें समस्या को हल करना था। यह उदाहरण जावा में लिखा गया है, जिसका उद्देश्य किसी इंजन या विशिष्ट ढांचे के लिए नहीं है। लेकिन अगर इसे लागू नहीं किया जा सकता है जैसा कि आप कहते हैं, मेरा उत्तर शून्य है।
kymully
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.