গ্রাফের পরবর্তী অংশটি দেওয়া যাক:
আমি যখন A এবং B পয়েন্টগুলির মধ্যে সংক্ষিপ্ত_পথটি ফাংশনটি ব্যবহার করি তখন আমি নীল পথটি পেয়েছি। কেন এমন হয়?
গ্রাফের পরবর্তী অংশটি দেওয়া যাক:
আমি যখন A এবং B পয়েন্টগুলির মধ্যে সংক্ষিপ্ত_পথটি ফাংশনটি ব্যবহার করি তখন আমি নীল পথটি পেয়েছি। কেন এমন হয়?
উত্তর:
PgRouting এ সংক্ষিপ্ত_পথ (ডিজকস্ট্রার অ্যালগরিদম) কীভাবে আচরণ করে। যদি একই উত্স এবং লক্ষ্য সহ দুটি প্রান্ত থাকে, তবে এলোমেলো একটি (সুনির্দিষ্টভাবে বলতে গেলে: প্রথমটি, এটি ডাটাবেস থেকে আসে) ব্যবহৃত হয়। আমি এটির জন্য কোনও স্থিরতা জানি না, তবে কিছু কর্মক্ষেত্র রয়েছে।
যদি সম্ভব হয় তবে আপনার এই প্রান্তগুলির একটিকে দুটিতে বিভক্ত করা উচিত। আমি এটি পরীক্ষা করে দেখিনি, তবে এটির আচরণটি ঠিক করা উচিত।
কেসের জন্য অন্যান্য সমাধান, যখন আপনি নিজের ডেটাসেটটি সংশোধন করতে পারবেন না। আপনার টেবিলের ক্ষেত্রে 'সংক্ষিপ্ত_ বিকল্প' ক্ষেত্র যুক্ত করুন। নমুনা ক্যোয়ারী, এটি আপনার প্রয়োজন অনুসারে পরিবর্তন করুন। আমি আশা করি এটি ধারণাটি ব্যাখ্যা করেছে:
UPDATE roads t1
SET shorter_alternative = t2.id
FROM roads t2
WHERE
((t2.source = t1.source AND t2.target = t1.target) OR
(t2.source = t1.target AND t2.target = t1.source)) AND
(t2.length < t1.length)
এখন, প্রান্ত '0.098' তে প্রান্তের '0.011' আইডি থাকবে। অন্যান্য সমস্ত প্রান্তের সংক্ষিপ্ত_ বিকল্প ক্ষেত্রটি বাতিল হবে। আপনি সংক্ষিপ্ত_পথ কোয়েরি করার পরে, ফিরিয়ে নেওয়া ডেটাসেট চেক করুন - যদি কোনও সারিতে সংক্ষিপ্ত_ বিকল্প বিকল্প ক্ষেত্র সেট থাকে তবে এটি পরিবর্তন করুন।
পূর্ববর্তী উত্তরে ইতিমধ্যে সমস্যাটি বর্ণিত হয়েছে। এটি "ভার্টেক্স ভিত্তিক" সংক্ষিপ্ততম পথ অ্যালগরিদমগুলির একটি সমস্যা, এটি কেবল উত্স এবং লক্ষ্য সম্পর্কে যত্নশীল।
ইস্যু ট্র্যাকারে একটি টিকিট এবং অ্যালগরিদম বাস্তবায়নের পরিবর্তনের সম্ভাব্য সমাধান রয়েছে: https://github.com/pgRouting/pgrouting/issues/34 (কেউ যদি এটি চেষ্টা করে একটি টানতে অনুরোধ পাঠাতে পারে তবে খুব ভাল লাগবে; - )
অন্য সম্ভাবনাটি হ'ল আগে উল্লিখিত "সমান্তরাল রাস্তা লিঙ্কগুলি" বিভক্ত করা। অথবা আপনি শ্যুটিং স্টার অ্যালগরিদম ব্যবহার করতে পারেন যা প্রান্ত থেকে প্রান্তে চলে তাই এটি উভয় রাস্তার লিঙ্ক সম্পর্কেই "জানে"।
অথবা আপনি ব্যয় করে রাস্তা নেটওয়ার্কটি অর্ডার করার চেষ্টা করতে পারেন এবং তারপরে উত্স এবং লক্ষ্যমাত্রার স্বতন্ত্র সংমিশ্রণগুলি বেছে নিতে পারেন:
SELECT * FROM shortest_path(
'SELECT DISTINCT ON (source, target)
gid as id,
source::integer,
target::integer,
cost::double precision
FROM ways ORDER BY source, target, cost',
true,false
);
এটি ধরে নিয়েছে যে আপনি সর্বনিম্ন ব্যয়বহুল রুটটি অনুসন্ধান করেন। অন্যথায় আপনার প্রয়োজন ORDER BY ... DESC
।
এটি কার্য সম্পাদনকে প্রভাবিত করে কিনা আপনার চেষ্টা করা দরকার।
আমি আসলে পিজারাউটিংয়ের জন্য একটি প্যাচ তৈরি করেছি, যা সমস্যার সমাধান করে: https://github.com/pgRouting/pgrouting/issues/78