অ্যাপ্রক্সিমেশন অ্যালগরিদম ও অ্যাপ্রক্সিমেশন রেশিও
এই পাঠে যা শিখবেন
- অ্যাপ্রক্সিমেশন রেশিওর আনুষ্ঠানিক সংজ্ঞা — মিনিমাইজেশন ও ম্যাক্সিমাইজেশন উভয় সমস্যার জন্য
- "$k$-অ্যাপ্রক্সিমেশন অ্যালগরিদম" বলতে ঠিক কী বোঝায়, এবং কেন এটি একটি ওয়ার্স্ট-কেস গ্যারান্টি
- মাল্টিপ্রসেসর শিডিউলিং-এর জন্য একটি সম্পূর্ণ ২-অ্যাপ্রক্সিমেশন প্রমাণ, ধাপে ধাপে
- প্রমাণটি ব্রুট-ফোর্স অপটিমাম-এর বিপরীতে সত্যিকারের কোডে যাচাই করা — রেশিও সত্যিই কখনো ২ ছাড়ায় না তা দেখা
১ · কেন আমাদের একটি সংখ্যা দরকার, শুধু "কাছাকাছি" যথেষ্ট নয়
L49-এ আমরা দেখেছি — একটি সমস্যা NP-হার্ড হলে (এবং $P \ne NP$ ধরে নিলে) পলিনোমিয়াল সময়ে সবসময় সঠিক উত্তর পাওয়ার কোনো নিশ্চয়তা নেই। একটি বাস্তবসম্মত পথ হলো এমন একটি পলিনোমিয়াল-সময়ের অ্যালগরিদম ডিজাইন করা যা অপটিমাল না হলেও, অপটিমামের কতটা কাছাকাছি থাকে তার একটি প্রমাণিত, গাণিতিক গ্যারান্টি দেয়। শুধু "সাধারণত ভালো ফল দেয়" বলাটা যথেষ্ট নয় — একজন অ্যালগরিদম ডিজাইনারের দরকার একটি সংখ্যা, এবং সেই সংখ্যাটি সব সম্ভাব্য ইনপুটে সত্য হতে হবে, শুধু টেস্ট করা কয়েকটাতে নয়।
২ · অ্যাপ্রক্সিমেশন রেশিওর আনুষ্ঠানিক সংজ্ঞা
ধরা যাক একটি অপটিমাইজেশন সমস্যার একটি ইনস্ট্যান্স $I$ আছে, $\text{OPT}(I)$ হলো সেই ইনস্ট্যান্সের সত্যিকারের অপটিমাল সমাধানের মান (cost বা value), এবং $\text{ALG}(I)$ হলো আমাদের পলিনোমিয়াল-সময়ের অ্যালগরিদম ALG-এর দেওয়া সমাধানের মান। একটি মিনিমাইজেশন সমস্যার জন্য (যেমন ভার্টেক্স কভার, TSP — যেখানে ছোট মান ভালো, এবং যেকোনো বৈধ সমাধানের মান অপটিমামের চেয়ে বড় বা সমান, অর্থাৎ $\text{ALG}(I) \ge \text{OPT}(I)$):
ALG একটি $k$-অ্যাপ্রক্সিমেশন অ্যালগরিদমk-Approximation Algorithmএমন একটি পলিনোমিয়াল-সময়ের অ্যালগরিদম যার সমাধানের মান, প্রতিটি সম্ভাব্য ইনস্ট্যান্সে, সত্যিকারের অপটিমামের একটি নির্দিষ্ট, প্রমাণিত ফ্যাক্টর $k$-এর বেশি খারাপ হয় না।, যদি একটি ধ্রুবক $k \ge 1$ থাকে যেন প্রতিটি ইনস্ট্যান্স $I$-এর জন্য:
$$\frac{\text{ALG}(I)}{\text{OPT}(I)} \le k$$লক্ষ্য করুন — এই অসমতাটি $I$-এর উপর নির্ভর করে না; $k$ একটি একক ধ্রুবক সংখ্যা যা সব সম্ভাব্য ইনপুটে কাজ করতে হবে। যদি কোনো একটি (এমনকি বিরল) ইনস্ট্যান্সে রেশিও $k$ ছাড়িয়ে যায়, তাহলে ALG একটি $k$-অ্যাপ্রক্সিমেশন নয় — এই একটি কাউন্টার-এক্সাম্পলই দাবিটি খণ্ডন করার জন্য যথেষ্ট (ঠিক যেমন L19-এ একটি কাউন্টার-এক্সাম্পল একটি গ্রিডি স্ট্র্যাটেজির সাধারণ সঠিকতার দাবি খণ্ডন করেছিল)।
ম্যাক্সিমাইজেশন সমস্যার জন্য (যেমন ম্যাক্স-কাট, ম্যাক্স-স্যাট — যেখানে বড় মান ভালো, এবং $\text{ALG}(I) \le \text{OPT}(I)$) দিকটা উল্টে যায়:
$$\frac{\text{OPT}(I)}{\text{ALG}(I)} \le k \quad\Longleftrightarrow\quad \text{ALG}(I) \ge \frac{1}{k}\,\text{OPT}(I)$$উভয় ক্ষেত্রেই $k=1$ মানে অ্যালগরিদমটি সবসময় ঠিক অপটিমাল — অর্থাৎ একটি সাধারণ এক্সাক্ট অ্যালগরিদম। $k$ যত বড় হয়, গ্যারান্টি তত দুর্বল। এই কোর্সে আমরা $k=2$-এর মতো ছোট, ধ্রুবক-ফ্যাক্টর গ্যারান্টি নিয়ে কাজ করব (L51-L52), যা ব্যবহারিকভাবে খুবই মূল্যবান।
এটি বোঝা গুরুত্বপূর্ণ: $k$-অ্যাপ্রক্সিমেশন বলে না যে অ্যালগরিদম গড়ে $k$ গুণ খারাপ — বরং এটি বলে রেশিও কখনোই $k$ ছাড়ায় না, এমনকি সবচেয়ে খারাপ (adversarially constructed) ইনস্ট্যান্সেও না। বাস্তবে অধিকাংশ ইনস্ট্যান্সে অ্যালগরিদম $k$-এর চেয়ে অনেক ভালো করতে পারে — কিন্তু গ্যারান্টিটা সবসময় সবচেয়ে খারাপ কেসের জন্য প্রমাণ করতে হয়, ঠিক যেমন Big-O অ্যানালাইসিসে ওয়ার্স্ট কেস ধরা হয় (L08)।
৩ · একটি সম্পূর্ণ উদাহরণ — মাল্টিপ্রসেসর শিডিউলিং-এ গ্রিডি ২-অ্যাপ্রক্সিমেশন
ধারণাটি concrete করতে একটি সম্পূর্ণ, স্বয়ংসম্পূর্ণ উদাহরণ দেখা যাক (ভার্টেক্স কভার ও TSP-র জন্য পূর্ণাঙ্গ ট্রিটমেন্ট আসছে L51-L52-এ)। সমস্যা: $n$টি জব আছে, প্রতিটির প্রসেসিং টাইম $p_1,\dots,p_n$; $m$টি অভিন্ন মেশিন আছে। লক্ষ্য: জবগুলো মেশিনে ভাগ করে দেওয়া যাতে মেকস্প্যান (সবচেয়ে বেশি লোডেড মেশিনের সমাপ্তি সময়) মিনিমাইজ হয়। এই সমস্যাটি NP-হার্ড।
গ্রিডি লিস্ট শিডিউলিং: জবগুলো যেকোনো ক্রমে নিয়ে, প্রতিটি জবকে বর্তমানে সবচেয়ে কম লোডেড মেশিনে বসিয়ে দাও।
দাবি: এই গ্রিডি অ্যালগরিদম একটি ২-অ্যাপ্রক্সিমেশন, অর্থাৎ প্রতিটি ইনস্ট্যান্সে $\text{ALG}(I) \le 2 \cdot \text{OPT}(I)$।
প্রমাণ:
- ধরা যাক মেশিন $M$ চূড়ান্ত মেকস্প্যান $L = \text{ALG}(I)$ অর্জন করেছে, এবং $p_j$ হলো $M$-এ শেষে বসানো জব।
- যে মুহূর্তে $p_j$ বসানো হয়েছিল, $M$-এর লোড ছিল সব মেশিনের মধ্যে সর্বনিম্ন (নাহলে গ্রিডি অন্য মেশিন বেছে নিত) — ধরি এই লোড $L'$। তাই $L = L' + p_j$।
- $L'$ যেহেতু $m$টি মেশিনের মধ্যে সর্বনিম্ন লোড, তাই সেই মুহূর্তে বসানো সব কাজের সমষ্টি $\ge m \cdot L'$। এই সমষ্টি মোট কাজ $W = \sum_i p_i$-এর বেশি হতে পারে না, আর $\text{OPT}(I) \ge W/m$ (কারণ অপটিমাম শিডিউলকেও একই $W$ কাজ $m$টি মেশিনে ভাগ করতে হয়)। তাই $L' \le W/m \le \text{OPT}(I)$।
- $p_j \le \text{OPT}(I)$ — কারণ অপটিমাল শিডিউলেও জব $j$ কোনো-না-কোনো একটি মেশিনে বসে, আর সেই মেশিনের লোড (তাই মেকস্প্যান $\text{OPT}(I)$) অন্তত $p_j$ হতে বাধ্য।
- যোগ করলে: $L = L' + p_j \le \text{OPT}(I) + \text{OPT}(I) = 2\,\text{OPT}(I)$।
এই যুক্তি যেকোনো ইনস্ট্যান্সের জন্য সত্য (কোনো নির্দিষ্ট $n$, $m$, বা $p_i$ ধরে নেওয়া হয়নি) — তাই এটি একটি প্রকৃত, সাধারণ প্রমাণ, কোনো উদাহরণ-ভিত্তিক পর্যবেক্ষণ নয়।
এবার প্রমাণটি সত্যিই ধরে কি না — সেটা ব্রুট-ফোর্স অপটিমাম-এর বিপরীতে কোডে যাচাই করা যাক:
import random
import itertools
import math
def greedy_list_scheduling(jobs, m):
# প্রতিটি জব বর্তমানে সবচেয়ে কম-লোডেড মেশিনে বসানো হয়
loads = [0] * m
for p in jobs:
i = loads.index(min(loads))
loads[i] += p
return max(loads)
def brute_force_makespan(jobs, m):
# সব সম্ভাব্য জব-থেকে-মেশিন অ্যাসাইনমেন্ট (m^n) পরীক্ষা করে সত্যিকারের অপটিমাম বের করা
n = len(jobs)
best = math.inf
for assignment in itertools.product(range(m), repeat=n):
loads = [0] * m
for job_idx, machine in enumerate(assignment):
loads[machine] += jobs[job_idx]
best = min(best, max(loads))
return best
rng = random.Random(5)
worst_ratio = 0.0
print(f"{'trial':>5} | {'n':>3} | {'m':>3} | {'ALG':>5} | {'OPT':>5} | {'ratio':>6}")
for trial in range(12):
n = rng.randint(3, 7)
m = rng.randint(2, 3)
jobs = [rng.randint(1, 20) for _ in range(n)]
alg = greedy_list_scheduling(jobs, m)
opt = brute_force_makespan(jobs, m)
ratio = alg / opt
worst_ratio = max(worst_ratio, ratio)
print(f"{trial:>5} | {n:>3} | {m:>3} | {alg:>5} | {opt:>5} | {ratio:>6.2f}")
assert ratio <= 2 + 1e-9, "২-অ্যাপ্রক্সিমেশন বাউন্ড ভঙ্গ হয়েছে!"
print(f"\nসর্বোচ্চ পর্যবেক্ষিত ratio (ALG/OPT): {worst_ratio:.2f} -- সবসময় <= 2.00")
assert সত্যিই চেক করছে রেশিও কখনো ২ ছাড়ায়নি। বাস্তবে বেশিরভাগ
ট্রায়ালে রেশিও ২-এর অনেক নিচে (প্রায়ই ১.০-১.৩) — মনে রাখবেন, ২ হলো ওয়ার্স্ট-কেস গ্যারান্টি, প্রতিটি
ইনস্ট্যান্সের নিশ্চিত ফলাফল নয়।
এই একই ধরনের প্রমাণ-প্লাস-কম্পিউটেশনাল-যাচাই কাঠামো এখন দুটি ক্লাসিক NP-হার্ড সমস্যায় প্রয়োগ হবে: L51-এ ভার্টেক্স কভার-এর জন্য একটি ম্যাক্সিমাল-ম্যাচিং-ভিত্তিক ২-অ্যাপ্রক্সিমেশন (এবং সেট কভার-এর সাধারণীকরণ), আর L52-এ মেট্রিক TSP-র জন্য একটি MST-ভিত্তিক ২-অ্যাপ্রক্সিমেশন। উভয় ক্ষেত্রেই একই প্যাটার্ন: প্রমাণিত রেশিও + ব্রুট-ফোর্স অপটিমামের বিপরীতে সত্যিকারের কোড যাচাই।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ উপরের কোডে বেশিরভাগ ট্রায়ালে রেশিও ২-এর অনেক নিচে ছিল। তাহলে কি বলা ঠিক হবে যে এই অ্যালগরিদম "১.৩-অ্যাপ্রক্সিমেশন"?
না। $k$-অ্যাপ্রক্সিমেশনের সংজ্ঞা অনুযায়ী $k$ এমন একটি ধ্রুবক হতে হবে যা সব সম্ভাব্য ইনস্ট্যান্সে সত্য — শুধু কিছু র্যান্ডম টেস্ট কেসে পর্যবেক্ষিত সর্বোচ্চ মান নয়। এই নির্দিষ্ট গ্রিডি অ্যালগরিদমের জন্য প্রমাণ করা যায় (এবং বিশেষভাবে নির্মিত adversarial ইনস্ট্যান্সে দেখানো যায়) যে রেশিও $2 - 1/m$-এর কাছাকাছি পৌঁছাতে পারে, তাই "২-অ্যাপ্রক্সিমেশন" দাবিটাই সঠিক ও টাইট — এলোমেলো টেস্টে গড়ে ভালো ফল পাওয়া তার প্রমাণ নয়, শুধু একটি সমর্থনকারী পর্যবেক্ষণ।
প্র ০২ প্রমাণের ধাপ ৪-এ বলা হয়েছে $p_j \le \text{OPT}(I)$। এটি কি সবসময় সত্যি, নাকি শুধু এই নির্দিষ্ট অ্যালগরিদমের জন্য?
এটি সবসময় সত্যি, ALG-এর সাথে সম্পর্কহীন একটি সাধারণ পর্যবেক্ষণ: যেকোনো বৈধ শিডিউলে (অপটিমালসহ) জব $j$ কোনো-না-কোনো একটি মেশিনে বসতেই হবে, এবং সেই মেশিনের সমাপ্তি সময় অন্তত $p_j$ (একা এই জবটির সময়ই)। যেহেতু মেকস্প্যান হলো সব মেশিনের মধ্যে সর্বোচ্চ সমাপ্তি সময়, তাই $\text{OPT}(I) \ge p_j$ — এটি প্রতিটি জবের জন্যই, প্রতিটি বৈধ শিডিউলের জন্যই সত্য।
প্র ০৩ যদি $m=1$ (মাত্র একটি মেশিন) হয়, তাহলে এই সমস্যাটি এবং গ্রিডি অ্যালগরিদম নিয়ে কী বলা যায়?
$m=1$ হলে সব জবই একমাত্র মেশিনে বসবে, তাই মেকস্প্যান সবসময় $\sum_i p_i$ — শিডিউলিং অর্ডারের উপর একদমই নির্ভর করে না। এক্ষেত্রে গ্রিডি ও ব্রুট-ফোর্স উভয়ই ঠিক একই মান দেবে (ratio = 1), কারণ সমস্যাটি এই বিশেষ কেসে তুচ্ছ (trivial) হয়ে যায় — কোনো সিদ্ধান্তই নেওয়ার সুযোগ নেই। NP-হার্ডনেস এখানেই আসে $m \ge 2$ হলে, যখন জব-থেকে-মেশিন অ্যাসাইনমেন্ট সত্যিকারের একটি সিদ্ধান্ত হয়ে ওঠে।
অনুশীলন
-
চিন্তা করুন: ৪টি জব ($p = [5, 5, 5, 5]$) এবং $m=2$ মেশিন থাকলে, গ্রিডি লিস্ট শিডিউলিং কী
মেকস্প্যান দেবে বলে মনে হয়, এবং সত্যিকারের অপটিমাম কত?
গ্রিডি প্রতিটি জব একে একে সবচেয়ে কম-লোডেড মেশিনে বসাবে: জব ১ → মেশিন A (লোড ৫), জব ২ → মেশিন B (লোড ৫), জব ৩ → A বা B (উভয়ই ৫, ধরি A, লোড ১০), জব ৪ → B (লোড ১০)। ফলাফল: মেকস্প্যান = ১০, যা আসলে অপটিমামও বটে (দুই মেশিনে সমান ভাগে ভাগ করাই সেরা সম্ভাব্য উপায়, কারণ মোট কাজ ২০, তাই $\text{OPT} \ge 20/2 = 10$)। এই কেসে গ্রিডি রেশিও ১.০।
-
পরীক্ষা করুন: উপরের কোড সেলে
rng = random.Random(5)-এর জায়গায়rng = random.Random(99)বসিয়ে Run চেপে দেখুন সর্বোচ্চ পর্যবেক্ষিত রেশিও কেমন আসে — এটি এখনো $\le 2.00$ থাকে কি না তাassertনিজেই যাচাই করে দেখাবে।seed পরিবর্তন করলে র্যান্ডম জব ও মেশিন সংখ্যা বদলে যাবে, তাই টেবিলের সংখ্যাগুলো ভিন্ন হবে — কিন্তু প্রতিটি ট্রায়ালেই
assert ratio <= 2 + 1e-9পাস করবে, কারণ প্রমাণটি নির্দিষ্ট কোনো seed-এর উপর নির্ভর করে না, বরং সব সম্ভাব্য ইনস্ট্যান্সের জন্য সাধারণভাবে সত্য।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পরবর্তী পাঠ — ভার্টেক্স কভার ও সেট কভার অ্যাপ্রক্সিমেশন L51 এই একই ২-অ্যাপ্রক্সিমেশন ফ্রেমওয়ার্ক একটি ক্লাসিক গ্রাফ সমস্যায় প্রয়োগ — ম্যাক্সিমাল ম্যাচিং ব্যবহার করে।
- Theory of Computation কোর্স সহোদর কোর্স NP-কমপ্লিটনেসের আনুষ্ঠানিক তত্ত্ব ও কেন এই সমস্যাগুলো এক্সাক্ট পলিনোমিয়াল-সময় সমাধানযোগ্য নয় (বিশ্বাস করা হয়) তার প্রমাণ।
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ অ্যাসিম্পটোটিক অ্যানালাইসিস, রিকারেন্স, ডিভাইড অ্যান্ড কনকার, গ্রিডি, DP, গ্রাফ অ্যালগরিদম, ব্যাকট্র্যাকিং, স্ট্রিং অ্যালগরিদম, অ্যামর্টাইজড অ্যানালাইসিস, NP-কমপ্লিটনেস, অ্যাপ্রক্সিমেশন ও র্যান্ডোমাইজড অ্যালগরিদম — বাকি পাঠগুলো শীঘ্রই যুক্ত হবে।