একটি * নেভিগেশনাল জাল পথ সন্ধান


15

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

আমি দুটি এ * প্রোটোটাইপ তৈরি করেছি। এক গ্রিড ভিত্তিক এবং তারপর আমি যে এক সাথে কাজ করে প্রণীত ওয়েপয়েন্ট তাই এখন আমি একটি 2d অবমুক্ত / ভবন নোড যে আমি থেকে একটি পাথ করতে পারেন একটি গ্রাফ করা "মানচিত্র" থেকে পেতে একটি উপায় কাজ করা প্রয়োজন। আসল পাথফাইন্ডিংটি দুর্দান্ত বলে মনে হচ্ছে, কেবল আমার খোলা এবং বন্ধ তালিকা আরও কার্যকর ডেটা স্ট্রাকচার ব্যবহার করতে পারে, তবে আমার প্রয়োজন হলে এবং আমি যখন তা করতে পারব।

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

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

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

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

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


আমি নিশ্চিত নই তবে এই লিঙ্কগুলি সাহায্য করতে পারে: গেমদেভ.স্ট্যাকেক্সেঞ্জার / কুইকশানস / ১৩২ // গেমদেব.স্ট্যাকেক্সেঞ্জ / ডেস্ক : 87৮৮87/২ পথের সন্ধান সম্পর্কে আরও একটি প্রশ্ন ছিল যা আমি এখনই খুঁজে পাচ্ছি না , যা একটি অনুগ্রহ পেয়েছিল এবং খুব ভাল উত্তর পেয়েছিল।
Ali1S232

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

প্রকৃতপক্ষে, আমি কেবল নিবন্ধটি গেমদেব.স্ট্যাকেক্সেঞ্জঞ্জ / প্রশ্নগুলি / ৮০87//২ তে পড়েছি এবং এটি * * এর সাথে কোনও রুট সন্ধান করে কাজ করে বলে মনে হচ্ছে, তারপরে পরিবর্তিত ফানেল অ্যালগরিদমের সাহায্যে এটির ব্যয়টি সঠিকভাবে গণনা করা হচ্ছে এবং তারপরে অন্য কোনও রুট খুঁজে বের করে এটির গণনা করা হচ্ছে সত্যিকারের ব্যয় আবার এবং এটি অন্যটির চেয়ে কম খাটো কিনা তা দেখতে। এটি সংক্ষিপ্ততম রাস্তাটি না পাওয়া পর্যন্ত এটি পুনরাবৃত্তি করে। এটি প্রকৃতপক্ষে আমার সমস্যার সমাধান করে, তবে মনে হচ্ছে এটি সোজা হবে কারণ আপনি সোজা এবং পথ সন্ধান উভয়ই পুনরাবৃত্তি করছেন যা বেশ ব্যয়বহুল হবে।
রাগান্বিত

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

@JonathanDickinson আমি জানি আমি একটি পাথ যে 100% গত পিক্সেল সঠিক হতে হবে প্রয়োজন হবে না, আর আমি জানি আমি একটি ব্যবহার করতে পারেন * পাথ যে অধিকাংশ হতে হবে উত্পাদন করতে পি গ্রাহ্য। জিনিসটি এতটাই বাধা হয়ে দাঁড়াচ্ছে যে পরিষ্কারভাবে স্পষ্টভাবে, যেমন আমার আগের স্ট্যাকের ওভারফ্লো সম্পর্কে প্রশ্ন বা গেমদেব.স্ট্যাকেক্সেঞ্জঞ্জ / প্রশ্নগুলি / 87৮87//২ এ কেবল খুব বেশি। আমি আমার এআইকে কোনও বাধা পেরিয়ে যেতে পারি না!
রাগান্বিত

উত্তর:


14

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

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

রাস্তা খোঁজা

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

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

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

পথ সোজা

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

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

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

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

নবমেশের প্রতিনিধিত্ব করছেন

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


আমি এই সম্পর্কে একটি সংক্ষিপ্ত পাঠ করেছি, তবে আমি বুঝতে পারি যে আপনি কখনই এ * এর জন্য দূরত্বের বর্গক্ষেত্র (বা বর্গমূল নয়) ব্যবহার করবেন না: তিরিও.স্ট্যানফোর্ড.ইডু
গেমপ্রোগ্র্যামিং

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

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

@ চেগুওহহলিক্সলিন্স আপনি ইউক্লিডিয়ান দূরত্ব ব্যবহার করতে পারেন sqrt(x*x + y*y)- তবে প্রতি নোডের চেয়ে কম নয় x*x + y*y
জোনাথন ডিকিনসন

@ জোনাথনডিকিনসন আমি জানি, অতএব আমার বক্তব্য।
রাগান্বিত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.