जब इकाइयां जोड़ी जाती हैं या निकाली जाती हैं तो मैं एक आयताकार गठन कैसे बना सकता हूं?


18

मुझे पंक्तियों और स्तंभों के साथ एक आयताकार गठन में बॉट मिला है। एक समस्या तब पैदा होती है जब एक बॉट को जोड़ा जाता है या गठन से हटा दिया जाता है। जब ऐसा होता है, तो बॉट्स को खुद को पुनर्व्यवस्थित करना पड़ता है ताकि आयताकार गठन अभी भी लगभग उसी पहलू अनुपात हो, और जितना संभव हो उतना आयताकार हो। यह कैसे करना है?

कुछ विचार:

  • जब एक बॉट को जोड़ा या हटाया जाता है, तो नई चौड़ाई और बॉट की कुल संख्या और वांछित निरंतर पहलू अनुपात का उपयोग करके उस पहलू की नई चौड़ाई और ऊंचाई की गणना करें जो उस पहलू अनुपात को सबसे करीब से फिट करता है। फिर किसी तरह नए आयामों को फिट करने के लिए बॉट्स को फेरबदल करें।

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

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

अद्यतन करें : तो सरहम के उत्तर को देखते हुए, मैं एक अच्छा सामान्य कार्य करता हूं जो अच्छे आयाम देता है।

पहले मैंने नीचे चौड़ाई और ऊंचाई के लिए एक साथ समीकरण हल किया, और फिर जवाबों को गोल किया।

width/height=aspect ratio of your choice
width*height=number of bots

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

अपडेट करें

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

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


एक इकाई में बॉट की अधिकतम संख्या कितनी है? यदि यह अपेक्षाकृत छोटा है, तो आप एक निश्चित संख्या में बॉट के लिए कितनी पंक्तियों और स्तंभों को तैयार कर सकते हैं।
16

3
क्या आप शायद उन संरचनाओं की छवि पोस्ट कर सकते हैं जो वैध बनाम अमान्य हैं? मुझे समझने में थोड़ी परेशानी हो रही है कि आप क्या कर रहे हैं। क्या अधूरी पंक्तियों / स्तंभों की अनुमति है?
माइकलहाउस

3
आपको लगता है कि यह प्राइम नंबरों के लिए काम नहीं करेगा? 7 बॉट्स के साथ, आपको बैक में सिंगल बॉट के साथ 3x2 यूनिट बनाना होगा।
Ex पर

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

3
प्राइम नंबर केवल वे ही नहीं हैं जो परेशानी का कारण बनेंगे - फैक्टरिंग द्वारा आकार का चयन करना आपको अनुचित रूप से लंबे और पतले फॉर्मेशन दे सकता है। उदाहरण के लिए, यदि आपके पास 14 बॉट हैं, तो एकमात्र सही आयताकार गठन 7x2 है, जबकि 2 बॉट की अतिरिक्त पंक्ति के साथ 3x4 का गठन बेहतर हो सकता है ।
नाथन रीड

जवाबों:


16

एक और तकनीक है जो कि नेपोलियन बटालियन द्वारा इस्तेमाल की जाती है (और संभवत: आगे बढ़ने पर ग्रीक फालानक्स के रूप में वापस आती है)।

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

फ्रंटेज केवल तब कम हो जाता है जब पिछला रैंक पूर्व-निर्दिष्ट घनत्व से नीचे आता है। इसी तरह, जब बैक रैंक ओवरफ्लो होती है, तो एक्सट्रैस पहले दोनों फ्लैक्स में से एक अतिरिक्त रैंक भरना शुरू कर देता है, और फिर फ्रंटेज बढ़ जाता है।

फ्रंटेज बदलते समय, मैं सुझाव देता हूं कि फ्रंट बॉटिंग बढ़ाते समय आपके बॉट्स को बैक रैंक से दोनों फ्लैंक्स में फाइल किया जाए, और फ्रंटेज को कम करते हुए दोनों फ्लैक्स से बैक रैंक में फाइल किया जाए।

अगर मैं यह अनुमान लगाने में सही हूं कि आप "सैन्य" छाप की तलाश कर रहे हैं, और आपके बॉट संगठनों को फालानक्स की तरह लग रहा है, मेरा मानना ​​है कि यह आदेश दिया गया पुन: व्यवस्था उस छोर को प्राप्त करने का एक बेहतर तरीका है।

अद्यतन :
पिछली पंक्ति को प्रबंधित करने का एक सरल तरीका यह है कि पिछली पंक्ति की इकाइयों को तीन वर्गों में विभाजित करें: प्रत्येक फ्लैंक पर और केंद्र में एक। इस बात पर निर्भर करते हुए कि क्या फ्रंटेज विषम है या यहां तक ​​कि, और क्या बैक-रो इकाइयों की संख्या 0,1, या 2 मॉड 3 के अनुरूप है, प्रबंधन करने के लिए ठीक छह मामले हैं।

उपरोक्त में वृद्धि के रूप में, प्रत्येक बैक-पंक्ति दस्ते की अंतिम इकाई (एस) को भरने के बारे में विचार करें, एक बार भरने के लिए एक सीमा से नीचे गिरता है, इस तरह:
xxx.x .... x.xxx.x .... x। xxx
या यह:
xx.xx..x.xxx.x ... xxxx
थोड़ा और काम, और भी बेहतर उपस्थिति के लिए।

अद्यतन # 2 :
गठन गहराई पर एक अतिरिक्त विचार। आधुनिक संगीन के साथ संयुक्त रूप से वॉली फायर के प्रभाव ने 18 वीं शताब्दी के अंत में और 19 वीं शताब्दी की शुरुआत में 3 या 4 की गहराई बना ली। (अंग्रेज ने शायद ही कभी 2 रैंकों में लड़ाई लड़ी, लोकप्रिय धारणा के विपरीत, एक लड़ाई में देर तक; एक के लिए, अपनी रेखाओं को जल्दी से चौकोर बनाने के लिए बहुत लंबा कर दिया।) इससे पहले यह अधिक से अधिक गहराई तक आम था, शायद 8 तक। या सरिसा से लैस एक ग्रीक फाल्नेक्स के लिए 10। एक गहराई चुनें जो आपकी इच्छा को प्रभावित करता है।

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


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

लेकिन पकड़ो। कहते हैं कि बैक रैंक में केवल 3 बॉट होते हैं और कॉलम 1, 2, और 3 में होते हैं। और मैं किसी को 5 वें कॉलम से सामने वाले के पास से हटा देता हूं। मैं 5 वीं कॉलम में दूसरी पंक्ति में बिना किसी बॉट के अंतिम स्थान पर एक मुफ्त स्थान के साथ समाप्त कर दूंगा, क्योंकि यह जगह लेने के लिए पीछे नहीं है। इस जगह को कौन भरना चाहिए?
टिब्बी 12

संभवतः, पीछे के रैंक (स्तंभ 3 में एक) के निकटतम बॉट को इसे भरने के लिए चलना चाहिए। या आप दूसरे-से-अंतिम रैंक के कॉलम 3 और 4 में बॉट्स होने से थोड़ा समय बचा सकते हैं, प्रत्येक स्टेप एक कॉलम ऊपर होगा, गैप को कॉलम 3 पर ले जाएंगे, और फिर कॉलम 3 पर बॉट को भरने के लिए आगे बढ़ाएं। यह। (IMO, सबसे "प्राकृतिक" दिखने वाली रणनीति संभवतः दोनों के कुछ
हेयुरिस्टिक

1
वापस रैंक बहुत कुछ सदस्यों (कहते हैं कि अन्य रैंकों की तुलना में कम 50%) है, और आप सामने का हिस्सा बढ़ाते हैं, तो यह है की गारंटी समस्या को ठीक करने के लिए, या इसे वापस पद होता है कि संभव है अब भी बढ़ रही है के बाद भी कुछ सदस्य इसे दोहराए जाने की आवश्यकता है या कुछ और?
टिब्बी १२

1
@ Tiby312: मेरा मानना ​​है कि आप इसे सोच रहे हैं। इसे आजमाइए, यह जानकर कि आप इसे बाद में कभी भी ट्यून कर सकते हैं
पीटर गेकरेंस

7

एक इकाई मानते हुए बॉट्स का एक रैखिक डेटास्ट्रक्चर (जैसे एक सूची ) है।

सबसे पहले, आपको डेटासट्रक्चर से / से बॉट को जोड़ना / निकालना होगा और यूनिट में बॉट्स की नई संख्या निर्धारित करनी होगी

फिर, आपको https://en.wikipedia.org/wiki/Integer_factorization का उपयोग करके पंक्तियों और स्तंभों की नई राशि निर्धारित करनी होगी ।

बेशक, यह हमेशा अभाज्य संख्याओं के कारण संभव नहीं है । जब नई इकाई का आकार एक प्रमुख संख्या है, तो आपको अगली बड़ी इकाई आकार का उपयोग करने की आवश्यकता है जो नहीं है।

फिर, डेटास्ट्रक्चर पर केवल पुनरावृत्त करें, पंक्तियों और स्तंभों के क्रम में बॉट असाइन करना।

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

एक कोने में केंद्र के साथ एक इकाई बनाने के लिए , एक बॉट की स्थिति द्वारा दी गई है

UnitPosition + शीर्षक * स्तंभनंबर * botSeparationDistance + rightVector * rowNumber * botSeparationDistance

बीच में केंद्र के साथ एक इकाई बनाने के लिए , एक बॉट की स्थिति द्वारा दी गई है

UnitPosition + हैडिंग * (कॉलमनंबर * UnitSeparationDistance - 0.5 * (नंबरऑफकॉम्पलियंस * botSeparationDistance) + rightVector * rowNumber * botSeparationDistance (0.5) (numberOfRows * botSeparationDistance)

जहां शीर्षक दिशा इकाई का सामना करना पड़ रहा है और में एक सदिश की ओर इशारा करते है rightVector एक वेक्टर के लिए ओर्थोगोनल है शीर्षक

बॉटसेपरेशनडिस्टेंस को बॉट्स को आगे अलग या पास एक साथ खड़ा करने के लिए ट्विस्ट किया जा सकता है।

यदि आप कर रहे हैं लग रहा है कल्पना, आप कर सकते हैं ऑफसेट बॉट की अंतिम पंक्ति से rightVector * 0.5 * (numberOfColumns - actualNumberOfBotsInRow) के लिए केंद्र उन्हें गठन पर


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

2
आप हमेशा नए पदों की गणना कर सकते हैं, फिर निकटतम बॉट को रैखिक पुनरावृत्ति करने के बजाय उस स्थिति में ले जा सकते हैं।

एक वर्ग संगणना के साथ समाप्त किए बिना यह कैसे करें? अगर मैं इसे सही ढंग से समझ रहा हूं, तो मुझे 2d सरणी में उनकी वर्तमान स्थिति से 2d सरणी में निकटतम स्थिति ढूंढनी होगी।
टिब्बी 12

प्रत्येक पुनरावृत्ति में, एक इकाई को सौंपा जाएगा (और इस प्रकार आगे पुनरावृत्तियों पर विचार करने की आवश्यकता नहीं है), इस प्रकार रनटाइम O (n!) होगा। जो, अभी भी, बहुत अच्छा नहीं है। फिर से, [पसंद की एक अनुकूलन संरचना] का निर्माण और एन रेंज क्वेरी करना तेजी से भी नहीं है। केवल एक चीज जो मैं अभी सोच सकता हूं वह अंतिम बॉट्स को पीछे की ओर एक पंक्ति में ले जा रहा है या पिछले स्थानों को पीछे से बॉट्स के साथ भर रहा है।
18

इस बारे में कैसा है। मान लें कि नए गठन का आकार छोटा है। फिर प्रत्येक पंक्ति पर, आपको एक अतिरिक्त बॉट मिला है। आप उस बॉट को एक, और एक को बाईं ओर असाइन करते हैं। फिर अगली पंक्ति के नीचे, आपको एक जगह के बिना दो बॉट मिले हैं। आप उन दो को नीचे और एक को बाईं ओर असाइन करते हैं। फिर आपको बिना जगह के 3 बॉट मिले। तब तक जारी रखें जब तक आपको नीचे एक अतिरिक्त पंक्ति न मिल जाए। मैं यहां सिर्फ थूक रहा हूं। मैं यह सब तरह से नहीं सोचता था, लेकिन ऐसा लगता है कि यह काम करेगा और इसका तेज़।
टिब्बी 12

2

मैं ग्राफ़ में संभावित पदों को बड़े आयतों के साथ छोटे आयतों में संग्रहीत करूँगा।

[4][3][2][1]
[3][3][2][1]
[2][2][2][1]
[1][1][1][1]

हर बार जब कोई रोबोट खोज निकाला जाता है, तो सभी अन्य रोबोट और सबसे छोटे मूल्य वाले नोड में पाते हैं। खाली जगह के लिए उस छोटे से मान से एक रास्ता खोजने के लिए A * या BST एल्गोरिथम का उपयोग करें। अगर कोई हटाए गए कुछ नहीं की तुलना में एक छोटे मूल्य के साथ कोई रोबोट नहीं है।

आपको यह भी नियंत्रित करने में सक्षम होना चाहिए कि आयत यह कैसे कर रही है। उदाहरण के लिए नीचे दिए ग्राफ में जब कोई रोबोट नीचे की तरफ से निकलता है तो वह अपनी जगह भर देता है।

[4.9][3.8][2.7][1.0]
[4.8][3.7][2.6][1.0]
[3.9][3.6][2.5][1.0]
[3.5][3.4][2.4][1.0]
[2.9][2.8][2.3][1.0]
[2.0][2.1][2.2][1.0]
[1.9][1.8][1.7][1.0]
[1.6][1.5][1.4][1.0]

यहां 3.8 पर एक को हटा दिया जाता है, इसलिए 2.5 पर एक आता है और अपनी जगह भरता है।

[o][x][o][ ]
[o][o][o][ ]
[o][o][r][ ]
[o][o][ ][ ]
[o][o][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]

एक और उदाहरण। यहां 2.8 को हटा दिया गया है, इसलिए सबसे छोटा नोड 2.2 अपनी जगह भरता है।

[o][o][o][ ]
[o][o][o][ ]
[o][o][o][ ]
[o][o][o][ ]
[o][x][r][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]

आप शायद मान 0 के साथ नोड्स की एक अंगूठी चाहते हैं, जिसे आप छेद के साथ खोजने के लिए अपने पाथफाइंडिंग एल्गोरिदम के लिए बाहर से कभी भी आबाद न करें।

[0.0][0.0][0.0][0.0][0.0][0.0]
[0.0][4.9][3.8][2.7][1.0][0.0]
[0.0][4.8][3.7][2.6][1.0][0.0]
[0.0][3.9][3.6][2.5][1.0][0.0]
[0.0][3.5][3.4][2.4][1.0][0.0]
[0.0][2.9][2.8][2.3][1.0][0.0]
[0.0][2.0][2.1][2.2][1.0][0.0]
[0.0][1.9][1.8][1.7][1.0][0.0]
[0.0][1.6][1.5][1.4][1.0][0.0]
[0.0][0.0][0.0][0.0][0.0][0.0]

A * पर एक अच्छा ट्यूटोरियल यहाँ पाया जा सकता है


यह एक मीठा विचार है, लेकिन अगर मैं इसे सही ढंग से समझ रहा हूं, तो आप ऐसे फॉर्मेशनों की अनुमति दे रहे हैं जो सही आयतें नहीं हैं। सीमाओं पर पंक्तियों और स्तंभों को भरा नहीं जा सकता है। मैं सोच रहा था कि मैं इसे बना सकता हूं ताकि इसे हमेशा एक आयताकार सीमा मिल जाए, और इसके बजाय पंक्तियों और स्तंभों की संख्या को बदलकर इस आवश्यकता को पूरा करने के लिए पहलू अनुपात को थोड़ा बदल दें। मैं पहले से ही नई चौड़ाई और ऊंचाई की गणना कर सकता हूं जो इसे पूरा करेगा, लेकिन फिर बॉट्स को निकटतम स्पॉट पर फिर से असाइन करने के लिए कुछ जटिल तरीके से काम करता है..मुझे लगता है।
टिब्बी १२

@ Tiby312 आप कैसे कहते हैं ... 7 रोबोट के साथ एक सही आयत बनाने की योजना बना रहे हैं?
क्लासिकथुंदर

कभी-कभी मैं प्राइम नंबर के बारे में भूल गया। माफ़ करना। लेकिन मैं अभी भी सोच रहा हूं कि पंक्तियों और स्तंभों की संख्या को समायोजित करने से उस पर बॉट्स की असामान्य रूप से कम संख्या वाली पंक्ति या स्तंभ से बचा जा सकता है।
टिबि 312

@ Tiby312 मुझे लगता है कि आप एक सुसंगत पहलू अनुपात (यानी हमेशा 4: 3 या 8: 5) के लिए लक्ष्य से बेहतर हैं कि हमेशा इसे एक सही आयत बनाने की कोशिश करें।
corsiKa
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.