বিশাল গ্রাফগুলিতে ডিজকস্ট্রার অ্যালগরিদম


15

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

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

পরিদর্শন করা প্রতিটি ভার্টেক্সের সংলগ্ন তালিকাটি আনতে আমার পরিসংখ্যানগত তথ্য অনুসারে 10,000 নোডের প্রতি প্রায় 1,500 ডাটাবেস কোয়ের প্রয়োজন হবে, যাতে তারা এটি কীভাবে করে তা স্পষ্টভাবে নয়। যে উপায় খুব ধীর হতে হবে।

তারা এটা কিভাবে করল? আমি নিজেই এটি বাস্তবায়নের চেষ্টা করছি।


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

1
আপনি কোডটি দেখেছেন? আমাদের কীভাবে জানা উচিত? "ডাটাবেস প্রশ্নগুলি" - আমি আশা করি আপনি গ্রাফ সংরক্ষণের জন্য কোনও ডিবিএমএস ব্যবহার করবেন না?
রাফেল

@ ডেভিডরিচার্বি হ্যাঁ আমি নিশ্চিত, এই লিঙ্কটি দেখুন
dimitris93

2
"[আমি] টি খাঁটি সি কোডটি অনুসন্ধান করা অত্যন্ত ক্লান্তিকর প্রক্রিয়া হবে।" কিন্তু কোডটি কী করে তা জানার একমাত্র উপায়। সুতরাং আপনি কেবল আমাদের জন্য আপনার ক্লান্তিকর কাজটি করতে বলছেন, যা আপনার প্রশ্নের সবচেয়ে বড় বিজ্ঞাপন নয় ...
ডেভিড রিচার্বি

1
@ শিরো আপনি স্পষ্টভাবে জিজ্ঞাসা করেছেন, "তারা কীভাবে এটি করে?" আপনি যদি জিজ্ঞাসা করতে চান এমন প্রশ্নটি যদি না হয় তবে আপনাকে পুনরায় উত্তর দেওয়া দরকার।
রাফেল

উত্তর:


6

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

আপনি ডিসি থেকে পড়ার জন্য একটি ডিবি, একটি কাস্টম ফাইল ফর্ম্যাট এবং একটি মেমরির সেটিং ব্যবহার করতে পারেন।

তবে আমার অভিজ্ঞতা থেকে একটি ডিবি ব্যবহার করে মোটামুটি 5 থেকে 10 গুণ ধীরে ধীরে এবং একটি 'সরল' লিঙ্কযুক্ত তালিকার ফর্ম্যাটের উপর ভিত্তি করে আপনার নিজের ফাইল ফর্ম্যাটটি লেখার চেয়ে অনেক বেশি স্মৃতি।

ভাল কথা হ'ল ওএসএম ব্যবহার করে বেশ কয়েকটি সফ্টওয়্যার ফ্রেমওয়ার্ক রয়েছে যা ওপেন সোর্স যা আপনি কোডটিতে ডানদিকে দেখতে পারেন যেমন এখানে দেখুন । ইন GraphHopper ওপেন সোর্স রাউটিং ইঞ্জিন এটি একটি মেমরি থেকে সুইচ করা খুব সহজ ইন-মেমোরি সেটিং সেটিং (ভিত্তিক ডিস্ক) ম্যাপ - উভয় একই বিন্যাসে ব্যবহার করে। "এমএমএপ" সেটিংস এমনকি মেমরির সীমাবদ্ধ মোবাইল ডিভাইসগুলিতে ব্যবহারের অনুমতি দেয় এবং যদি আপনার কোনও সার্ভারে প্রয়োজনীয় র‌্যাম থাকে তবে আধুনিকতা আরও দ্রুত সঞ্চালিত করে। যেমন একটি ওয়ার্ল্ড ওয়াইড গ্রাফের জন্য (> 100 মিও নোড) আপনার তখন প্রায় 8-10gb র‌্যামের প্রয়োজন হয়, আরও কিছু র‌্যাম প্রয়োজন হয় যদি আপনি আরও কিছু গতি বাড়িয়ে তুলতে চান যেমন সংকোচনের হায়ারারচিজ সহ - আপনি চান প্রতিটি যানবাহনের জন্য প্রায় 5-8gb বেশি।

ফর্ম্যাটটি খুব সরল এবং মূলত এটির কমপ্যাক্ট করার জন্য আপনার কেবল কয়েকটি কৌশল দ্বারা প্রয়োজনীয় ডেটা সঞ্চয় করে। এটি সম্পর্কে এখানে আরও পড়ুন । দাবি অস্বীকার: আমি গ্রাফহপার লেখক।

অন্যান্য উত্তর সম্পর্কে:

প্রযোজ্য সময়ে ডিজকস্ট্রাস অ্যালগরিদম এই সমস্যার জন্য অনুকূল নয় বলে বিবেচিত

'সাধারণ' ডিজকস্ট্রা খুব যুক্তিসঙ্গত পারফর্ম করতে পারে (<3s আপনার 3 মিও নোডের উদাহরণের মতো দেশ-ব্যাপী প্রশ্নের জন্য) এবং 'থিয়োরি অর্থে' অনুকূল তবে উত্পাদন পরিস্থিতিতে দৃ fast় হতে কিছুটা সুরের প্রয়োজন। এবং সংকোচনের হায়রাচিগুলির মতো কৌশলগুলি এটির একটি দ্বি নির্দেশমূলক পরিবর্তন ব্যবহার করে এবং খুব ভাল সম্পাদন করে।

সড়ক নেটওয়ার্কগুলি শ্রেণিবদ্ধ এবং পরিকল্পনাকারী।

রোড নেটওয়ার্কগুলি কেবল গাড়ীের জন্য শ্রেণিবদ্ধ এবং প্ল্যানার নয় (সেতু, টানেল, ...)


আমার আরও একটি প্রশ্ন আছে. আপনি NodeIDনিকটতম নোডটি কীভাবে খুঁজে পাবেন latitude/longitude? এটি সবচেয়ে সংক্ষিপ্ততম পথ এ-> বি গণনা করা প্রয়োজন। এবং এও আমাদের মনে রাখতে হবে যে A এবং B নোড হিসাবে উপস্থিত থাকতে পারে না, কারণ প্রতি বর্গ মিটারে নোড থাকে না। সুতরাং আমরা A এবং B. এর 2 নিকটতম NodeIDs বের করতে হবে
dimitris93

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

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

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

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

2

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


0

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

  • সংলগ্ন তালিকার ডেটা থেকে একটি গ্রাফ কাঠামো "সংকলন" করা যায়। আপনি যে লাইব্রেরির উল্লেখ করেছেন এটি স্প্যাটিয়ালাইট the এই গ্রাফ স্ট্রাকচারগুলি সংকুচিত বাইনারি ফর্ম্যাটে সংরক্ষণ করা হয় যেখানে গ্রাফের অবস্থানগুলি বাইনারি-এনকোডড পূর্ণসংখ্যা ইত্যাদি দ্বারা প্রতিনিধিত্ব করা হয়, সুতরাং গ্রাফের প্রতিনিধিত্ব এবং ম্যানিপুলেশন সমস্ত রাস্তার নাম ইত্যাদি সংরক্ষণের চেয়ে অনেক কম জায়গা নেয়; এটি স্পাতিয়ালাইট অ্যালগরিদমটি "অনলাইন" নয় এবং পুরোপুরি স্মৃতিতে চলে appears

  • সমান্তরাল / বিতরণ অ্যালগরিদম আছে। উদাহরণস্বরূপ দেখুন স্কেলেবল জিপিইউ গ্রাফ ট্র্যাভারসাল / মেরিল, গারল্যান্ড, গ্রিমশা।

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

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

  • এটি (235p!) পিএইচডি থিসিসটি বিশেষভাবে প্রযোজ্য। রোড নেটওয়ার্ক / শুল্টেসে রুট প্ল্যানিং

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


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

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

-2

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

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

যদি অভিনেতা এ ১৯ 1970০ সাল থেকে অভিনয় করে চলেছেন এবং অভিনেতা বি ২০০০ সাল থেকে অভিনয় করছেন, তবে সেই তথ্যটি দেওয়া হলে, অভিনেতা বি এর প্রথম সিনেমা থেকে শুরু করে অভিনেতা এ-এর পথে আপনার পথকে অনুসরণ করা কোনও পথ খুঁজে পাওয়া আরও যুক্তিযুক্ত হবে As প্রতিটি সিনেমার মাধ্যমে পুনরাবৃত্তি করার বিপরীতে অভিনেতা এ অভিনয় করেছেন।

সুতরাং, মূল বিষয়টি হ'ল জিক্স্ট্রার অ্যালগরিদমের অনুকূলিতকরণ আপনার ডেটা সেটটি কী তার উপর নির্ভর করে। আপনার অ্যালগরিদমকে অনুকূলকরণে আপনাকে সহায়তা করতে আপনার ডেটা সেটটি আমাদের জন্য কী প্রবেশ করায় সে সম্পর্কে আপনাকে আরও তথ্য সরবরাহ করতে হবে।

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


1
আপনি কীভাবে ইউনিয়ন-সন্ধান করুন ডিজজস্ট্রায় ব্যবহার করবেন?
রাফেল

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