নিকটতম বিন্দু সন্ধান করতে অ্যালগরিদম


18

আমি তাদের অক্ষাংশ / দ্রাঘিমাংশ সহ কয়েক শতাধিক শহরের একটি তালিকা করেছি। অন্য একটি অবস্থান দেওয়া হয়েছে (এছাড়াও ল্যাট / লম্বায়) আমার নিকটতম শহরটি সন্ধান করা উচিত।

যেহেতু আমি কোনও জিআইএস ব্যবহার করি না, ততক্ষণে সুস্পষ্ট আলগোরিদমটি হ'ল পয়েন্টগুলির মধ্যে দূরত্ব গণনা করে সমস্ত শহরের জন্য একটি লুপ তৈরি করা।

লুপটি তৈরি করা আমার পক্ষে অনুশীলনীয় তবে এটিকে আরও দক্ষতার সাথে সম্পাদন করার জন্য অ্যালগরিদম বাস্তবায়নের কিছু সহজ কি আছে? বা কিছু হালকা জাভা গ্রন্থাগার এটি সমাধান করতে সহায়তা করতে পারে?

দ্রষ্টব্য : আমার একটি সম্পূর্ণ জিআইএস সমাধান বা ভারী / জটিল লাইব্রেরি প্রয়োজন / প্রয়োজন নেই। আমি একটি কম ভাল তবে সহজ এবং হালকা সমাধান পছন্দ করি কারণ এটিই কেবল আমার সমাধান করা দরকার।


তাহলে দূরত্বটি ঠিক হবে না তাতে কী আসে যায়? এবং আপনি রাস্তাগুলির জন্য অ্যাকাউন্ট করতে চান না যা একটি শহরকে অন্যের চেয়ে বেশি করে তুলতে পারে (ত্রিভুজ বনাম স্কোয়ার)?
ব্র্যাড নেসোম

হ্যাঁ রাস্তা আমার পক্ষে গুরুত্বপূর্ণ নয়। লিনিয়ার দূরত্বে আমার নিকটতম শহরটি প্রয়োজন কারণ এটি আবহাওয়ার পূর্বাভাসের জন্য।
লুজপ

1
আবহাওয়ার পূর্বাভাস? আমি আশা করি আপনার কাছে একটি সুপার কম্পিউটার এবং প্রশিক্ষণপ্রাপ্ত আবহাওয়াবিদদের কর্মী আপনার কাছে রয়েছেন।
মাইকেল টড

ভবিষ্যদ্বাণীগুলি মাইকেল হয়ে গেছে, কেবলমাত্র আমি
নিকটতমটিকেই

উত্তর:


24

20 বছর আগে ডেস্কটপ জিআইএস ডিজাইনের সময় আমি এই প্রশ্নটি ঠিক তদন্ত করেছি। আমাদের ইন্টারেক্টিভভাবে পয়েন্ট-টু-পয়েন্ট দূরত্ব খুঁজে পাওয়া দরকার; আমাদের লক্ষ্য ছিল হাজার হাজার পয়েন্টের জন্য 1/2 সেকেন্ডেরও কমের মধ্যে কম্পিউটিং করা। পরীক্ষা (একটি 25 মেগাহার্জ 486 পিসিতে!) দেখিয়েছিল যে আমরা সমস্ত দূরত্ব গণনা করতে পারলাম, ঠিক যেমনটি আপনি বর্ণনা করেছেন (সরল সুস্পষ্ট আলগোরিদম দিয়ে), এত তাড়াতাড়ি যে আরও চতুষ্পদ সমাধান যেমন চতুষ্কোণ কাঠামো তৈরি করার কোনও অর্থ হয় নি ।

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

আপনার জন্য যথেষ্ট দ্রুত? যদি তা না হয় তবে ব্রুট-ফোর্স পদ্ধতিটি সহজেই প্রসেসরের সংখ্যার সাথে সমান্তরাল হয়ে যায় এবং স্কেল করে: প্রসেসরের মধ্যে কেবলমাত্র পয়েন্টগুলি ভাগ করে নিন এবং তারপরে প্রতিটি প্রসেসরের দ্বারা পাওয়া নিকটতমটির একটি চূড়ান্ত তুলনা করুন।

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



4

আমি অন্যদের সাথে একমত যে একটি সাধারণ লুপটি "কয়েক শতাধিক শহর" এর জন্য কার্যকর হওয়া উচিত।

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

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

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


1

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

চিয়ার্স, ডেভিড

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