প্রাকপম্পটড পাথফাইন্ডিং এখনও প্রাসঙ্গিক?


12

প্রসঙ্গ

ওল্ড লুকাস আর্টস (স্কাম্মভিএম এর যুগ) পয়েন্ট এবং ক্লিক করুন গ্রাফিক অ্যাডভেঞ্চার গেমস প্রাক্টম্পিউটেড পাথফাইন্ডিং ব্যবহৃত। কৌশলটির মোটামুটি রূপরেখা এখানে।

ধাপ 1

প্রতিটি ঘরের মেঝেতে তারা "ওয়াক বাক্স" বলে বিভক্ত ছিল, যা নেভিগেশন জালের নোডের তুলনায় বেশ সমান, তবে ট্র্যাপিজয়েড আকারগুলিতে সীমাবদ্ধ। উদাহরণ:

 ______ _____ _________ _____
\   A  |  B  |    C    |  D   \
 \_____|     |         |_______\
       |_____|         |
             |_________|

ধাপ ২

একটি অফলাইন অ্যালগরিদম (উদাঃ ডিজজস্ট্রা বা এ *) প্রতিটি জোড় নোডের মধ্যে সবচেয়ে সংক্ষিপ্ত পাথ গণনা করে এবং প্রথম দিকের স্টেপটি 2 ডি ম্যাট্রিক্সে সঞ্চয় করে, ব্যবহৃত এবং শুরু করে এবং শেষ নোড দ্বারা প্রতিটি মাত্রায় সূচিযুক্ত হয়। যেমন উপরের ওয়াক বাক্স ব্যবহার করে:

      ___ ___ ___ ___
     | A | B | C | D | <- Start Node
  ___|___|___|___|___|
 | A | A | A | B | C |  ---
 |___|___|___|___|___|     |
 | B | B | B | B | C |     |
 |___|___|___|___|___|     |-- Next node in shortest path
 | C | B | C | C | C |     |   from Start to End
 |___|___|___|___|___|     | 
 | D | B | C | D | D |  ---
 |___|___|___|___|___| 
   ^
   |
End Node

আপনি অনুমান করতে পারেন, নোডের সংখ্যা বাড়ার সাথে সাথে মেমরির প্রয়োজনীয়তাগুলি দ্রুত বৃদ্ধি পায় (এন ^ 2)। যেহেতু একটি সংক্ষিপ্ত সাধারণত ম্যাট্রিক্সে প্রতিটি প্রবেশের জন্য যথেষ্ট পরিমাণে বড় হয়, 300 টি নোডের জটিল মানচিত্রের ফলে অতিরিক্ত স্টোরের ফলস্বরূপ:

300^2 * sizeof(short) = 176 kilobytes

ধাপ 3

অন্যদিকে, দুটি নোডের মধ্যে সংক্ষিপ্ততম পথটি গণনা করা ছিল অত্যন্ত দ্রুত এবং তুচ্ছ, ম্যাট্রিক্সের মধ্যে কেবল অনুসন্ধানের একটি সিরিজ। কিছুটা এইরকম:

// Find shortest path from Start to End
Path = {Start}
Current = Start
WHILE Current != End
    Current = LookUp[Current, End]
    Path.Add(Current)
ENDWHILE

সি থেকে এ ফিরে যাওয়ার সংক্ষিপ্ততম পথটি খুঁজতে এই সাধারণ অ্যালগরিদম প্রয়োগ করা:

1) Path = { C }, Current = C
2) Path = { C, B }, Current = B
3) Path = { C, B, A }, Current = A, Exit

প্রশ্ন

আমি সন্দেহ করছি যে প্রতিটি স্তরের জন্য এটি করার মেমরির প্রয়োজনীয়তার সাথে আজকের শক্তিশালী হার্ডওয়্যার সহ, এই কৌশলটি একবারে যে কোনও সুবিধা পেয়েছিল তা রানটাইমে কেবল একটি * সম্পাদনের মাধ্যমে এখন অপ্রত্যাশিত।

আমি আরও শুনেছি যে আজকাল মেমরির চেহারাগুলি সাধারণ গণনার চেয়েও ধীর হতে পারে, এজন্য সাইন এবং কোসাইন লুক সারণী তৈরি করা এখনকার মতো জনপ্রিয় নয়।

তবে আমি অবশ্যই স্বীকার করব যে আমি নিম্ন-স্তরের হার্ডওয়্যার দক্ষতার এই বিষয়গুলি সম্পর্কে এখনও খুব বেশি জ্ঞানী নই, তাই আমি এই বিষয়টির সাথে আরও পরিচিতদের মতামত জানতে এই সুযোগটি নিচ্ছি।

আমার ইঞ্জিনেও রানটাইমের সময় গ্রাফটিতে নোডগুলি গতিশীলভাবে যুক্ত এবং মুছে ফেলার সক্ষমতা প্রয়োজন (এটি দেখুন ) যাতে পূর্ববর্তী রুটটি কেবল জিনিসগুলিকে আরও জটিল করে তোলে, তাই আমি এটিকে স্ক্র্যাপ করে ফেলেছি (আমার রানটাইম এ * এর সমাধান না করার জন্য ইতিমধ্যে নিখুঁতভাবে চলছিল) )। তবুও, আমি ভাবছিলাম ...

নীচের লাইন, এই কৌশলটি কি আজও কোনও দৃশ্যে প্রাসঙ্গিক?


2
আমি মনে করি আপনি যদি সিপিইউ-এর একটি শক্ত বাজেটে থাকেন তবে এটি এখনও প্রাসঙ্গিক। তবে একবার আপনি গতিশীল পথগুলি চান এটি আর কার্যকর হয় না। বিটিডব্লিউ আমি আপনার এ * অ্যালগোরিদমটি কোথা থেকে পেয়েছি তার দিকে নজর রেখেছিলাম এবং আপনি একটি মিনিহ্যাপ এবং কিছু অন্যান্য কৌশল ব্যবহার করে আরও অপ্টিমাইজ করতে পারেন। আমি সি # তে এ * এর উন্নতি করার কয়েকটি পুনরাবৃত্তি করেছি যা আপনি এখানে দেখতে পারেন: roy-t.nl/index.php/2011/09/24/… দরকারী হতে পারে।
রায় টি।

1
ধন্যবাদ, আমি এটিকে বুকমার্ক করেছি এবং যখন আমি আমার অ্যাপ্লিকেশনটিকে অনুকূলিতকরণ শুরু করব তখন এটি সন্ধান করবে। আমি এরিক লিপার্টের সমাধানটি বেশ কয়েকটি ছোটখাট পরিবর্তন সহ ব্যবহার করেছি কারণ এটি এতটাই পরিষ্কার এবং অনুসরণ করা সহজ ছিল ... এবং আমার সমস্ত পরীক্ষার ক্ষেত্রে এটি "তাত্ক্ষণিকভাবে" দৌড়েছিল তাই আমি এটিকে অপ্টিমাইজ করেও বিরক্ত করি নি।
ডেভিড গাউভিয়া

1
বিটিডাব্লু আপনি যদি পূর্ববর্তীকরণ অনুসরণ করার সিদ্ধান্ত নেন, আপনি ফ্লয়েড-ওয়ারশাল অ্যালগরিদমটি দেখতে চাইতে পারেন । এটি বারবার ডিজকস্ট্র / এ * ব্যবহার করার চেয়ে আরও দক্ষতার সাথে "পরবর্তী পদক্ষেপ" ম্যাট্রিক্স তৈরি করে।
amitp

@ এমআইটিপি টিপটির জন্য ধন্যবাদ, এই বিকল্পগুলি সম্পর্কে জেনে রাখা ভাল always যদিও, যেহেতু বেশিরভাগ ক্ষেত্রে পূর্বসীমা অফলাইনে করা হবে, এটিকে আরও দক্ষ করে তোলা থেকে তেমন লাভ করার কিছু নেই। যদি না আপনি সত্যিই অধৈর্য হয়ে থাকেন। :-)
ডেভিড গওভিয়া

সম্মত হয়েছেন, যদিও ফ্লোয়েড-ওয়ারশাল ডিজকস্ট্রার অ্যালগরিদমের চেয়ে বাস্তবায়ন করাও অনেক সহজ, সুতরাং আপনার যদি ইতিমধ্যে ডিজকস্ট্রার প্রয়োগ না করা হয় তবে তা দেখার মতো নয় :)
amitp

উত্তর:


3

আমার ইঞ্জিনেও রানটাইমের সময় গ্রাফটিতে নোডগুলি গতিশীলভাবে যুক্ত এবং মুছে ফেলার সক্ষমতা প্রয়োজন (এটি দেখুন) যাতে পূর্ববর্তী রুটটি কেবল জিনিসগুলিকে আরও জটিল করে তোলে, তাই আমি এটিকে স্ক্র্যাপ করে ফেলেছি (আমার রানটাইম এ * এর সমাধান না করার জন্য ইতিমধ্যে নিখুঁতভাবে চলছিল) )। তবুও, আমি ভাবছিলাম ...

নীচের লাইন, এই কৌশলটি কি আজও কোনও দৃশ্যে প্রাসঙ্গিক?

এ জাতীয় কৌশল ব্যবহার করে আমি কোনও লাভ দেখতে পাচ্ছি না।

আমার কোনও গ্রাফের নমনীয়তা নেই (আপনার আলাদা আলাদা এলওডি থাকতে পারে, তাদের কোনও নির্দিষ্ট আকার হতে হবে না, ইত্যাদি ...)। এছাড়াও আপনার ইঞ্জিনের যে কোনও ব্যবহারকারী কোনও গ্রাফ কী এবং কীভাবে এটি ব্যবহার করবেন তা জানতে যাচ্ছেন going সুতরাং যদি তারা অতিরিক্ত কার্যকারিতা যুক্ত করতে চান তবে তাদের কাছে সম্পূর্ণরূপে একটি অভিনব পরিস্থিতি ব্যবহার করে কীভাবে তাদের সম্প্রসারণ বাস্তবায়ন করতে হবে তা শিখতে হবে।

আপনি যেমন উল্লেখ করেছেন দেখে মনে হচ্ছে এটি মারাত্মক আকারে স্কেল হবে। এছাড়াও এটি লক্ষণীয় যে যদি কোনও গ্রাফ নগদ হিসাবে ফিট করে এবং আপনি আপনার সমস্ত পথের অনুসন্ধানগুলি পিছনে পিছনে চালিত করেন তবে এটি সত্যই IO সময়কে হ্রাস করবে। দেখে মনে হচ্ছে আপনার বাস্তবায়ন শীঘ্রই কোনও ক্যাশে ফিট করার জন্য খুব বড় হয়ে উঠবে।

আমি আরও শুনেছি যে আজকাল মেমরির চেহারাগুলি সাধারণ গণনার চেয়েও ধীর হতে পারে, এজন্য সাইন এবং কোসাইন লুক সারণী তৈরি করা এখনকার মতো জনপ্রিয় নয়।

আপনি যদি আপনার সমস্ত প্রোগ্রাম এবং এর প্রয়োজনীয় মেমরিটিকে ক্যাশে ফিট করতে না পারেন তবে প্রসেসরের বোতলের আগে বোতল ঘুরিয়ে জিনিসগুলি মেমরির পথে টেনে আনতে বাটলে যাবেন।

আমি সন্দেহ করছি যে প্রতিটি স্তরের জন্য এটি করার মেমরির প্রয়োজনীয়তার সাথে আজকের শক্তিশালী হার্ডওয়্যার সহ, এই কৌশলটি একবারে যে কোনও সুবিধা পেয়েছিল তা রানটাইমের সময় কেবল একটি * সম্পাদন করে আউটাইটাইটেড হয়

আরও উপলব্ধি করুন যে অনেকগুলি গেমের এআই আপডেট করার জন্য পৃথক লুপ রয়েছে। আমি বিশ্বাস করি যে তিনি আমার প্রকল্পটি সেট আপ করেছেন তা হ'ল 60 ইঞ্চি হার্জে ব্যবহারকারী ইনপুটটির জন্য একটি আপডেট লুপ রয়েছে, এআই মাত্র 20hz এবং গেমগুলি যত তাড়াতাড়ি সম্ভব টানতে পারে।

পাশাপাশি সাইড নোট হিসাবে আমি কিছু মজাদার জন্য কিছু জিবিএ প্রোগ্রামিং করেছি এবং একটি আধুনিক ডিভাইস ব্যবহার করে কোনও স্থানান্তর কিছুই করি নি। জিবিএর জন্য সমস্ত কিছু ছিল প্রসেসরের কাজের চাপকে হ্রাস করার বিষয়ে (কারণ এটি করুণাময় ছিল)। আপনাকে আরও বুঝতে হবে যে বেশিরভাগ উচ্চ স্তরের ভাষা সি # এবং জাভা (এত বেশি সি ++ বা সি নয়) আপনার জন্য প্রচুর পরিমাণে অনুকূলিতকরণ করে। আপনার কোডটি অপ্টিমাইজ করার জন্য অ্যাক্সেস মেমোরি যতটা সম্ভব অল্প অল্প অল্প অল্প অল্প অল্প অল্প অল্প অল্প মাত্রা রয়েছে এবং যখন আপনি নতুন স্মৃতি আনার আগে এটিতে যতগুলি গণনা চালাবেন এটি ক্যাশে থেকে বেরিয়ে আসবে এবং আপনি নিশ্চিত হয়ে নিন শুধুমাত্র একবার জিনিস করা।

সম্পাদনা করুন: আপনার শিরোনামের উত্তর দিতে হ্যাঁ এটি। ঘন ঘন ব্যবহৃত পাথ প্রাক্পুট করা একটি দুর্দান্ত ধারণা এবং এটি আপনার গেম লুপের বাইরে যে কোনও জায়গায় করা যেতে পারে। উদাহরণস্বরূপ আপনার কাছ থেকে কোনও আরটিএসে কোনও সংস্থার ভিত্তি তৈরি করুন যাতে জড়ো হওয়া লোকেরা যতবার তারা ছুটি বা ফেরত চায় প্রতিবার পুনরায় গণনা করতে না পারে।


আপনার সম্পাদনা সম্পর্কে, আমি সত্যিই প্রায়শই ব্যবহৃত পাথের পূর্বনির্মাণের কথা বলছিলাম না, তবে প্রতিটি একক সম্ভাব্য পথকে পূর্বনির্মাণের কৌশল সম্পর্কে কঠোরভাবে বলছিলাম । আপনার উত্তরটির বেশিরভাগ উত্তর পূর্ববর্তী প্যাথফাইন্ডিং ব্যবহারের বিরুদ্ধে কীভাবে হয়েছিল তা সম্পর্কে আমিও কিছুটা বিভ্রান্ত, তবে তারপরে আপনি শেষে বলেছিলেন যে এটি একটি দুর্দান্ত ধারণা হবে। সুতরাং, এটি কোনও জিপিএর মতো সিপিইউ-রোধকৃত পরিবেশে কার্যকর হবে?
ডেভিড গাউভিয়া

1
আমার খারাপ আমি এটি উল্লেখ করার চেষ্টা করছিলাম যে প্রসঙ্গে আপনার শিরোনামের উত্তর হ্যাঁ। আপনার প্রশ্নের বর্ণিত নির্দিষ্ট অ্যালগরিদমের সাথে সম্পর্কিত উত্তরটি হ'ল না। সুতরাং সংক্ষিপ্তভাবে সমস্ত সম্ভাব্য পথকে খারাপ ধারণা দেওয়া হলেও কয়েকটি খুব ঘন ঘন ব্যবহৃত পাথের পূর্বনির্ধারণ করা ভাল ধারণা হতে পারে।
ক্লাসিকথান্ডার

2
@ ক্লাসিকথান্ডার: কয়েকটি ল্যান্ডমার্ক থেকে সমস্ত পাথ প্রাক-কম্পিউটিংয়ের এই কৌশলটি প্রায়শই ALT হিসাবে পরিচিত : ল্যান্ডমার্কস এবং ত্রিভুজ-অসমতা সহ একটি তারকা : cs.princeton.edu/courses/archive/spr06/cos423/Handouts/GW05। পিডিএফ
পিটার জেরকেনস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.