গন্তব্য দুর্গম হলে আমি কীভাবে এ * সমাপ্তিকে আরও দ্রুত করতে পারি?


31

আমি একটি সাধারণ টাইল-ভিত্তিক 2 ডি গেম তৈরি করছি, যা এ * ("একটি তারা") পাথফাইন্ডিং অ্যালগরিদম ব্যবহার করে। আমি সব ঠিকঠাক কাজ করেছি, তবে অনুসন্ধানে আমার একটি পারফরম্যান্স সমস্যা আছে। সোজা কথায়, যখন আমি কোনও দুর্গম টাইল ক্লিক করি তখন অ্যালগরিদম দৃশ্যত পুরো মানচিত্রের মধ্য দিয়ে দুর্গম টাইলের কোনও রাস্তা খুঁজে পায় goes এমনকি আমি যদি তার পাশে দাঁড়িয়ে থাকিও।

আমি কীভাবে এটিকে অবরুদ্ধ করতে পারি? আমার ধারণা আমি স্ক্রিন এরিয়াতে পাথ ফাইন্ডিং হ্রাস করতে পারি, তবে সম্ভবত আমি এখানে কিছু স্পষ্ট অনুপস্থিত?


2
আপনি কি জানেন যে কোন টাইলগুলি দুর্গম হয় বা আপনি কেবল এস্টার অ্যালগরিদমের ফলাফল হিসাবে এটি জানেন?
ব্যবহারকারীর ব্যবহারকারীর

আপনি কীভাবে আপনার নেভিগেশন গ্রাফ সংরক্ষণ করছেন?
আঙ্কো

আপনি যদি তালিকায় ট্র্যাভার্সড নোডগুলি সংরক্ষণ করে থাকেন তবে আপনি গতি উন্নত করতে বাইনারি হ্যাপ ব্যবহার করতে চাইতে পারেন।
ChrisC

যদি এটি খুব ধীর হয় তবে আমার কাছে ধারাবাহিকভাবে অপ্টিমাইজেশন প্রস্তাব করার জন্য রয়েছে - বা আপনি কী অনুসন্ধানগুলি পুরোপুরি এড়াতে চাইছেন?
স্টিভেন

1
এই প্রশ্নটি সম্ভবত কম্পিউটার সায়েন্সের পক্ষে আরও ভাল উপযোগী হত ।
রাফেল

উত্তর:


45

অনুসন্ধানগুলি এড়ানোর বিষয়ে কিছু ধারণা যা ফলশ্রুতিতে ব্যর্থ পথে ডেকে আনে:

আইল্যান্ড আইডি

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

উপরের আবদ্ধ সীমাবদ্ধ

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

আপনি যা সন্ধান করছেন তা যদি এটি খুব বেশি সময় নিচ্ছে তবে নিম্নলিখিত কৌশলগুলি দরকারী:

এটিকে অ্যাসিক্রোনাস এবং সীমাবদ্ধকরণের করুন

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

সঠিক তথ্য কাঠামো চয়ন করুন

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

আপনি যা পারেন ক্যাশে

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

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

শুভকামনা, এবং আপনি কী খুঁজে পান তা আমাদের জানান।


বিভিন্ন নিয়ম সহ যদি বিভিন্ন এজেন্ট থাকে তবে খুব বেশি না হয় তবে এজেন্ট শ্রেণিতে প্রতি আইডির ভেক্টর ব্যবহার করে এটি এখনও যথেষ্ট দক্ষতার সাথে সাধারণ করা যেতে পারে।
এমসাল্টাররা

4
+1 এই সমস্যাটি সম্ভবত ব্যারিয়ারড-অফ অঞ্চলগুলি (কেবল দুর্গম টাইলস নয়) এবং এই জাতীয় সমস্যাটি প্রারম্ভিক লোড-টাইম গণনার মাধ্যমে আরও সহজে সমাধান করা যেতে পারে তা স্বীকৃতি দেওয়ার জন্য।
স্লিপ ডি থম্পসন

প্রতিটি এলাকা বন্যা পূরণ বা বিএফএস।
উলফডন

দ্বীপ আইডি স্থিতিশীল হওয়ার প্রয়োজন নেই। একটি সাধারণ অ্যালগরিদম রয়েছে যা দুটি পৃথক দ্বীপে যোগ দিতে সক্ষম হওয়ার প্রয়োজন হলে উপযুক্ত হবে তবে এটি পরে কোনও দ্বীপকে বিভক্ত করতে পারে না। এই স্লাইডগুলিতে পৃষ্ঠা 8 থেকে 20 এর মধ্যে সেই নির্দিষ্ট অ্যালগরিদমটি ব্যাখ্যা করা হয়েছে: cs.columbia.edu/~bert/courses/3137/Lecture22.pdf
ক্যাস্পার্ড

@ ক্যাস্পার্ড অবশ্যই দ্বীপ আইডিকে পুনরায় গণনা করা, রানটাইমের সময় একীভূত করা থেকে বিরত কিছু নেই। মুল বক্তব্যটি হ'ল দ্বীপ আইডস আপনাকে আস্তর অনুসন্ধান না করে দ্রুত দুটি নোডের মধ্যে কোনও পথ উপস্থিত রয়েছে কিনা তা নিশ্চিত করার অনুমতি দেয়।
স্টিভেন

26

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

এটি প্রশমিত করার উপায়:

  • যদি আপনি কোনও অগ্রাধিকার জানেন যে কোনও নোড অ্যাক্সেসযোগ্য নয় (যেমন এটির কোনও প্রতিবেশী নেই বা এটি চিহ্নিত রয়েছে UnPassable) তবে No Pathকখনই আসতারকে ফোন না করে ফিরে আসুন।

  • নোডের সংখ্যা সীমাবদ্ধ করুন সমাপ্তির আগে অস্টার প্রসারিত হবে। খোলা সেট পরীক্ষা করুন। এটি যদি কখনও খুব বড় হয়ে যায়, সমাপ্ত করে ফিরে আসুন No Path। তবে এটি আষ্টারের সম্পূর্ণতা সীমাবদ্ধ করবে; সুতরাং এটি কেবলমাত্র সর্বোচ্চ দৈর্ঘ্যের পাথ পরিকল্পনা করতে পারে।

  • আসতার কোনও পথ খুঁজে পেতে সময় সীমাবদ্ধ করুন । যদি এটি সময়ের বাইরে চলে যায় তবে প্রস্থান করুন এবং ফিরে আসুন No Path। এটি পূর্ববর্তী কৌশলটির মতো সম্পূর্ণতা সীমাবদ্ধ করে তবে কম্পিউটারের গতির সাথে স্কেল করে। নোট করুন যে অনেক গেমের জন্য এটি অনাকাঙ্ক্ষিত, কারণ দ্রুত বা ধীর কম্পিউটারের খেলোয়াড়রা গেমটি ভিন্নভাবে উপভোগ করতে পারে।


13
আমি উল্লেখ করতে চাই যে সিপিইউ গতির উপর নির্ভর করে আপনার গেমের যান্ত্রিকগুলি পরিবর্তন করা (হ্যাঁ, রুট ফাইন্ডিং একটি গেম মেকানিক) একটি খারাপ ধারণা হতে পারে কারণ এটি গেমটি বেশ অনুমানযোগ্য এবং কিছু ক্ষেত্রে এমনকি খেলতে পারা যায় না can এখন থেকে 10 বছর পর কম্পিউটারে। সুতরাং আমি বরং CPU সময়ের চেয়ে ওপেন সেটটি ক্যাপ করে এ * সীমাবদ্ধ করার পরামর্শ দেব recommend
ফিলিপ

@Philipp। এটি প্রতিফলিত করার জন্য উত্তরটি পরিবর্তন করে।
mklingen

1
নোট করুন যে আপনি প্রদত্ত গ্রাফের জন্য দুটি নোডের মধ্যে সর্বাধিক দূরত্ব নির্ধারণ করতে পারেন (যুক্তিসঙ্গত দক্ষ, ও (নোড))। এটি দীর্ঘতম পাথ সমস্যা এবং এটি আপনাকে নোডের সংখ্যা পরীক্ষা করার জন্য একটি সঠিক উপরের বাউন্ড সরবরাহ করে।
এমসাল্টাররা

2
@ এসএমএলটার্স ও (এন) এ আপনি কীভাবে তা করেন? এবং 'যুক্তিসঙ্গত দক্ষ' কী? এটি যদি কেবল জোড়া নোডের জন্য হয় তবে আপনি কেবল ডুপ্লিকেটিংয়ের কাজ করছেন না?
স্টিভেন

উইকিপিডিয়া অনুসারে, দীর্ঘতম পথের সমস্যাটি এনপি-হার্ড, দুর্ভাগ্যক্রমে।
21

21
  1. লক্ষ্য নোড থেকে একই সময়ে একই লুপে একটি দ্বৈত A * অনুসন্ধান চালান এবং কোনওটি অবিশ্বাস্যর সন্ধান পাওয়া মাত্রই উভয় অনুসন্ধান বাতিল করে দিন

যদি লক্ষ্যটির চারপাশে কেবল 6 টি টাইল অ্যাক্সেসযোগ্য থাকে এবং মূলটিতে 1002 টাইল অ্যাক্সেসযোগ্য থাকে তবে অনুসন্ধান 6 (দ্বৈত) পুনরাবৃত্তিতে থামবে at

যত তাড়াতাড়ি একটি অনুসন্ধান অন্যটির পরিদর্শন করা নোডগুলি খুঁজে পায় আপনি অনুসন্ধানের সুযোগটি অন্যের পরিদর্শন করা নোডগুলিতেও সীমাবদ্ধ করতে এবং দ্রুত শেষ করতে পারেন।


2
দ্বি-নির্দেশমূলক এ-স্টার অনুসন্ধান কার্যকর করার চেয়ে আরও বেশি কিছু রয়েছে যা আপনার বক্তব্য দ্বারা বোঝানো হয়েছে, তবুও এই পরিস্থিতিতে এই যে .তিহাসিকভাবে বৈজ্ঞানিকভাবে গ্রহণযোগ্যতা রয়েছে ifying (লিংক: homepages.dcc.ufmg.br/~chaimo/public/ENIA11.pdf )
পিটার Geerkens

4
@ স্টাফেনহোকেনহুল: অসমীয়াত ব্যয় সহ ভূখণ্ডের মানচিত্রে একটি দ্বি-নির্দেশমূলক এ- * কার্যকর করার পরে, আমি আপনাকে আশ্বাস দিচ্ছি যে একাডেমিক ব্লা-ব্লাহ উপেক্ষা করার ফলে ত্রুটিযুক্ত পথ নির্বাচন এবং ভুল ব্যয়ের গণনা হবে।
পিটার জেরকেনস

1
@ মুভিংডাক: মোট নোডের সংখ্যা অপরিবর্তিত রয়েছে এবং প্রতিটি নোডটি কেবল একবার একবার পরিদর্শন করা হবে, সুতরাং মানচিত্রটি অর্ধেকের মধ্যে বিভক্ত হওয়ার সবচেয়ে খারাপ পরিস্থিতি দিকনির্দেশক এ- * এর মতো।
পিটার জেরকেনস

1
@ পিটারজির্কেন্স: ক্লাসিক এ * তে, কেবলমাত্র অর্ধেকটি নোড পৌঁছানো যায় এবং এইভাবে দেখা হয়। যদি মানচিত্রটি অর্ধেক অংশে বিভক্ত হয়ে যায়, তবে আপনি যখন দ্বিপাক্ষিকভাবে অনুসন্ধান করেন, আপনি প্রতিটি নোডটি স্পর্শ করেন (প্রায়)। অবশ্যই অবশ্যই একটি প্রান্তের মামলা
মাকিং হাঁস

1
@ মুভিংডাক: আমি ভুল কথা বলেছি; সবচেয়ে খারাপ ক্ষেত্রে বিভিন্ন গ্রাফ হয় তবে একই আচরণ হয় - একতরফা জন্য সবচেয়ে খারাপ ক্ষেত্রে একটি সম্পূর্ণ বিচ্ছিন্ন গোল-নোড, সমস্ত নোড পরিদর্শন করা প্রয়োজন।
পিটার জেরকেনস

12

বিষয়টি ধরে নিলে গন্তব্য পৌঁছনো যায় না। এবং যে নেভিগেশন জাল গতিশীল নয়। এটি করার সবচেয়ে সহজ উপায় হ'ল অনেক স্পার্সার নেভিগেশন গ্রাফ রয়েছে (যথেষ্ট পরিমাণে স্পার যে সম্পূর্ণরূপে তুলনামূলকভাবে দ্রুত হয়) এবং কেবলমাত্র পথনির্দেশ সম্ভব হলে বিশদ গ্রাফটি ব্যবহার করুন।


6
এটা ভাল. টাইলগুলি "অঞ্চলগুলিতে" গ্রুপিং করে এবং প্রথমে আপনার টাইলটি যে অঞ্চলটি অন্য টাইলের মধ্যে রয়েছে সে অঞ্চলে সংযুক্ত হতে পারে কিনা তা যাচাই করে আপনি খুব দ্রুত নেতিবাচকতা ফেলে দিতে পারেন।
কোনারাক

2
সঠিক - সাধারণত এইচপিএ * এর অধীনে পড়ে
স্টিভেন

@ স্টিভেন থ্যাঙ্কস আমি নিশ্চিত যে এই ধরণের পদ্ধতির কথা চিন্তা করে আমি প্রথম ব্যক্তি নই তবে এটি কী বলা হয়েছিল তা আমি জানতাম না। প্রচলিত গবেষণার সুবিধা গ্রহণ করা আরও সহজ করে তোলে।
ক্লাসিকথান্ডার

3

বিভিন্ন বৈশিষ্ট্য সহ একাধিক অ্যালগরিদম ব্যবহার করুন

এ * এর কিছু সূক্ষ্ম বৈশিষ্ট্য রয়েছে। বিশেষত, এটি সর্বদা সংক্ষিপ্ততম পথটি খুঁজে পায়, যদি কোনওটির উপস্থিত থাকে। দুর্ভাগ্যক্রমে, আপনি কিছু খারাপ বৈশিষ্ট্যও পেয়েছেন। এই ক্ষেত্রে, কোনও সমাধানের অস্তিত্ব স্বীকার করার আগে এটি অবশ্যই সমস্ত সম্ভাব্য পাথ অনুসন্ধান করতে হবে।

আপনি এ * তে যে "ত্রুটি" আবিষ্কার করছেন তা হ'ল এটি টপোলজির বিষয়ে অজানা। আপনার কাছে একটি 2-ডি ওয়ার্ল্ড থাকতে পারে তবে এটি এটি জানে না। এটি সমস্ত জানেন, আপনার বিশ্বের সুদূর কোণে একটি সিঁড়ি যা একে একে একে একে বিশ্বের গন্তব্যস্থলে নিয়ে আসে।

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

এটি করার একটি সহজ উপায় হ'ল প্রতিটি টাইল নোডে অর্পণ করা। এটি তুচ্ছ হিসাবে দেখাতে হবে যে আপনাকে প্রতিটি টাইলের জন্য কেবল একটি নোড বরাদ্দ করতে হবে (গ্রাফের সাথে সংযুক্ত নয় এমন দুটি নোডের আপনার কখনও অ্যাক্সেস থাকতে পারে না)। তারপরে গ্রাফ প্রান্তগুলি সংযুক্ত করে বিভিন্ন নোডযুক্ত দুটি টাইল সংলগ্ন হয়।

এই গ্রাফটির অসুবিধা রয়েছে: এটি সর্বোত্তম পথ খুঁজে পায় না। এটি কেবল একটি পথ খুঁজে বের করে। তবে এটি এখন আপনাকে দেখিয়েছে যে এ * একটি সর্বোত্তম পথ খুঁজে পেতে পারে।

এটি এ * ফাংশনটি তৈরি করার জন্য আপনার অপ্রাপ্তবয়স্কদের উন্নত করার জন্য একটি তাত্পর্যপূর্ণও সরবরাহ করে, কারণ আপনি এখন আপনার ল্যান্ডস্কেপ সম্পর্কে আরও বেশি জানেন। আপনাকে এগিয়ে যাওয়ার জন্য পিছনে পদক্ষেপ নেওয়া দরকার তা জানার আগে আপনাকে সম্পূর্ণরূপে একটি মৃত শেষের সন্ধান করতে হবে।


গুগল ম্যাপের মতো এ্যালগোরিদমগুলিকে বিশ্বাস করার মতো যুক্তি আছে যে একই ধরণের (আরও উন্নত) পদ্ধতিতে পরিচালনা করে।
কর্ট অ্যামোন - মনিকা 23

ভুল। একটি * টপোলজি সম্পর্কে খুব সচেতন, গ্রহণযোগ্য হিউরিস্টিক নির্বাচনের মাধ্যমে।
এমসাল্টারস

গুগল রে, আমার আগের কাজটিতে আমরা গুগল ম্যাপের পারফরম্যান্স বিশ্লেষণ করে দেখেছি যে এটি এ * হতে পারে না। আমরা বিশ্বাস করি যে তারা আরকফ্লেগস বা অন্যান্য অনুরূপ অ্যালগরিদম ব্যবহার করে যা মানচিত্রের প্রাক-প্রসেসিংয়ের উপর নির্ভর করে।
এমসাল্টাররা 3'15

@ এসএমএলটার: এটি আকর্ষণীয় একটি সূক্ষ্ম লাইন। আমি যুক্তি দিয়েছি যে টপোলজি সম্পর্কে অ * অজানা because কারণ এটি কেবল নিকটবর্তী প্রতিবেশীদের সাথেই উদ্বেগ প্রকাশ করে। আমি যুক্তি দিয়ে বলতে পারি যে এটি গ্রহণযোগ্য ন্যায্য যে অ্যালগোরিদমটি গ্রহণযোগ্য হিউরিস্টিক উত্পন্ন হয় তা টপোলজি সম্পর্কে সচেতন, বরং এ * * হীরা রয়েছে এমন ক্ষেত্রে বিবেচনা করুন। একটি * হীরার অন্য দিকটি চেষ্টা করার জন্য ব্যাক আপ করার আগে, কিছুটা জন্য এক পথ নেয়। এ * কে অবহিত করার কোনও উপায় নেই যে branch শাখা থেকে একমাত্র "প্রস্থান" হিউরিস্টিকের সাথে ইতিমধ্যে পরিদর্শন করা নোড (সংরক্ষণের গণনা) এর মাধ্যমে।
কর্ট অ্যামোন -

1
গুগল মানচিত্রের জন্য কথা বলতে পারে না, তবে বিং মানচিত্র ল্যান্ডমার্কস এবং ট্রায়াঙ্গল ইনক্যুয়ালিটি (এএলটি) সহ সামান্য দ্বি-নির্দেশমূলক এ-স্টার ব্যবহার করে, এবং কয়েকটি সংখ্যক ল্যান্ডমার্ক এবং প্রতিটি নোডের প্রাক-গণিত দূরত্ব সহ।
পিটার জেরকেন্স

2

উপরের উত্তরগুলি ছাড়াও আরও কিছু ধারণা:

  1. এ * অনুসন্ধানের ক্যাশে ফলাফল। ঘর ডি থেকে সেল বি তে পাথ ডেটা সংরক্ষণ করুন এবং সম্ভব হলে পুনরায় ব্যবহার করুন। এটি স্থিতিশীল মানচিত্রে আরও প্রযোজ্য এবং আপনাকে গতিশীল মানচিত্রের সাথে আরও কাজ করতে হবে।

  2. প্রতিটি ঘরের প্রতিবেশীদের ক্যাশে দিন। একটি * বাস্তবায়নের জন্য প্রতিটি নোড প্রসারিত করা উচিত এবং অনুসন্ধানের জন্য ওপেন সেটটিতে তার প্রতিবেশীদের যুক্ত করা দরকার। এই প্রতিবেশীদের যদি ক্যাশেডের পরিবর্তে প্রতিবার গণনা করা হয় তবে এটি নাটকীয়ভাবে অনুসন্ধানটি ধীর করতে পারে। এবং যদি আপনি ইতিমধ্যে এটি থেকে বিরত থাকেন তবে এ * এর জন্য একটি অগ্রাধিকার সারি ব্যবহার করুন।


1

যদি আপনার মানচিত্রটি স্থিতিশীল হয় তবে আপনার প্রতিটি পৃথক বিভাগের নিজস্ব কোড থাকতে পারে এবং এ * চালানোর আগে প্রথমে এটি পরীক্ষা করতে পারেন। এটি মানচিত্র তৈরি বা মানচিত্রে কোড করেও করা যায়।

দুর্গম টাইলসের একটি পতাকা থাকা উচিত এবং এমন টাইলের দিকে যাওয়ার সময় আপনি এ * চালাবেন না বা তার কাছে পৌঁছনীয় তার পাশের টাইল বাছাই করতে পারবেন না।

আপনার যদি ডায়নামিক মানচিত্র থাকে যা ঘন ঘন পরিবর্তিত হয় আপনি ভাগ্য থেকে অনেক দূরে are সমাপ্তির আগে আপনার অ্যালগরিদমকে থামিয়ে দেওয়ার সিদ্ধান্ত নিতে হবে বা বিভাগগুলিতে চেকগুলি ঘন ঘন বন্ধ হয়ে যায়।


আমার উত্তরে আমি কোনও এরিয়া আইডি দিয়ে ঠিক একই পরামর্শ দিচ্ছিলাম।
স্টিভেন

আপনার মানচিত্রটি গতিশীল হলে আপনি সিপিইউ / সময় ব্যবহারের পরিমাণও হ্রাস করতে পারেন তবে প্রায়শই পরিবর্তন হয় না। অর্থাৎ আপনি যখনই কোনও লক করা দরজা আনলক বা লক করা থাকে তখন আপনি অঞ্চল আইডিগুলি পুনরায় গণনা করতে পারেন could যেহেতু এটি সাধারণত কোনও প্লেয়ারের ক্রিয়া প্রতিক্রিয়া হিসাবে ঘটে থাকে, তাই আপনি কমপক্ষে অন্ধকূপের তালাবদ্ধ অঞ্চলগুলি বাদ দিতে পারেন।
অবিশ্বাস্য

1

আমি কীভাবে একটি * আরও দ্রুত সিদ্ধান্ত নিতে পারি যে নোড দুর্গম?

আপনার Node.IsPassable()ফাংশনটির প্রোফাইল দিন , সবচেয়ে ধীর অংশগুলি বের করুন, সেগুলি দ্রুত করুন।

নোডটি প্যাসেবল কিনা তা সিদ্ধান্ত নেওয়ার সময়, সম্ভাব্য পরিস্থিতিগুলিকে শীর্ষে রাখুন, যাতে বেশিরভাগ সময় আরও অস্পষ্ট সম্ভাবনাগুলি পরীক্ষা করার বিরক্ত না করেই ফাংশনটি সরাসরি ফিরে আসে।

তবে এটি একটি নোড চেক করতে এটি দ্রুত করার জন্য making কোয়েরি নোডগুলিতে কতটা সময় ব্যয় করা হয়েছে তা দেখতে আপনি প্রোফাইল করতে পারেন, তবে আপনার সমস্যার মতো শব্দটি হ'ল খুব বেশি নোড চেক করা হচ্ছে।

যখন আমি একটি দুর্গম টাইল ক্লিক করি তখন অ্যালগরিদম দৃশ্যত পুরো মানচিত্রের মধ্য দিয়ে অদম্য টাইলের কোনও রাস্তা খুঁজে যায় goes

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

যদি আপনি বোঝাতে চান যে গন্তব্যটি নিজেই প্রবেশযোগ্য, তবে দুর্গম টাইলস দ্বারা ঘিরে রয়েছে, যেমন কোনও পথ নেই, তবে এ * এর পক্ষে পুরো মানচিত্রটি পরীক্ষা করা স্বাভাবিক। আর কীভাবে জানবে যে পথ নেই?

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


0

পেছনের দিকে সন্ধান করুন।

যদি কেবল আপনার মানচিত্রে অ্যাক্সেসযোগ্য টাইলসের বড় ক্রমাগত অঞ্চল না থাকে তবে এটি কাজ করবে। পুরো অ্যাক্সেসযোগ্য মানচিত্রটি অনুসন্ধান করার পরিবর্তে, পথ-সন্ধান কেবলমাত্র অলঙ্ঘনীয় জায়গাটি অনুসন্ধান করবে।



1
@ মুভিংডাক সংযুক্ত পৌঁছনীয় নয় এমন টাইলস যা বোঝাতে চাইছেন। এটি এমন একটি সমাধান যা কার্যকরভাবে কোনও বুদ্ধিমান মানচিত্রের নকশার সাথে কাজ করে এবং এটি কার্যকর করা খুব সহজ। আমি সঠিক সমস্যার আরও ভাল জ্ঞান ছাড়াই কল্পিত কিছু সুপারিশ করতে যাচ্ছি না, যেমন এ * বাস্তবায়ন এত ধীর হতে পারে যে সমস্ত টাইলগুলি পরিদর্শন করা আসলেই একটি সমস্যা।
আআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআ

0

যদি প্লেয়ার সংযুক্ত থাকে এমন অঞ্চলগুলি (কোনও টেলিপোর্ট ইত্যাদি নেই) এবং অ্যাক্সেসযোগ্য অঞ্চলগুলি সাধারণত খুব ভালভাবে সংযুক্ত না হয় তবে আপনি যে নোডে পৌঁছাতে চান তা কেবল আপনি * করতে পারেন do এইভাবে আপনি গন্তব্যে যে কোনও সম্ভাব্য পথ খুঁজে পেতে পারেন এবং অ * অ্যাক্সেসযোগ্য অঞ্চলগুলির জন্য দ্রুত অনুসন্ধান বন্ধ করবে।


পয়েন্টটি নিয়মিত এ * এর চেয়ে দ্রুত হওয়া উচিত।
হেক্কেল

0

যখন আমি একটি দুর্গম টাইল ক্লিক করি তখন অ্যালগরিদম দৃশ্যত পুরো মানচিত্রের মধ্য দিয়ে প্রবেশযোগ্য টাইলের কোনও রাস্তা খুঁজে পেতে পারে - এমনকি আমি যদি তার পাশে দাঁড়িয়ে থাকিও।

অন্যান্য উত্তরগুলি দুর্দান্ত, তবে আমার স্পষ্টতই ইঙ্গিত করতে হবে - আপনার কোনও দুর্গম টাইলের পথচলা চালানো উচিত নয়।

এটি আলগো থেকে প্রাথমিক প্রস্থান হওয়া উচিত:

if not IsPassable(A) or not IsPasable(B) then
    return('NoWayExists');

0

দুটি নোডের মধ্যে গ্রাফের দীর্ঘতম দূরত্ব পরীক্ষা করতে:

(ধরে নিচ্ছি যে সমস্ত প্রান্তের একই ওজন রয়েছে)

  1. যে কোনও প্রান্ত থেকে বিএফএস চালান v
  2. এর থেকে দূরে একটি শীর্ষকে নির্বাচন করতে ফলাফলগুলি ব্যবহার করুন v, আমরা এটি কল করব d
  3. থেকে বিএফএস চালান u
  4. এর থেকে খুব দূরে ভার্টেক্সটি সন্ধান করুন u, আমরা এটি কল করব w
  5. মধ্যে দূরত্ব uএবং wগ্রাফ দীর্ঘতম দূরত্ব।

প্রমাণ:

                D1                            D2
(v)---------------------------r_1-----------------------------(u)
                               |
                            R  | (note it might be that r1=r2)
                D3             |              D4
(x)---------------------------r_2-----------------------------(y)
  • মধ্যে দূরত্ব বলে দেয় yএবং xবেশী!
  • তারপর এই অনুযায়ী D2 + R < D3
  • তারপর D2 < R + D3
  • তারপর মধ্যে দূরত্ব vএবং xযে এর চেয়ে বেশী vএবং u?
  • তাহলে uপ্রথম পর্যায়ে বাছাই করা হত না।

প্রো। শ্লোমি রুবিনস্টাইন

আপনি যদি ভারিত প্রান্তগুলি ব্যবহার করে থাকেন তবে আপনি বহির্মুখী প্রান্তটি সন্ধানের জন্য বিএফএসের পরিবর্তে ডিজকস্ট্রা চালিয়ে বহুবচনের সময় একই জিনিসটি সম্পন্ন করতে পারেন।

দয়া করে নোট করুন আমি ধরে নিচ্ছি যে এটি একটি সংযুক্ত গ্রাফ রয়েছে। আমি এটিও পুনঃনির্দেশিত ধরে নিচ্ছি।


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

বিএফএস = হে (| ভি |) অনুমিত ও ((ভি | + | ই |)) তবে টপ ডাউন মানচিত্রের ক্ষেত্রে সত্যই নয়। এ * = ও (| ভি | লগ | ভি |)

যদি আমাদের কাছে কেবল 32 x 32 টাইলস সহ একটি মানচিত্র থাকে তবে বিএফএসের দাম 1024 ডলার এবং সত্যিকারের এ * এর জন্য আপনার পুরো 10,000 ডলার ব্যয় করতে পারে। এটি 0.5 কেজি এবং 5 সেকেন্ডের মধ্যে পার্থক্য, সম্ভবত আপনি যদি ক্যাশেটিকে বিবেচনায় নেন তবে আরও বেশি। সুতরাং নিশ্চিত হয়ে নিন যে আপনার এ * অলস বিএফএসের মতো আচরণ করে যা পছন্দসই টার্গেটের কাছাকাছি থাকা টাইল পছন্দ করে।

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

তাই হ্যাঁ বিএফএস> এ * অনেক ক্ষেত্রে টাইলগুলির ক্ষেত্রে আসে।


আমি এই অংশটি বুঝতে পেরেছি তা নিশ্চিত নই "" যদি আমাদের কাছে কেবল 32 x 32 টাইলস সহ একটি মানচিত্র থাকে তবে বিএফএসের দাম 1024 টাকার জন্য এবং সত্যিকারের এ * আপনাকে এক বিস্তর 10,000 ডলার দিতে পারে "আপনি কীভাবে 10 কে এসেছিলেন তা ব্যাখ্যা করতে পারবেন? নাম্বার দয়া করে?
ক্রমস্টার বলেছেন

"অলস বিএফএস যা টার্গেটের কাছাকাছি নোডগুলি পছন্দ করে" এর অর্থ কী? আপনি কি ডিজকস্ট্রা, প্লেইন বিএফএস বা হিউরিস্টিক সহ একটি বোঝাচ্ছেন (ভাল আপনি এখানে একটি * পুনরায় তৈরি করেছেন, অথবা কীভাবে আপনি খোলা সেট থেকে পরবর্তী সেরা নোডটি নির্বাচন করেন)? এটি log|V|একটি * এর জটিলতায় সত্যই সেই ওপেন-সেটটি বা ফ্রঞ্জের আকার বজায় রাখা থেকে আসে এবং গ্রিড মানচিত্রের জন্য এটি খুব ছোট - লগ সম্পর্কে (স্কয়ার্ট (| ভি |)) আপনার স্বরলিপিটি ব্যবহার করে। লগ | ভি | শুধুমাত্র হাইপার-সংযুক্ত গ্রাফগুলিতে প্রদর্শিত হয়। এটি এমন একটি উদাহরণ যেখানে সবচেয়ে খারাপ ক্ষেত্রে জটিলতার নিষ্প্রভ প্রয়োগ একটি ভুল উপসংহার দেয়।
কংগ্রেসবঙ্গাস

পছন্দ করুন এ *
ওল্ফড্ডন

@ ক্রমস্টারন ধরে নিচ্ছেন যে আপনি টাইল ভিত্তিক গেমের জন্য এ * এর ভ্যানিলা বাস্তবায়ন ব্যবহার করছেন, আপনি ভি * লগ ভি জটিলতা পাবেন, ভি টাইলের সংখ্যা হ'ল 32 এর 32 গ্রিডের জন্য এটি 1024. লগ ভি, প্রায় বিট সংখ্যা হওয়ায় 1024 যা 10 এর প্রতিনিধিত্ব করার দরকার ছিল তাই আপনি অযথা দীর্ঘ সময়ের জন্য দৌড়াতে পারেন। অবশ্যই, আপনি যদি টাইলসের গ্রিডে
ছুটে চলেছেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.