जावा ( कम अंतराल: 8415 5291 3301)
ठीक है। मूल रूप से, मैं शर्मिंदा हूं कि किसी ने भी समाधान प्रस्तुत नहीं किया है। इसलिए कुछ दिनों पहले मैंने इस समस्या को हल करने की कोशिश शुरू की, b / c यह बहुत अच्छा है। । GitHub के माध्यम से उस पर मेरी प्रगति देखने के लिए उस लिंक का अनुसरण करें।
संपादित करें
नया सॉल्वर वर्जन, बहुत अधिक "गोल्फ", सही चक्र चेकर के साथ MT0 द्वारा पहचाना गया। यह वीएम को कितनी मेमोरी उपलब्ध है, यह बदलकर फास्ट-फॉरवर्डिंग मार्गों का समर्थन करता है। नवीनतम बिग संपादित: एहसास हुआ कि मेरे पास कुछ अन्य छोटे सूचकांक त्रुटियां और समय से पहले अनुकूलन थे, जिसके परिणामस्वरूप काफी बड़ी संख्या में जीत पर विचार करने में विफलता हुई। तो यह तय है, ध्यान से। नया संस्करण छोटा और नीचे दोनों है। हमारे संदर्भ मार्ग के लिए, java -Xmx2GB ZombieHordeMinचाल काफी अच्छी तरह से है (चेतावनी दी जा सकती है, इसमें थोड़ा समय लगेगा)।
कूल फैक्टॉयड
एक आकर्षक मोड़ में, 24 साल की लंबाई में MANY समाधान हैं, और मेरा सॉल्वर MT0 से एक अलग पाता है, लेकिन सिद्धांत रूप में समान है, सिवाय इसके कि इससे जुड़े अन्य चौकी पर जाकर शुरू होता है 1। चित्त आकर्षण करनेवाला! पूरी तरह से मानव अंतर्ज्ञान का मुकाबला, लेकिन पूरी तरह से वैध।
समाधान हाइलाइट्स
तो यहाँ मेरा है। यह (आंशिक रूप से) गोल्फ, बी / सी यह एक घातीय, लगभग-ब्रूट-बल सॉल्वर है। मैं एक IDDFS का उपयोग करता हूं (पुनरावृत्ति गहनता पहले खोज) एल्गोरिथ्म, इसलिए यह एक महान सामान्य सॉल्वर है जो स्किप नहीं करता है, इसलिए यह ओपी के प्रश्न के दोनों भागों को हल करता है , अर्थात्:
- यदि एक विजेता मार्ग पाया जाता है (अनंत लाश), आउटपुट 'x'।
- यदि सभी मार्ग मृत्यु (परिमित लाश) के रूप में समाप्त हो जाते हैं, तो सबसे बड़ी संख्या में मारे गए लाश का उत्पादन होता है।
इसे पर्याप्त शक्ति, स्मृति और समय दें, और यह धीमी गति से मृत्यु के नक्शे को भी ठीक करेगा। मैंने इस सॉल्वर को बेहतर बनाने के लिए कुछ और समय बिताया, और जबकि अधिक किया जा सकता है, अब यह थोड़ा बेहतर है। मैंने सर्वश्रेष्ठ अनंत-लाश समाधान पर MT0 की सलाह को भी एकीकृत किया, और अपने विजेता-चेकर से कई समयपूर्व अनुकूलन को हटा दिया, जिसने पिछले संस्करण को इसे खोजने से रोक दिया था, और अब मैं वास्तव में वर्णित MT0 के समान एक बहुत ही समान समाधान ढूंढता हूं।
कुछ अन्य हाइलाइट्स:
- जैसा कि उल्लेख किया गया है, सबसे कम संभव जीतने वाले मार्ग को खोजने के लिए एक IDDFS का उपयोग करता है।
- चूंकि यह एक डीएफएस कोर में है, इसलिए यह भी पता चलेगा कि क्या हर मार्ग हमारे नायक की मृत्यु में समाप्त होता है, और मारे गए अधिकांश लाशों के संदर्भ में "सर्वश्रेष्ठ" मार्ग का ट्रैक रखता है। एक हीरो मरो!
मैंने गोल्फ को हटाने के उद्देश्य से इसे देखने के लिए इसे और अधिक रोचक बनाने के लिए एल्गोरिदम का उपयोग किया है। अनथक संस्करण को देखने के लिए गीथब के लिंक में से एक का पालन करें।
साथ ही साथ कई टिप्पणियाँ हैं, इसलिए अपने दृष्टिकोण पर अपने स्वयं के समाधान के निर्माण के लिए फिर से लागू करने के लिए स्वतंत्र महसूस करें, या मुझे दिखाएं कि यह कैसे किया जाना चाहिए!
- मेमोरी-अनुकूली मार्ग तेजी से अग्रेषण
- उपलब्ध सिस्टम मेमोरी तक, "अंत मार्गों" का ट्रैक रखेगा, जिसके परिणामस्वरूप मृत्यु नहीं हुई।
- एक फैंसी रूट कम्प्रेशन और डीकम्प्रेशन रुटीन का उपयोग करते हुए, IDDFS की एक पूर्व पुनरावृत्ति से प्रगति को पुनर्निमित किया जाता है ताकि सभी आने वाले मार्गों को पुनर्परिभाषित किया जा सके।
- एक जानबूझकर साइड-बोनस के रूप में, मृत-अंत मार्ग के रूप में कार्य करता है। मृत अंत मार्गों को संग्रहीत नहीं किया जाता है, और IDDFS के भविष्य की गहराई में फिर से कभी नहीं जाएंगे।
सॉल्वर का इतिहास
- मैंने वन-स्टेप लुक-फ़ॉरवर्ड एल्गोरिदम का एक गुच्छा आज़माया, और बहुत ही सरल परिदृश्यों के लिए वे काम करेंगे, अंततः वे सपाट हो जाते हैं।
- फिर मैंने दो-चरणीय लुक-फॉर-अल्गोरिथम की कोशिश की, जो कि .. असंतोषजनक था।
- मैंने तब एक एन-स्टेप लुकहेड का निर्माण शुरू किया, जब मैंने पहचाना कि यह दृष्टिकोण डीएफएस के लिए अतिरेक है, फिर भी डीएफएस बहुत दूर है ... अधिक सुरुचिपूर्ण।
- डीएफएस का निर्माण करते समय, मेरे साथ यह हुआ कि आईडीडीएफएस (ए) सबसे अच्छा हीरो (मृत्यु) मार्ग या (बी) प्रथम विजेता चक्र सुनिश्चित करेगा।
- एक जीत-चक्र चेकर का निर्माण करना आसान है, लेकिन एक सफल सफल चेकर के पास जाने से पहले मुझे कई बहुत गलत पुनरावृत्तियों से गुजरना पड़ा।
- MT0 के जीत-पथ में फैले समयपूर्व अनुकूलन की तीन पंक्तियों को हटाने के लिए जिसने मेरे एल्गोरिथ्म को इसके लिए अंधा बना दिया।
- एक अनुकूली मार्ग-कैशिंग एल्गोरिथ्म जोड़ा गया है जो आईडीडीएफएस कॉल के बीच काम के अनावश्यक पुनर्विकास को रोकने के लिए आपके द्वारा दी गई सभी मेमोरी का उपयोग करेगा, और स्मृति की सीमा तक मृत-अंत मार्गों को भी बंद कर देगा।
(गोल्फ) कोड
कोड पर ( यहाँ या यहाँ ungolfed संस्करण प्राप्त करें ):
import java.util.*;public class ZombieHordeMin{int a=100,b,m,n,i,j,z,y,D=0,R,Z,N;int p[][][];Scanner in;Runtime rt;int[][]r;int pp;int dd;int[][]bdr;int ww;int[][]bwr;int[][]faf;int ff;boolean ffOn;public static void main(String[]a){(new ZombieHordeMin()).pR();}ZombieHordeMin(){in=new Scanner(System.in);rt=Runtime.getRuntime();m=in.nextInt();N=in.nextInt();p=new int[m+1][m+1][N+1];int[]o=new int[m+1];for(b=0;b<N;b++){i=in.nextInt();j=in.nextInt();z=in.nextInt();o[i]++;o[j]++;D=(o[i]>D?o[i]:D);p[i][j][++p[i][j][0]]=z;if(i!=j)p[j][i][++p[j][i][0]]=z;D=(o[j]>D?o[j]:D);}m++;}void pR(){r=new int[5000][m+3];r[0][0]=a;Arrays.fill(r[0],1,m,1);r[0][m]=1;r[0][m+1]=0;r[0][m+2]=0;ww=-1;pp=dd=0;pR(5000);}void pR(int aMD){faf=new int[D][];ff=0;ffOn=true;for(int mD=1;mD<=aMD;mD++){System.out.printf("Checking len %d\n",mD);int k=ffR(0,mD);if(ww>-1){System.out.printf("%d x\n",ww+1);for(int win=0;win<=ww;win++)System.out.printf(" %d:%d,%d-%d",win,bwr[win][0],bwr[win][1],bwr[win][2]);System.out.println();break;}if(k>0){System.out.printf("dead max %d kills, %d steps\n",pp,dd+1);for(int die=0;die<=dd;die++)System.out.printf(" %d:%d,%d-%d",die,bdr[die][0],bdr[die][1],bdr[die][2]);System.out.println();break;}}}int ffR(int dP,int mD){if(ff==0)return pR(dP,mD);int kk=0;int fm=ff;if(ffOn&&D*fm>rt.maxMemory()/(faf[0][0]*8+12))ffOn=false;int[][]fmv=faf;if(ffOn){faf=new int[D*fm][];ff=0;}for(int df=0;df<fm;df++){dS(fmv[df]);kk+=pR(fmv[df][0],mD);}fmv=null;rt.gc();return kk==fm?1:0;}int pR(int dP,int mD){if(dP==mD)return 0;int rT=0;int dC=0;int src=r[dP][m];int sa=r[dP][0];for(int dt=1;dt<m;dt++){for(int rut=1;rut<=p[src][dt][0];rut++){rT++;r[dP+1][0]=sa-p[src][dt][rut]+r[dP][dt];for(int cp=1;cp<m;cp++)r[dP+1][cp]=(dt==cp?1:r[dP][cp]+1);r[dP+1][m]=dt;r[dP+1][m+1]=rut;r[dP+1][m+2]=r[dP][m+2]+p[src][dt][rut];if(sa-p[src][dt][rut]<1){dC++;if(pp<r[dP][m+2]+sa){pp=r[dP][m+2]+sa;dd=dP+1;bdr=new int[dP+2][3];for(int cp=0;cp<=dP+1;cp++){bdr[cp][0]=r[cp][m];bdr[cp][1]=r[cp][m+1];bdr[cp][2]=r[cp][0];}}}else{for(int chk=0;chk<=dP;chk++){if(r[chk][m]==dt){int fR=chk+1;for(int cM=0;cM<m+3;cM++)r[dP+2][cM]=r[dP+1][cM];for(;fR<=dP+1;fR++){r[dP+2][0]=r[dP+2][0]-p[r[dP+2][m]][r[fR][m]][r[fR][m+1]]+r[dP+2][r[fR][m]];for(int cp=1;cp<m;cp++)r[dP+2][cp]=(r[fR][m]==cp?1:r[dP+2][cp]+1);r[dP+2][m+2]=r[dP+2][m+2]+p[r[dP+2][m]][r[fR][m]][r[fR][m+1]];r[dP+2][m]=r[fR][m];r[dP+2][m+1]=r[fR][m+1];}if(fR==dP+2&&r[dP+2][0]>=r[dP+1][0]){ww=dP+1;bwr=new int[dP+2][3];for(int cp=0;cp<dP+2;cp++){bwr[cp][0]=r[cp][m];bwr[cp][1]=r[cp][m+1];bwr[cp][2]=r[cp][0];}return 0;}}}dC+=pR(dP+1,mD);if(ww>-1)return 0;}for(int cp=0;cp<m+3;cp++)r[dP+1][cp]=0;}}if(rT==dC)return 1;else{if(ffOn&&dP==mD-1)faf[ff++]=cP(dP);return 0;}}int[]cP(int dP){int[]cmp=new int[dP*2+3];cmp[0]=dP;cmp[dP*2+1]=r[dP][0];cmp[dP*2+2]=r[dP][m+2];for(int zip=1;zip<=dP;zip++){cmp[zip]=r[zip][m];cmp[dP+zip]=r[zip][m+1];}return cmp;}void dS(int[]cmp){int[]lv=new int[m];int dP=cmp[0];r[dP][0]=cmp[dP*2+1];r[dP][m+2]=cmp[dP*2+2];r[0][0]=100;r[0][m]=1;for(int dp=1;dp<=dP;dp++){r[dp][m]=cmp[dp];r[dp][m+1]=cmp[dP+dp];r[dp-1][cmp[dp]]=dp-lv[cmp[dp]];r[dp][m+2]=r[dp-1][m+2]+p[r[dp-1][m]][cmp[dp]][cmp[dP+dp]];r[dp][0]=r[dp-1][0]+r[dp-1][cmp[dp]]-p[r[dp-1][m]][cmp[dp]][cmp[dP+dp]];lv[cmp[dp]]=dp;}for(int am=1;am<m;am++)r[dP][am]=(am==cmp[dP]?1:dP-lv[am]+1);}}
मेरे द्वारा किए गए किसी भी परिवर्तन को ट्रैक करने के लिए, यहाँ github से कोड प्राप्त करें । यहाँ कुछ अन्य मानचित्र हैं जिनका मैंने उपयोग किया है।
आउटपुट उदाहरण
संदर्भ समाधान के लिए उदाहरण आउटपुट:
$ java -d64 -Xmx3G ZombieHordeMin > reference_route_corrected_min.out
5 6 1 2 4 2 3 4 3 1 4 2 4 10 2 5 10 1 1 50
Checking len 1
Checking len 2
Checking len 3
Checking len 4
Checking len 5
Checking len 6
Checking len 7
Checking len 8
Checking len 9
Checking len 10
Checking len 11
Checking len 12
Checking len 13
Checking len 14
Checking len 15
Checking len 16
Checking len 17
Checking len 18
Checking len 19
Checking len 20
Checking len 21
Checking len 22
Checking len 23
Checking len 24
25 x
0:1,0-100 1:3,1-97 2:1,1-95 3:2,1-94 4:5,1-88 5:2,1-80 6:4,1-76 7:2,1-68 8:1,1-70 9:2,1-68 10:1,1-66 11:2,1-64 12:1,1-62 13:2,1-60 14:1,1-58 15:2,1-56 16:1,1-54 17:2,1-52 18:1,1-50 19:2,1-48 20:1,1-46 21:2,1-44 22:1,1-42 23:2,1-40 24:1,1-38
पढ़ें इस तरह मार्ग उत्पादन: step: source, route-to-get-here- ammo। तो उपरोक्त समाधान में, आप इसे इस प्रकार पढ़ेंगे:
- कदम-कदम पर
0, 1बारूद के साथ चौकी पर 100।
- कदम-कदम पर
1, बारूद को समाप्त 1करने के 3साथ चौकी जाने के लिए मार्ग का उपयोग करें97
- कदम-कदम पर
2, बारूद को समाप्त 1करने के 1साथ चौकी जाने के लिए मार्ग का उपयोग करें95
- ...
नोट बंद करना
इसलिए, मुझे आशा है कि मैंने अपने समाधान को हरा देने के लिए कठिन बना दिया है, लेकिन कृपया कोशिश करें! मेरे खिलाफ इसका इस्तेमाल करें, कुछ समानांतर प्रसंस्करण, बेहतर ग्राफ सिद्धांत आदि में जोड़ें। मेरे द्वारा लगाई गई कुछ चीजें इस दृष्टिकोण में सुधार कर सकती हैं :
- एल्गोरिथ्म की प्रगति के रूप में आक्रामक रूप से कटौती करने के लिए आक्रामक रूप से "कम" छोरों को हटा दें।
- एक उदाहरण: उदाहरण की समस्या में, छोरों को 1-2-3 और अन्य क्रमपरिवर्तन को "एक कदम" के रूप में समझें, ताकि हम अंत-चक्र को और अधिक तेज़ी से अपना रास्ता बना सकें।
- उदाहरण के लिए, यदि आप नोड 1 पर हैं, तो आप या तो (a) 2 पर जा सकते हैं, (b) 1 पर जा सकते हैं, (c) 1-2-3 से एक कदम और आगे बढ़ेंगे। यह हल करने के लिए चौड़ाई में गहराई को हल करने की अनुमति देता है, एक विशेष गहराई पर मार्गों की संख्या बढ़ाता है लेकिन लंबे चक्रों के लिए बहुत तेजी से समय-से-समाधान।
मृत मार्ग। मेरा वर्तमान समाधान "याद नहीं" करता है कि एक विशेष मार्ग मृत-समाप्त हो गया है, और हर बार इसे फिर से खोज लेना है। बेहतर होगा कि जल्द से जल्द किसी ऐसे पल का ध्यान रखें कि मौत निश्चित है, और इससे आगे कभी नहीं बढ़ सकती। इसे किया...
- यदि सावधान रहें, तो आप मृत मार्ग को उप-मार्ग के रूप में लागू कर सकते हैं। उदाहरण के लिए, यदि 1-2-3-4 में हमेशा मृत्यु होती है, और सॉल्वर 1-3-1-2-3-4 मार्ग का परीक्षण करने वाला होता है, तो उसे तुरंत उस रास्ते पर उतरना बंद कर देना चाहिए, क्योंकि वह समाप्त होने की गारंटी है। निराशा में। अभी भी कुछ सावधान गणित के साथ, # हत्याओं की गणना करना संभव होगा।
कोई अन्य समाधान जो समय के लिए स्मृति को ट्रेड करता है, या मृत-अंत मार्गों का अनुसरण करने से आक्रामक बचने की अनुमति देता है। यह भी किया!
10 बारूद के साथ शुरू होने के अलावा अन्य है ? क्या ग्राफ अप्रत्यक्ष है?