জাভা ( কম বিদ্বেষপূর্ণ: 8415 5291 3301)
ঠিক আছে. মূলত, আমি বিব্রত হয়েছি কেউই কোনও সমাধান জমা দেয়নি। তাই কয়েক দিন আগে আমি এই সমস্যাটি সমাধান করার চেষ্টা শুরু করেছিলাম, খ / সি এটা দুর্দান্ত। । গিটহাবের মাধ্যমে আমার অগ্রগতি দেখতে সেই লিঙ্কটি অনুসরণ করুন।
সম্পাদন করা
নতুন সলভার সংস্করণ, আরও অনেকগুলি "গল্ফড", এমটি0 দ্বারা চিহ্নিত হিসাবে সংশোধন চক্র পরীক্ষক সহ। এটি ভিএম-তে কত স্মৃতি উপলব্ধ তা পরিবর্তন করে দ্রুত-ফরওয়ার্ডিং রুটগুলিকে সমর্থন করে। সর্বশেষ বিজি সম্পাদনা: বুঝতে পেরেছিলাম যে আমার কয়েকটি অন্যান্য ছোট সূচক ত্রুটি এবং অকাল অপ্টিমাইজেশান ছিল, এর ফলে বেশ কয়েকটি বিশাল পরিমাণের জয় বিবেচনা করতে ব্যর্থ হয়েছিল। সুতরাং যে সাবধানে স্থির। নতুন সংস্করণটি ছোট এবং নীচে উভয়ই। আমাদের রেফারেন্স রুটের জন্য, java -Xmx2GB ZombieHordeMin
কৌশলটি কি খুব সুন্দরভাবে চালিত হয়েছে (সতর্ক হওয়া উচিত, এতে কিছুক্ষণ সময় লাগবে)।
কুল ফ্যাক্টয়েড
আকর্ষণীয় মোড়টিতে, 24 টির দৈর্ঘ্যের অনেকগুলি সমাধান রয়েছে এবং আমার সলভার MT0 এর থেকে পৃথক, তবে নীতিগতভাবে অভিন্ন, এটি বাদে সংযুক্ত অন্যান্য ফাঁড়িগুলিতে গিয়ে শুরু করে visiting1
। আকর্ষনীয়! সম্পূর্ণরূপে মানুষের অন্তর্নিহিত পাল্টা, তবে পুরোপুরি বৈধ।
সমাধান হাইলাইটস
সুতরাং এখানে আমার। এটি (আংশিক) গল্ফড, খ / সি এটি ক্ষতিকারক, প্রায়-নিষ্ঠুর-শক্তি সমাধানকারী। আমি একটি আইডিডিএফএস (পুনরাবৃত্তি গভীরতর গভীরতার প্রথম সন্ধান) অ্যালগরিদম ব্যবহার করি, সুতরাং এটি একটি দুর্দান্ত সাধারণ দ্রাবক যা এড়ায় না, তাই এটি ওপি-র প্রশ্নের উভয় অংশই সমাধান করে , যথা:
- যদি একটি বিজয়ী রুট পাওয়া যায় (অসীম জম্বিগুলি), আউটপুট 'এক্স'।
- যদি সমস্ত রুটে মৃত্যুর অবসান হয় (সসীম জম্বিগুলি), তবে নিহত সর্বাধিক সংখ্যক জম্বি আউটপুট দেয়।
এটিকে পর্যাপ্ত শক্তি, স্মৃতি এবং সময় দিন এবং এটি ঠিক এটি করবে, এমনকি ধীর-মৃত্যুর মানচিত্র। আমি এই সমাধানকারীটিকে উন্নত করার জন্য আরও কিছু সময় ব্যয় করেছি এবং আরও কিছু করা যায়, এখন এটি কিছুটা ভাল। আমি সেরা অসীম-জম্বি সমাধান সম্পর্কে এমটি 0 এর পরামর্শকেও সংহত করেছি এবং আমার উইন-চেকার থেকে বেশ কয়েকটি অকালীন অপটিমাইজেশন সরিয়ে নিয়েছি যা পূর্ববর্তী সংস্করণটি এটির সন্ধান থেকে বাধা পেয়েছিল এবং এখন আমি বাস্তবে বর্ণিত একটি এমটি0 এর সাথে খুব মিল খুঁজে পেয়েছি।
আরও কয়েকটি হাইলাইট:
- উল্লিখিত হিসাবে, সংক্ষিপ্ততম বিজয়ী রুটটি খুঁজে পেতে একটি আইডিডিএফএস ব্যবহার করে।
- যেহেতু এটি মূলত একটি ডিএফএস, তাই এটিও আবিষ্কার করবে যে প্রতিটি রুট আমাদের বীরের মৃত্যুর পরে শেষ হয় এবং বেশিরভাগ নিহত জম্বিদের ক্ষেত্রে "সেরা" রুটের খোঁজ রাখে। একজন বীর মরে!
গল্ফিংয়ের উদ্দেশ্যে মুছে ফেলা দেখার বিষয়টি আরও আকর্ষণীয় করার জন্য আমি অ্যালগরিদমটি চালিত করেছি। অসম্পূর্ণ সংস্করণটি দেখতে গিথুব-র একটি লিঙ্ক অনুসরণ করুন।
পাশাপাশি বেশ কয়েকটি মন্তব্য রয়েছে, সুতরাং আমার নিজের পদ্ধতির উপর নিজের সমাধানের বিল্ডিংয়ের জন্য পুনরায় বাস্তবায়নে নির্দ্বিধায় বা বোধ করি এটি কীভাবে করা উচিত!
- মেমরি-অভিযোজিত রুট দ্রুত-ফরওয়ার্ডিং
- উপলব্ধ সিস্টেমের মেমোরি অবধি, "শেষের রুটগুলি" ট্র্যাক করে রাখবে যার ফলস্বরূপ মৃত্যু হয় নি।
- অভিনব রুট সংক্ষেপণ এবং সংক্ষেপণ রুটিন ব্যবহার করে, সমস্ত পূর্ববর্তী পরিদর্শনকৃত রুটগুলি পুনরায় আবিষ্কার রোধ করতে আইডিডিএফএসের পূর্ববর্তী পুনরাবৃত্তি থেকে অগ্রগতি পুনরুদ্ধার করা হয়।
- ইচ্ছাকৃত পার্শ্ব-বোনাস হিসাবে, ডেড-এন্ড রুট কুল হিসাবে কাজ করে। শেষ প্রান্তের রুটগুলি সংরক্ষণ করা হয় না এবং ভবিষ্যতে আইডিডিএফএসের গভীরতায় আর কখনও দেখা হবে না।
সমাধানকারী ইতিহাস
- আমি একগুচ্ছ এক-ধাপের চেহারা-এগিয়ে অ্যালগরিদম চেষ্টা করেছি এবং খুব সাধারণ দৃশ্যের জন্য তারা কাজ করবে, শেষ পর্যন্ত তারা সমতল হয়ে যায়।
- তারপরে আমি দ্বি-পদক্ষেপের চেহারা-এগিয়ে অ্যালগরিদম চেষ্টা করেছি, যা ছিল .. অসন্তুষ্ট।
- আমি তখন একটি এন-স্টেপ লুকোহেড তৈরি করা শুরু করি, যখন আমি বুঝতে পারি যে এই পদ্ধতিটি ডিএফএসে হ্রাসযোগ্য, তবুও ডিএফএস অনেক দূরে ... আরও মার্জিত।
- ডিএফএস তৈরি করার সময়, আমার কাছে এটি ঘটেছিল যে আইডিডিএফএস নিশ্চিত করবে যে (ক) সেরা হিরো (মৃত্যু) রুট বা (খ) প্রথম বিজয়ী চক্রটি সন্ধান করবে।
- উইন-সাইকেল চেকার তৈরি করা সহজ, তবে আমি সফলভাবে পরীক্ষক হিসাবে পৌঁছানোর আগে আমাকে বেশ কয়েকটি খুব ভুল পুনরাবৃত্তি করতে হয়েছিল।
- অ্যালগরিদম এটির কাছে অন্ধ করে দিয়েছে এমন অকাল অপটিমাইজেশনের তিনটি লাইন সরিয়ে ফেলার জন্য এমটি 0 এর বিজয় পথে ফ্যাক্টার্ড।
- আইডিডিএফএস কলগুলির মধ্যে অপ্রয়োজনীয় কাজ পুনরায় করা রোধ করতে আপনার দেওয়া সমস্ত মেমরি ব্যবহার করবে এবং মেমরির সীমা পর্যন্ত মৃত-শেষের পথগুলিও কমাবে এমন একটি অভিযোজিত রুট-ক্যাচিং অ্যালগরিদম যুক্ত করেছে।
(গল্ফড) কোড
কোডটিতে (অসম্পূর্ণ সংস্করণটি এখানে বা এখানে পান ):
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);}}
আমি যে কোনও পরিবর্তনগুলি অনুসরণ করার জন্য গিথুব থেকে কোডটি এখানে পান । আমি ব্যবহার করেছি এমন আরও কিছু মানচিত্র এখানে দেওয়া হল।
আউটপুট উদাহরণ
রেফারেন্স সমাধানের জন্য আউটপুট উদাহরণ:
$ 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-2 এবং অন্যান্য ক্রমবিন্যাসকে "এক পদক্ষেপ" হিসাবে বিবেচনা করুন, যাতে আমরা চক্রের শেষের দিকে আরও দ্রুততর করতে পারি।
- যেমন আপনি যদি নোড 1 এ থাকেন তবে আপনি (ক) 2 তে যেতে পারেন, (খ) 1 তে যেতে পারেন, (গ) এক ধাপ হিসাবে 1-2-2-3 পেরিয়ে যেতে পারেন। এটি কোনও সমাধানকে একটি নির্দিষ্ট গভীরতায় রুটের সংখ্যা বাড়িয়ে দেয় তবে দীর্ঘ চক্রের জন্য সময়-থেকে-সমাধানের ক্ষেত্রে গতি বাড়িয়ে দেয় solved
কুল মৃত রুট। আমার বর্তমান সমাধানটি "মনে রাখতে পারে না" যে কোনও নির্দিষ্ট রুটটি মৃত-সমাপ্ত এবং প্রতিবার এটি পুনরায় আবিষ্কার করতে হবে। মৃত্যুর সুনিশ্চিত একটি পথে প্রথম মুহুর্তের সন্ধান করা আরও ভাল হবে এবং এর আগে কখনও অগ্রগতি হবে না। এটা করেছে...
- সাবধানতা অবলম্বন করলে আপনি সাব-রুট কুল হিসাবে মৃত রুট কুলিং প্রয়োগ করতে পারেন। উদাহরণস্বরূপ, যদি 1-2 -৩-৪ সর্বদা মৃত্যুর ফলস্বরূপ ঘটে এবং সল্ভারটি ১-০-১-২-২-৩-৪ রুটটি পরীক্ষা করতে চলেছে, অবিলম্বে এটি শেষ হওয়ার গ্যারান্টিযুক্ত হিসাবে সেই পথটি অবতরণ করা বন্ধ করা উচিত হতাশায়। এখনও কিছু সতর্কতার সাথে গণিত সহ # খুনের গণনা করা সম্ভব হবে।
অন্য যে কোনও সমাধান যা সময়ের জন্য মেমরির ব্যবসা করে বা মৃত-শেষের পথে অনুসরণ করে আক্রমণাত্মক এড়ানোর অনুমতি দেয়। এটাও!
1
0 টি গোলাবারুদ দিয়ে শুরু করে? গ্রাফ কি অনিচ্ছাকৃত?