পাঠ ৪৯ · ৫৭-এর মধ্যে · মডিউল ১১
Home / Courses / Design and Analysis of Algorithms / NP-হার্ডনেসের প্রতিক্রিয়া

NP-হার্ডনেসের মুখোমুখি — এক্স্যাক্ট, অ্যাপ্রক্সিমেট নাকি হিউরিস্টিক

Responding to NP-hardness: exact, approximate, or heuristic
৭ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • NP-হার্ড সমস্যার মুখোমুখি হলে সিদ্ধান্ত নেওয়ার একটি প্র্যাকটিক্যাল তিন-শাখার কাঠামো
  • কখন এক্স্যাক্ট এক্সপোনেনশিয়াল/ব্যাকট্র্যাকিং পদ্ধতি (M8) যথেষ্ট, এবং কখন তা আর ব্যবহারযোগ্য থাকে না
  • কখন প্রমাণিত-রেশিও অ্যাপ্রক্সিমেশন অ্যালগরিদম (M12) এবং কখন র‍্যান্ডোমাইজড/হিউরিস্টিক পদ্ধতি (M12) বেছে নেওয়া উচিত
  • একটি concrete, গণনাকৃত উদাহরণ দিয়ে "ইনপুট সাইজ ছোট" বলতে ব্যবহারিকভাবে কী বোঝায় তা বোঝা

১ · সিদ্ধান্ত-কাঠামো — তিনটি প্রশ্ন, তিনটি পথ

L48-এর চেকলিস্ট অনুযায়ী আপনি সন্দেহ করছেন (বা জানেন) সমস্যাটি NP-হার্ড। এখন সরাসরি তিনটি প্রশ্ন জিজ্ঞেস করুন — প্রতিটির উত্তর একটি ভিন্ন, ইতিমধ্যে এই কোর্সে কভার করা কৌশলের দিকে নিয়ে যায়।

সমস্যাটি NP-হার্ড (সন্দেহ বা প্রমাণিত, L48) ইনপুট সাইজ সবসময় ছোট? (n যথেষ্ট ছোট যে exponential/backtracking সময়মতো শেষ হবে) প্রমাণিত-রেশিও অ্যাপ্রক্সিমেট উত্তর গ্রহণযোগ্য? ওয়ার্স্ট-কেস গ্যারান্টির চেয়ে অ্যাভারেজ-কেস পারফরম্যান্স বেশি গুরুত্বপূর্ণ? হ্যাঁ → এক্স্যাক্ট পদ্ধতি এক্সপোনেনশিয়াল/ব্যাকট্র্যাকিং/ ব্রাঞ্চ-অ্যান্ড-বাউন্ড (M8) হ্যাঁ → অ্যাপ্রক্সিমেশন অ্যালগরিদম, প্রমাণিত রেশিওসহ (M12/L50-L52) হ্যাঁ → র‍্যান্ডোমাইজড/ হিউরিস্টিক পদ্ধতি, expected-time অ্যানালাইসিসসহ (M12/L53-L54)
তিনটি পথই বৈধ প্রকৌশল সিদ্ধান্ত — কোনটি "সঠিক অ্যালগরিদম" তা নির্ভর করে আপনার প্রকৃত ইনপুট, নির্ভুলতার প্রয়োজন, ও সময়ের সীমাবদ্ধতার উপর।

২ · পথ ১ — ইনপুট সবসময় ছোট: এক্স্যাক্ট পদ্ধতি (M8)

যদি আপনার নির্দিষ্ট অ্যাপ্লিকেশনে ইনপুটের আকার $n$ কখনোই একটা ছোট সীমা ছাড়িয়ে যায় না (যেমন একদিনের ডেলিভারি রুটে ৮-১০টা স্টপ, বা একটা সাবসেট নির্বাচনের সমস্যায় মাত্র ২০-২৫টা আইটেম), তাহলে এক্সপোনেনশিয়াল-সময়ের একটি সঠিক অ্যালগরিদমও ব্যবহারিকভাবে দ্রুত চলতে পারে — বিশেষ করে ভালো prune করা ব্যাকট্র্যাকিং (L36-L37) বা ব্রাঞ্চ-অ্যান্ড-বাউন্ড (L38-L39) ব্যবহার করলে, যা পুরো সার্চ স্পেস এক্সপ্লোর না করেই সঠিক অপ্টিমাম খুঁজে দেয়। এই পথে কোনো আপস করতে হয় না — আউটপুট সবসময় প্রকৃত অপ্টিমাম, শুধু সময়ের নিশ্চয়তা exponential (worst-case)।

নিচের কোডে দেখা যাক "ইনপুট ছোট" বলতে ব্যবহারিকভাবে কী বোঝায় — L39-এর TSP সমস্যার জন্য শহরের সংখ্যা বাড়লে ব্রুট-ফোর্স ট্যুরের সংখ্যা ($\,(n-1)!/2\,$) কত দ্রুত একটি অনুমিত "প্র্যাকটিক্যাল বাজেট" ছাড়িয়ে যায়।

Python
import math

def tsp_brute_force_tours(n):
    # n-টা শহরের জন্য (একটাকে শুরু ধরে, প্রতিসম দূরত্বে দিক-নির্বিশেষে) সম্ভাব্য ভিন্ন ট্যুরের সংখ্যা
    return math.factorial(n - 1) // 2

BUDGET = 10 ** 9  # ধরা যাক, একটি অনুমিত ("illustrative") প্র্যাকটিক্যাল বাজেট -- ১০০ কোটি অপারেশন
# (প্রকৃত থ্রেশহোল্ড হার্ডওয়্যার ও কনস্ট্যান্ট ফ্যাক্টরের উপর নির্ভরশীল -- এটি শুধু আপেক্ষিক গ্রোথ দেখানোর জন্য)

print(f"{'n (শহর সংখ্যা)':>16} | {'সম্ভাব্য ট্যুর সংখ্যা':>22} | {'বাজেটের মধ্যে?':>15}")
for n in range(4, 18):
    tours = tsp_brute_force_tours(n)
    within_budget = "হ্যাঁ" if tours <= BUDGET else "না"
    print(f"{n:>16} | {tours:>22,} | {within_budget:>15}")

    
আউটপুটে দেখা যাবে $n=13$ পর্যন্ত সম্ভাব্য ট্যুর সংখ্যা অনুমিত বাজেটের মধ্যে থাকে, কিন্তু $n=14$-এ তা ছাড়িয়ে যায় — মাত্র একটা শহর বাড়াতেই সীমা পার হয়ে যাওয়া factorial গ্রোথের বৈশিষ্ট্য। এই নির্দিষ্ট সংখ্যা ($10^9$ বাজেট) সম্পূর্ণভাবে ইলাস্ট্রেটিভ — বাস্তব থ্রেশহোল্ড হার্ডওয়্যার, ভালো prune করা ব্রাঞ্চ-অ্যান্ড-বাউন্ড ব্যবহার করা হচ্ছে কিনা (যা এই সংখ্যাকে অনেক বাড়িয়ে দিতে পারে, L39 দেখুন), এবং প্রতিটি ট্যুর মূল্যায়নের প্রকৃত খরচের উপর নির্ভর করে। মূল কথা হলো প্যাটার্নটা — factorial/exponential গ্রোথ একটা বাস্তবসম্মত সীমা দ্রুতই ছাড়িয়ে যায়, তাই "ইনপুট সবসময় ছোট" ধরে নেওয়ার আগে এই সীমাটা নিজের সমস্যার জন্য যাচাই করা জরুরি।

৩ · পথ ২ — প্রমাণিত-রেশিও অ্যাপ্রক্সিমেশন গ্রহণযোগ্য (M12)

যদি ইনপুট বড় হতে পারে, কিন্তু পুরোপুরি অপ্টিমাম না হয়ে একটা এমন উত্তরই যথেষ্ট যা প্রমাণিতভাবে সত্যিকারের অপ্টিমামের একটি নির্দিষ্ট গুণিতকের মধ্যে থাকে (যেমন সবসময় $\le 2 \times$ অপ্টিমাম) — তাহলে অ্যাপ্রক্সিমেশন অ্যালগরিদম এই আপসটা একটি গাণিতিক গ্যারান্টিসহ দেয়। এটি "হাল ছেড়ে দেওয়া" নয় — বরং একটি রিগোরাসভাবে প্রমাণিত trade-off। M12-এর L50-এ অ্যাপ্রক্সিমেশন রেশিওর আনুষ্ঠানিক সংজ্ঞা, L51-এ ভার্টেক্স কভার ও সেট কভারের ক্লাসিক ২-অ্যাপ্রক্সিমেশন, এবং L52-এ মেট্রিক TSP-এর MST-ভিত্তিক ২-অ্যাপ্রক্সিমেশন বিস্তারিত দেখা হবে।

৪ · পথ ৩ — অ্যাভারেজ-কেস পারফরম্যান্স জরুরি (M12)

কখনো কখনো ওয়ার্স্ট-কেস গ্যারান্টি (হয় সঠিকতার, নয় সময়ের) নিয়ে খুব বেশি চিন্তা না করে, বাস্তব-জীবনের সাধারণ (typical) ইনপুটে গড়ে ভালো পারফরম্যান্স হলেই যথেষ্ট। এমন ক্ষেত্রে র‍্যান্ডোমাইজেশন এবং হিউরিস্টিক পদ্ধতি কাজে লাগে — L16-এ আমরা ইতিমধ্যে দেখেছি কুইকসর্টের নেইভ ফিক্সড-পিভট ভার্সন adversarial ইনপুটে ধীর হয়ে যায় ($O(n^2)$); M12-এর L53-এ Las Vegas বনাম Monte Carlo র‍্যান্ডোমাইজড অ্যালগরিদমের পার্থক্য এবং L54-এ ঠিক এই adversarial-ইনপুট সমস্যাটা randomized pivot selection দিয়ে সমাধান করে (expected $O(n \log n)$) — একটি সরাসরি, গণনাকৃত payoff।

তিনটি পথ পরস্পর-বর্জনীয় নয়

বাস্তব সিস্টেমে প্রায়ই এই তিনটি কৌশলের সংমিশ্রণ ব্যবহার করা হয় — যেমন একটি অ্যাপ্রক্সিমেশন অ্যালগরিদমের আউটপুটকে একটি হিউরিস্টিক লোকাল-সার্চের সূচনা বিন্দু হিসেবে ব্যবহার করা, অথবা একটি বড় সমস্যাকে ছোট সাব-সমস্যায় ভেঙে প্রতিটি সাব-সমস্যায় এক্স্যাক্ট পদ্ধতি প্রয়োগ করা। M13-এর L55 কেস স্টাডিতে এই ধরনের বাস্তব সিদ্ধান্ত-গ্রহণ প্রক্রিয়া একটি সম্পূর্ণ উদাহরণে দেখা যাবে।

এরপর কোথায় — M12-এর সেতুবন্ধন

এই পাঠের মাধ্যমে M11 (NP-কমপ্লিটনেস ও ইনট্র্যাক্টেবিলিটি) শেষ হলো। এখন আমরা সরাসরি M12-এ প্রবেশ করব, যেখানে পথ ২ ও পথ ৩-এর কৌশলগুলো — অ্যাপ্রক্সিমেশন অ্যালগরিদম (L50-L52) ও র‍্যান্ডোমাইজড অ্যালগরিদম (L53-L54) — প্রতিটি তার নিজস্ব রিগোরাস গাণিতিক গ্যারান্টিসহ বিস্তারিতভাবে তৈরি ও যাচাই করা হবে।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ যদি একটি সমস্যায় ব্রাঞ্চ-অ্যান্ড-বাউন্ড ব্যবহার করেও ছোট ইনপুটে অগ্রহণযোগ্য রকম ধীর হয়, তাহলে কি সরাসরি অ্যাপ্রক্সিমেশনে চলে যাওয়া উচিত?

অবিলম্বে নয় — প্রথমে যাচাই করা উচিত pruning কৌশলটা (bound নির্ণয়ের পদ্ধতি) যথেষ্ট শক্তিশালী কিনা, কারণ একটি ভালো bound নাটকীয়ভাবে এক্সপ্লোর করা নোডের সংখ্যা কমাতে পারে (L38-L39-এ যেমন দেখা গেছে)। যদি সেরা চেষ্টার পরও এটি ব্যবহারিকভাবে অচল থাকে, তখনই পথ ২ (অ্যাপ্রক্সিমেশন) বা পথ ৩ (হিউরিস্টিক)-এ যাওয়া যুক্তিসঙ্গত। সিদ্ধান্তটা ক্রমিক — প্রতিটি পথ যাচাই করে দেখাই ভালো প্রকৌশল অভ্যাস।

প্র ০২ একটি প্রমাণিত অ্যাপ্রক্সিমেশন রেশিও (যেমন ২-অ্যাপ্রক্সিমেশন) থাকা সত্ত্বেও কেন কখনো কখনো ইঞ্জিনিয়াররা তবুও হিউরিস্টিক/মেটাহিউরিস্টিক পদ্ধতি বেছে নেন?

কারণ একটি প্রমাণিত রেশিও একটি ওয়ার্স্ট-কেস গ্যারান্টি — এটি নিশ্চিত করে ফলাফল কখনোই অমুক সীমার বেশি খারাপ হবে না, কিন্তু বাস্তব-জীবনের typical ইনস্ট্যান্সে হয়তো সেই ওয়ার্স্ট-কেসের ধারেকাছেও পৌঁছাবে না। ভালো-টিউন করা হিউরিস্টিক (যেমন সিমুলেটেড অ্যানিলিং বা লোকাল সার্চ) প্রায়ই বাস্তব ডেটাতে প্রমাণিত অ্যাপ্রক্সিমেশনের চেয়ে গড়ে ভালো ফলাফল দেয় — কিন্তু বিনিময়ে কোনো ওয়ার্স্ট-কেস গ্যারান্টি ছাড়াই। এটি "গ্যারান্টিযুক্ত কিন্তু রক্ষণশীল" বনাম "গড়ে ভালো কিন্তু গ্যারান্টিহীন" — একটি বাস্তব ইঞ্জিনিয়ারিং trade-off।

প্র ০৩ উপরের সিদ্ধান্ত-কাঠামোর তিনটি পথ কি পরস্পর-বর্জনীয় (mutually exclusive), নাকি একসাথে ব্যবহার করা যায়?

পরস্পর-বর্জনীয় নয়। বাস্তব সিস্টেমে প্রায়ই এদের সংমিশ্রণ দেখা যায় — যেমন একটি অ্যাপ্রক্সিমেশন অ্যালগরিদমের আউটপুটকে হিউরিস্টিক লোকাল-সার্চের প্রাথমিক সমাধান (starting point) হিসেবে ব্যবহার করা, অথবা একটি বড় সমস্যাকে ভেঙে প্রতিটি ছোট সাব-সমস্যায় এক্স্যাক্ট ব্যাকট্র্যাকিং প্রয়োগ করা। M13/L55-এর কেস স্টাডিতে এই ধরনের সংমিশ্রণ সিদ্ধান্ত-গ্রহণ প্রক্রিয়া বিস্তারিত দেখা যাবে।

অনুশীলন

  1. চিন্তা করুন: ধরুন আপনার সমস্যার $n$ (ইনপুট আকার) কখনোই ১৮-এর বেশি হবে না বলে নিশ্চিত। উপরের সিদ্ধান্ত-কাঠামোর কোন পথটি বেছে নেওয়া উচিত, এবং এই কোর্সের কোন মডিউলের কৌশল প্রয়োগ করবেন?

    পথ ১ — এক্স্যাক্ট পদ্ধতি। $n \le 18$ যথেষ্ট ছোট যে ভালো prune করা ব্যাকট্র্যাকিং বা ব্রাঞ্চ-অ্যান্ড-বাউন্ড (M8, L36-L39) ব্যবহারিকভাবে দ্রুত সময়ে প্রকৃত অপ্টিমাম খুঁজে দেবে — কোনো আপস ছাড়াই। শুধুমাত্র যদি এমনকি ভালো prune করার পরেও এটি অগ্রহণযোগ্য রকম ধীর হয়, তখনই পথ ২ বা ৩ বিবেচনা করা উচিত।

  2. পরীক্ষা করুন: কোড সেলের range(4, 18)-কে range(4, 22)-এ বদলে এবং BUDGET-কে 10 ** 12-এ বদলে Run চেপে দেখুন এই বৃহত্তর বাজেটেও ঠিক কোন $n$-এ সীমা ছাড়িয়ে যায়।

    $10^{12}$ বাজেটে সীমা আগের চেয়ে বেশি দূর যাবে ($n=16$ পর্যন্ত এখনও বাজেটের মধ্যে থাকবে, কিন্তু $n=17$-এ তা ছাড়িয়ে যাবে) — কিন্তু বাজেট ১০০০ গুণ বাড়ানো সত্ত্বেও সীমার $n$ মাত্র তিন ধাপ (১৩ থেকে ১৬-এ) এগোলো। এটাই factorial গ্রোথের বৈশিষ্ট্য — শুধু "আরও শক্তিশালী কম্পিউটার" ব্যবহার করা এক্সপোনেনশিয়াল/ফ্যাক্টোরিয়াল গ্রোথের সমস্যার প্রকৃত সমাধান নয়।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
NP-হার্ড সমস্যা চেনা — একটি প্র্যাকটিক্যাল টুলকিট