এডমন্ডস-কার্প (Edmonds-Karp)
ফোর্ড-ফুলকারসন (Ford-Fulkerson) মূলত কোনো অ্যালগরিদম নয়, বরং এটি হলো একটি মেথড (method) বা পদ্ধতি — যা আসলে ঠিক কীভাবে অগমেন্টিং পাথগুলো বা বৃদ্ধি পাওয়ার পথগুলো (augmenting paths) খুঁজে বের করতে হয় তা উল্লেখ না করেই শুধু বলে দেয় যে "যতক্ষণ পর্যন্ত বিদ্যমান থাকে ততক্ষণ অগমেন্টিং পাথগুলো বা বৃদ্ধি পাওয়ার পথগুলো খুঁজে বের করুন (find augmenting paths until none exist)"। এটি DFS-এর মাধ্যমে ব্যবহার করা হলে কোনো ক্ষেত্রে আপনার কপাল খুব ভালোও হতে পারে, বা আবার আপনি কোনো একটি খুব খারাপ পাথ বা পথে (bad paths) ঘুরতে ঘুরতে নিজের অসীম (forever) পরিমাণ সময়ও নষ্ট করে ফেলতে পারেন।
এডমন্ডস-কার্প (Edmonds-Karp) মূলত এই মেথডটিতে খুব সহজ একটি কিন্তু পাওয়ারফুল বা শক্তিশালী পরিবর্তন নিয়ে আসে আর তা হলো: সর্বদা সবচেয়ে ছোট অগমেন্টিং পাথ (shortest augmenting path) (অর্থাৎ যেটিতে এজের সংখ্যা সবচেয়ে কম থাকে) খুঁজতে গিয়ে BFS-কে ব্যবহার করুন। ব্যস, এইটুকুই। শুধুমাত্র একটি লাইনে আনা এই ছোট্ট পার্থক্যটি এটির সক্ষমতাগুলো (capacities) যেমনই হোক না কেন, আপনাকে একটি গ্যারান্টিযুক্ত পলিনোমিয়াল ওয়ার্স্ট-কেসের বা সবচেয়ে খারাপ অবস্থার গ্যারান্টি (polynomial worst-case guarantee) প্রদান করে।
DFS ব্যবহার করাটা কেন ভয়ানক বা বেশ খারাপ একটি বিকল্প হতে পারে (Why DFS Can Be Terrible)
কখনো s থেকে t পর্যন্ত যাওয়া দুটি ভিন্ন পাথের বা পথের কথা কল্পনা করুন: যার মধ্যে একটি যায় 1 ক্ষমতা বা ক্যাপাসিটির (capacity) একটি খুব সরু ব্রিজের (bridge) বা সেতুর মধ্য দিয়ে, এবং অপরটি যায় তার চারপাশ দিয়ে যার ক্ষমতা বা ক্যাপাসিটি থাকে 1,000,000। আপনি যদি DFS ব্যবহার করে এদের মধ্যে বারবার যাতায়াত করতে থাকেন, তবে প্রতিবারই আপনি সেখানে মাত্র 1 ইউনিট করে জিনিস পাঠাতে পারবেন। এবং এর প্রায় 2,000,000 ইটারেশন (iterations) বা বার পুনরাবৃত্তির পরেই মূলত আপনি এমন একটি ফলাফল পাবেন যা BFS-এর সাহায্যে আপনি হয়তো মাত্র দুটি ধাপেই বা স্টেপেই (steps) সম্পন্ন করতে পারতেন।
এর এই ক্ষমতা বা ক্যাপাসিটিগুলো মূলত অযৌক্তিক বা মূলদ (irrational capacities) হওয়ার কারণে, DFS-ভিত্তিক ফোর্ড-ফুলকারসন শেষপর্যন্ত গিয়ে টার্মিনেট (terminate) করতে বা সম্পূর্ণ হতেও ব্যর্থ হতে পারে — যা সঠিক উত্তরের কাছাকাছি পৌঁছানোর আগেই এমন দোলনাময় বা অসিল্যাটিং (oscillating) আচরণ করতে থাকে।
BFS-এর দিন বাঁচানোর উপায়: মনোটোনিসিটি বা অপরিবর্তনীয় আর্গুমেন্ট (The Monotonicity Argument)
আপনি যখন সবসময় এর সবচেয়ে ছোট পাথ বা শর্টেস্ট পাথটি (shortest path) (এজের সংখ্যা বা edge count দ্বারা) ব্যবহার করে বারবার একে বৃদ্ধি বা অগমেন্ট (augment) করবেন, তখন এর এই অগমেন্টিং পাথের (augmenting path) দৈর্ঘ্যগুলো হয় আগের মতো একই থাকবে নতুবা সেটা বাড়তে থাকবে — সেগুলো কখনোই কমবে না। এই ধরনের মনোটোনিসিটি বা অপরিবর্তনীয় বৈশিষ্ট্যটিই (monotonicity) হলো এই পলিনোমিয়াল বাউন্ড (polynomial bound) বা পলিনোমিয়াল সীমার পেছনের মূল চাবিকাঠি।
কেন এটি এত গুরুত্বপূর্ণ: একবার যখন আপনি L (L length) দৈর্ঘ্যের একটি পাথ বা পথ বারবার ব্যবহার করা শুরু করবেন, তখন স্বভাবতই এক পর্যায়ে গিয়ে এর বটলনেক এজটি (bottleneck edge) বা সেই সংকীর্ণ অংশটি স্যাচুরেট (saturated) বা ভর্তি হয়ে যাবে এবং পরবর্তীতে সেটিকে রিমুভ (removed) বা সরিয়ে ফেলতে হবে। সেই এজটি (edge) হয়তো পরে কোনো ব্যাকওয়ার্ড এজ (backward edge) বা পেছনের প্রান্ত হয়ে ঠিকই ফিরে আসতে পারে — কিন্তু তখন তা কেবল একটি দীর্ঘতর পাথের বা লম্বা পথের কোনো অংশ হিসেবেই ফেরত আসবে। আর যেহেতু পাথের (path) দৈর্ঘ্যটিকে V-এর পরিমাণ দিয়ে সীমাবদ্ধ করা থাকে, তাই এখানকার সর্বমোট অগমেন্টেশনগুলোর (augmentations) সংখ্যাও সীমিত হয়ে থাকে।
এর \(O(VE^2)\) টাইমের প্রুফ স্কেচ (The \(O(VE^2)\) Proof Sketch)
প্রতিটি এজ বা প্রান্ত (edge) মূলত একটি শর্টেস্ট পাথের দৈর্ঘ্য (shortest path) এর ভেতর দিয়ে পার হয়ে যাওয়ার আগে সর্বাধিক \(O(V)\) সংখ্যক বার বটলনেক (bottleneck) হিসেবে কাজ করতে পারে বা সেটিতে রূপান্তরিত হতে পারে। একটি গ্রাফে (graph) ঠিক E সংখ্যক এজ থাকে। তাহলে: প্রতিটি এজের জন্য \(O(V)\) বটলনেক (bottleneck) ইভেন্ট × E এজ = সর্বমোট \(O(VE)\) অগমেন্টেশন বা বৃদ্ধি। প্রতিটি অগমেন্টেশন (augmentations) একটি BFS কল বা রান (runs) করে যার খরচ বা ব্যয় হয় \(O(E)\)। তাই মিলে সর্বমোট: \(O(VE)\) × \(O(E)\) = \(O(VE^2)\) হয়।
এটি এর ম্যাক্সিমাম ফ্লো ভ্যালু (maximum flow value) বা সর্বোচ্চ প্রবাহ থেকে অনেকটাই স্বাধীন — এটি হলো ফ্লো ম্যাগনিচ্যুড (flow magnitude) বা ফ্লোয়ের মাত্রায় নয়, বরং একটি গ্রাফের সাইজ বা আকারে থাকা একটি সত্যিকার পলিনোমিয়াল বাউন্ড বা সীমা।
উপযোগিতা বা ইমপ্লিমেন্টেশন (Implementation)
আসল ফোর্ড-ফুলকারসনের (Ford-Fulkerson) পদ্ধতিটি থেকে এটি ভিন্ন হওয়ার একমাত্র কারণ হলো অগমেন্টিং পাথগুলো বা বৃদ্ধি পাওয়ার পথগুলো (augmenting paths) খুঁজে বের করার জন্য এখানে স্ট্যাক/রিকার্সন বা stack/recursion (DFS)-এর পরিবর্তে মূলত কিউ বা queue (BFS) ব্যবহার করা হয়। আর অবশিষ্ট রেসিডুয়াল গ্রাফগুলোর (residual graph management) ক্ষেত্রে এই ব্যবস্থাপনাটি থাকে সম্পূর্ণ একই রকমের: প্রতিটি এজের বা প্রান্তের (u→v) জন্য, এর সামনের দিকের ফরোয়ার্ড ক্যাপাসিটি (forward capacity) এবং পেছনের দিকের ব্যাকওয়ার্ড ক্যাপাসিটিকে (backward capacity) একত্রে জোড় মিলিয়ে বা পেয়ার (pair) হিসেবে স্টোর বা সংরক্ষণ করা হয়।
এডমন্ডস-কার্প (Edmonds-Karp)
Complexity
ছোট কুইজ
পড়া চালিয়ে যান