আমি যে * প্যাথফাইন্ডিংয়ের কাজ করে সেটিকে একটি মৌলিক স্তরে বুঝতে চাই। যে কোনও কোড বা psuedo- কোড বাস্তবায়ন পাশাপাশি ভিজ্যুয়ালাইজেশন সহায়ক হবে।
আমি যে * প্যাথফাইন্ডিংয়ের কাজ করে সেটিকে একটি মৌলিক স্তরে বুঝতে চাই। যে কোনও কোড বা psuedo- কোড বাস্তবায়ন পাশাপাশি ভিজ্যুয়ালাইজেশন সহায়ক হবে।
উত্তর:
অনলাইনে পাওয়া যাবে এ * এর প্রচুর কোড-উদাহরণ এবং ব্যাখ্যা। এই প্রশ্নটি প্রচুর দরকারী লিঙ্ক সহ প্রচুর দুর্দান্ত উত্তর পেয়েছে। আমার উত্তরে আমি অ্যালগরিদমের একটি সচিত্র উদাহরণ দেওয়ার চেষ্টা করব, যা কোড বা বর্ণনার চেয়ে বোঝা সহজ হতে পারে।
এ * বোঝার জন্য, আমি আপনাকে প্রথমে ডিজকস্ট্রার অ্যালগরিদমটি একবার দেখে নেওয়ার পরামর্শ দিই । ডিজকস্ট্রার অ্যালগরিদম অনুসন্ধানের জন্য যে পদক্ষেপগুলি করবে সে সম্পর্কে আপনাকে গাইড করতে দাও।
আমাদের স্টার্ট নোড A
এবং আমরা সবচেয়ে সংক্ষিপ্ততম পথটি খুঁজতে চাই F
। গ্রাফের প্রতিটি প্রান্তের সাথে চলাচলের ব্যয় যুক্ত রয়েছে (প্রান্তগুলির পাশে কালো অঙ্ক হিসাবে চিহ্নিত)। আমাদের লক্ষ্যটি হ'ল গ্রাফের প্রতিটি ভার্টেক্স (বা নোড) এর সর্বনিম্ন ভ্রমণ ব্যয়ের মূল্যায়ন করা যতক্ষণ না আমরা আমাদের লক্ষ্য নোডকে আঘাত করি।
এটি আমাদের সূচনার পয়েন্ট। আমাদের পরীক্ষা করার জন্য একটি তালিকা নোড রয়েছে, এই তালিকাটি বর্তমানে:
{ A(0) }
A
এর ব্যয় হয়েছে 0
, অন্যান্য সমস্ত নোডগুলি অনন্ততে সেট করা আছে (একটি সাধারণ বাস্তবায়নে এটি এমন int.MAX_VALUE
বা অনুরূপ কিছু হবে )।
আমরা আমাদের নোডের তালিকা থেকে সর্বনিম্ন ব্যয়ের সাথে নোডটি নিই (যেহেতু আমাদের তালিকায় কেবল এটি রয়েছে A
, এটি আমাদের প্রার্থী) এবং এর সমস্ত প্রতিবেশী ঘুরে দেখি। আমরা প্রতি প্রতিবেশীর ব্যয় নির্ধারণ করেছি :
Cost_of_Edge + Cost_of_previous_Node
এবং পূর্ববর্তী নোডের ট্র্যাক রাখুন (নোডের নীচে ছোট গোলাপী বর্ণ হিসাবে দেখানো হয়েছে)। A
এখনই সমাধান (লাল) হিসাবে চিহ্নিত করা যেতে পারে, যাতে আমরা এটি আবার দেখতে না। আমাদের প্রার্থীদের তালিকাটি এখন এমন দেখাচ্ছে:
{ B(2), D(3), C(4) }
আবার, আমরা আমাদের তালিকা ( B
) থেকে সর্বনিম্ন ব্যয়ের সাথে নোড নিয়েছি এবং এর প্রতিবেশীদের মূল্যায়ন করি। পাথটি D
বর্তমান ব্যয়ের চেয়ে ব্যয়বহুল D
, সুতরাং এই পথটি ফেলে দেওয়া যেতে পারে। E
আমাদের প্রার্থীদের তালিকায় যোগ করা হবে, যা এখন দেখায়:
{ D(3), C(4), E(4) }
পরের নোড এখন পরীক্ষা করা হয় D
। সংযোগটি C
বাতিল করা যেতে পারে, কারণ পথটি বর্তমানে ব্যয় ব্যতির চেয়ে কম নয় । E
যদিও আমরা একটি আরও ছোট পথ খুঁজে পেয়েছি, সুতরাং এর জন্য ব্যয় E
এবং এর আগের নোড আপডেট করা হবে। আমাদের তালিকাটি এখন এটির মতো দেখাচ্ছে:
{ E(3), C(4) }
আমরা যেমনটি আগে করেছি, আমরা আমাদের তালিকা থেকে সর্বনিম্ন ব্যয়ের সাথে নোড পরীক্ষা করি, যা এখন E
। E
কেবলমাত্র একটি অমীমাংসিত প্রতিবেশী রয়েছে, এটি লক্ষ্য নোডও। লক্ষ্য নোডে পৌঁছানোর ব্যয়টি সেট করা হয় 10
এবং এর আগের নোডটি সেট করা হয় E
। আমাদের প্রার্থীদের তালিকাটি এখন এমন দেখাচ্ছে:
{ C(4), F(10) }
পরবর্তী আমরা পরীক্ষা করি C
। আমরা এর জন্য ব্যয় এবং পূর্ববর্তী নোড আপডেট করতে পারি F
। যেহেতু আমাদের তালিকার এখন F
সর্বনিম্ন ব্যয়ের সাথে নোড রয়েছে, তাই আমরা সম্পন্ন করেছি। আমাদের সংক্ষিপ্ততম নোডগুলি ব্যাকট্র্যাক করে আমাদের পথটি তৈরি করা যেতে পারে।
সুতরাং আপনি ভাবতে পারেন যে আমি কেন * অ্যালগোরিদমের পরিবর্তে আপনাকে ডিজজস্ট্রাকে ব্যাখ্যা করেছি ? ঠিক আছে, কেবলমাত্র পার্থক্য হ'ল আপনি কীভাবে আপনার প্রার্থীদের ওজন করবেন (বা বাছাই করুন)। ডিজকস্ট্রার সাথে এটি:
Cost_of_Edge + Cost_of_previous_Node
এ * এর সাথে এটি:
Cost_of_Edge + Cost_of_previous_Node + Estimated_Cost_to_reach_Target_from(Node)
যেখানে Estimated_Cost_to_reach_Target_from
সাধারণত হিউরিস্টিক ফাংশন বলা হয়। এটি এমন একটি ফাংশন যা লক্ষ্য নোডে পৌঁছানোর জন্য ব্যয়টি অনুমান করার চেষ্টা করবে। একটি ভাল হিউরিস্টিক ফাংশন অর্জন করবে যে লক্ষ্যটি খুঁজে পেতে কম নোডের পরিদর্শন করতে হবে। যদিও ডিজকস্ট্রার অ্যালগরিদম সর্বত্র প্রসারিত হবে, তবে এ * (হিউরিস্টিককে ধন্যবাদ) লক্ষ্যটির দিকে অনুসন্ধান করবে।
হিউরিস্টিক্স সম্পর্কে অমিতের পৃষ্ঠাতে সাধারণ হিউরিস্টিক্স সম্পর্কে ভাল ধারণা রয়েছে।
একটি * পাথ সন্ধান একটি সেরা-প্রথম ধরণের অনুসন্ধান যা অতিরিক্ত হিউরিস্টিক ব্যবহার করে।
আপনাকে প্রথমে যা করতে হবে তা হ'ল আপনার অনুসন্ধানের অঞ্চলটি ভাগ করে নেওয়া। এই ব্যাখ্যার জন্য মানচিত্রটি টাইলগুলির একটি বর্গাকার গ্রিড, কারণ বেশিরভাগ 2 ডি গেমগুলি টাইলগুলির একটি গ্রিড ব্যবহার করে এবং কারণ এটি কল্পনা করা সহজ। তবে খেয়াল করুন যে অনুসন্ধানের অঞ্চলটি আপনি যেভাবে চান তা ভাঙ্গতে পারে: একটি হেক্স গ্রিড সম্ভবত, বা ঝুঁকির মতো স্বেচ্ছাসেবী আকারগুলিও। বিভিন্ন মানচিত্রের অবস্থানগুলিকে "নোডস" হিসাবে উল্লেখ করা হয় এবং এই অ্যালগরিদম যে কোনও সময় আপনার কাছে ট্র্যাভার্স করার জন্য একগুচ্ছ নোডের সাথে কাজ করবে এবং নোডগুলির মধ্যে সংযোগ সংজ্ঞায়িত হবে।
যাইহোক, একটি প্রদত্ত টাইল শুরু করে:
প্রারম্ভিক টাইলের চারদিকে 8 টি টাইলগুলি "স্কোর" করা হয় ক এর উপর ভিত্তি করে) বর্তমান টাইল থেকে পরবর্তী টাইলের দিকে যাওয়ার ব্যয় (সাধারণত অনুভূমিক বা উল্লম্ব আন্দোলনের জন্য 1, বর্গাকার (2) তির্যক আন্দোলনের জন্য)।
তারপরে প্রতিটি টাইলকে অতিরিক্ত "হিউরিস্টিক" স্কোর দেওয়া হয় - প্রতিটি টালিগুলিতে যাওয়ার জন্য আপেক্ষিক মূল্যের একটি অনুমান। বিভিন্ন হিউরিস্টিকস ব্যবহার করা হয়, প্রদত্ত টাইল এবং শেষ টাইলের কেন্দ্রগুলির মধ্যে সরল-লাইন দূরত্ব সবচেয়ে সহজ।
তারপরে বর্তমান টাইলটি "বন্ধ" হয়ে গেছে এবং এজেন্টটি প্রতিবেশী টাইলের দিকে চলে যা খোলা, সর্বনিম্ন চলাচল স্কোর এবং সর্বনিম্ন হিউরিস্টিক স্কোর রয়েছে।
লক্ষ্য নোড না পৌঁছানো পর্যন্ত এই প্রক্রিয়াটি পুনরাবৃত্তি করা হয়, বা আর কোনও খোলা নোড নেই (যার অর্থ এজেন্ট অবরুদ্ধ রয়েছে)।
এই পদক্ষেপগুলি চিত্রিত চিত্রগুলির জন্য, এই ভাল শিক্ষানবিশ টিউটোরিয়ালটি পড়ুন ।
মূলত হিউরিস্টিক উন্নতিতে কিছু উন্নতি করা যেতে পারে:
ভূখণ্ডের পার্থক্য, রুক্ষতা, খাড়া হওয়া ইত্যাদি বিবেচনায় নেওয়া
কোনও কোনও কার্যকর পথ নয় এমন মানচিত্রের অংশগুলি ব্লক করতে গ্রিড জুড়ে "ঝাড়ু" ব্যবহার করা কখনও কখনও কার্যকর: উদাহরণস্বরূপ এজেন্টের মুখোমুখি একটি ইউ আকার। কোনও সুইপ পরীক্ষা ছাড়াই এজেন্ট প্রথমে ইউ তে প্রবেশ করত, ঘুরে দাঁড়াত, তারপরে ছেড়ে ইউ এর প্রান্তে ঘুরে যেত। "সত্যিকারের" বুদ্ধিমান এজেন্ট ইউ আকৃতির ফাঁদটি নোট করে কেবল এড়াতে পারে। স্যুইপিং এটিকে অনুকরণে সহায়তা করতে পারে।
এটি সেরা থেকে অনেক দূরে, তবে এটি কয়েক বছর আগে সি ++ এ আমি * এর কাজটি করেছি ।
পুরো অ্যালগরিদমকে ব্যাখ্যা করার চেষ্টা করার চেয়ে আমি আপনাকে উত্সগুলিতে দেখিয়েছি এটি আরও ভাল। এছাড়াও, আপনি যেমন উইকি নিবন্ধটি পড়েছেন, ডেমো দিয়ে খেলুন এবং দেখুন কীভাবে এটি কাজ করছে তা ভিজ্যুয়ালাইজ করতে পারেন কিনা। আপনার একটি নির্দিষ্ট প্রশ্ন থাকলে একটি মন্তব্য দিন।
আপনি পাথ ফাইন্ডিং এ অ্যাক্টিভুট সম্পর্কিত নিবন্ধটি পেতে পারেন । এটি এ * এবং ডিজকস্ট্রার অ্যালগোরিদম এবং তাদের মধ্যে পার্থক্য উভয়ের উপরে চলে যায়। এটি ফ্ল্যাশ বিকাশকারীদের দিকে আগ্রহী, তবে আপনি ফ্ল্যাশ ব্যবহার না করলেও এটি তত্ত্ব সম্পর্কে কিছুটা ভাল অন্তর্দৃষ্টি প্রদান করা উচিত should
এ * এবং ডিজকস্ট্রার অ্যালগোরিদমের সাথে ডিল করার সময় একটি বিষয় যা কল্পনা করা গুরুত্বপূর্ণ তা হ'ল এ * নির্দেশিত; এটি কোন দিকটি দেখার জন্য "অনুমান" করে কোনও নির্দিষ্ট পয়েন্টের সবচেয়ে সংক্ষিপ্ত পথটি সন্ধান করার চেষ্টা করে। ডিজকস্ট্রার অ্যালগরিদম / প্রতি / পয়েন্টের সবচেয়ে সংক্ষিপ্ত পথ খুঁজে পায়।
সুতরাং ঠিক প্রথম বিবৃতি হিসাবে, এ * একটি গ্রাফ অন্বেষণের অ্যালগরিদমকে কেন্দ্র করে। সাধারণত গেমগুলিতে আমরা হয় টাইলস বা অন্যান্য বিশ্বের জ্যামিতি গ্রাফ হিসাবে ব্যবহার করি তবে আপনি অন্যান্য জিনিসগুলির জন্য এ * ব্যবহার করতে পারেন। গ্রাফ ট্র্যাভারসালের জন্য দুটি উর-অ্যালগরিদম গভীরতা-প্রথম-অনুসন্ধান এবং প্রস্থ-প্রথম-অনুসন্ধান। ডিএফএসে আপনি সর্বদা বর্তমান নোডের ভাইবোনদের দিকে তাকানোর আগে আপনার বর্তমান শাখাটি সম্পূর্ণরূপে অন্বেষণ করুন এবং বিএফএসে আপনি সর্বদা প্রথমে এবং তারপরে বাচ্চাদের দিকে নজর দিন। আপনি যখন কাঙ্ক্ষিত লক্ষ্যের কাছাকাছি পৌঁছে যাচ্ছেন তখন একটি * এইগুলির মধ্যে একটি মাঝারি স্থলটি খুঁজে পাওয়ার চেষ্টা করে যেখানে আপনি কোনও শাখাটি নিখরচায় করেন (সুতরাং আরও ডিএফএসের মতো) তবে কখনও কখনও থামুন এবং কোনও ভাইবোন চেষ্টা করুন যদি এর শাখায় আরও ভাল ফলাফল হতে পারে। আসল গণিত হ'ল আপনি সম্ভাব্য নোডের একটি তালিকা রেখেছিলেন যেখানে অন্বেষণ করতে প্রতিটি যেখানে "সদর্থকতা" রয়েছে স্কোরটি ইঙ্গিত করে যে এটি কোনও ধরণের (বিমূর্ত অর্থে) এটি লক্ষ্যটির নিকট, কম স্কোরগুলি আরও ভাল হচ্ছে (0 এর অর্থ আপনি লক্ষ্যটি পেয়েছেন)। আপনি স্কোরের সর্বনিম্ন প্লাসটি মূল থেকে দূরে নোডের সংখ্যা (যা সাধারণত বর্তমান কনফিগারেশন, বা পাথফাইন্ডিংয়ের বর্তমান অবস্থান) দ্বারা পরবর্তী কোনটি ব্যবহার করবেন তা নির্বাচন করুন। প্রতিবার আপনি কোনও নোড অন্বেষণ করলে আপনি তার সমস্ত শিশুকে এই তালিকায় যুক্ত করুন এবং তারপরে নতুন সেরাটিকে বেছে নিন।
বিমূর্ত স্তরে, এ * এটির মতো কাজ করে: