ক্যাপিটাল বাজেটিং ও ক্যাপিটাল র্যাশনিং
এই পাঠে যা শিখবেন
- ক্যাপিটাল বাজেটিং ও ক্যাপিটাল র্যাশনিং-এর সংজ্ঞা এবং সমস্যাটি কেন একটি "সাবসেট নির্বাচন" সমস্যা
- প্রফিটেবিলিটি ইনডেক্স (PI = PW/cost) কী এবং কীভাবে গ্রিডি র্যাংকিংয়ে ব্যবহৃত হয়
- Python-এ
itertools.combinationsদিয়ে সব সাবসেট পরীক্ষা করে সত্যিকারের অপ্টিমাল বাছাই বের করা - গ্রিডি PI-র্যাংকিং কখন ব্রুট-ফোর্স অপ্টিমালের সাথে মেলে না, তার একটি সৎ (honest) তুলনা
১ · ক্যাপিটাল বাজেটিং ও ক্যাপিটাল র্যাশনিং
ক্যাপিটাল বাজেটিংCapital Budgetingএকটি প্রতিষ্ঠানের সীমিত বিনিয়োগ-তহবিল একাধিক স্বাধীন প্রজেক্টের মধ্যে কীভাবে বণ্টন করা হবে তা সিদ্ধান্ত নেওয়ার প্রক্রিয়া। হলো প্রতিষ্ঠানের সীমিত মূলধন কোন কোন প্রজেক্টে বিনিয়োগ করা হবে তা ঠিক করার প্রক্রিয়া। যখন সব ধনাত্মক-PW প্রজেক্টে একসাথে বিনিয়োগ করার মতো যথেষ্ট বাজেট থাকে না, তখন একে ক্যাপিটাল র্যাশনিংCapital Rationingমোট বাজেট সীমিত থাকায় সব লাভজনক প্রজেক্টে বিনিয়োগ করা সম্ভব না হওয়ার পরিস্থিতি -- একটি সাবসেট বাছাই করতেই হয়। বলা হয়। এই পরিস্থিতিতে লক্ষ্য একটি একক প্রজেক্টের PW সর্বোচ্চ করা নয় — বরং বাজেটের মধ্যে থেকে প্রজেক্টগুলোর একটি সাবসেট (পোর্টফোলিও) বাছাই করা, যাদের মোট PW সবচেয়ে বেশি।
প্রতিটি প্রজেক্টের একটি খরচ (cost, নাপস্যাকে "ওজন"-এর মতো) ও একটি PW (মূল্য, "value"-এর মতো) আছে, আর মোট বাজেট একটি ধারণক্ষমতার সীমা (capacity constraint)। লক্ষ্য — বাজেটের মধ্যে থেকে সর্বোচ্চ মোট PW দেয় এমন প্রজেক্টের সমন্বয় বাছাই করা। প্রজেক্ট সংখ্যা কম হলে সব সম্ভাব্য সাবসেট (২ⁿ) সরাসরি পরীক্ষা করে অপ্টিমাল উত্তর নিশ্চিতভাবে বের করা যায়।
২ · প্রফিটেবিলিটি ইনডেক্স ও গ্রিডি র্যাংকিং
প্রতিটি প্রজেক্টের প্রফিটেবিলিটি ইনডেক্স (PI)Profitability Indexপ্রতি ডলার বিনিয়োগে কত PW পাওয়া যায় তার অনুপাত -- PW/cost। হলো $PI = PW / cost$ — প্রতি ডলার বিনিয়োগে কতটা PW পাওয়া যায় তার একটি অনুপাত। একটি সহজাত স্বজ্ঞা (intuition) হলো — PI অনুযায়ী প্রজেক্টগুলো সাজিয়ে, সবচেয়ে বেশি PI-ওয়ালা প্রজেক্ট থেকে শুরু করে বাজেট শেষ না হওয়া পর্যন্ত একে একে যোগ করা (গ্রিডি পদ্ধতি)। এটি প্রায়ই ভালো ফলাফল দেয়, কিন্তু গ্যারান্টিযুক্ত অপ্টিমাল নয় — কারণ গ্রিডি পদ্ধতি একবার একটি প্রজেক্ট বাদ দিলে আর ফিরে যায় না, এমনকি সেটা বাদ দিলে পরে আরও ভালো একটি কম্বিনেশন সম্ভব হলেও।
৩ · Python-এ প্রয়োগ — ব্রুট-ফোর্স সাবসেট সার্চ বনাম গ্রিডি
ধরা যাক ৬টি স্বাধীন প্রজেক্ট (A-F) আছে, প্রতিটির নিজস্ব খরচ ও PW, এবং মোট বাজেট $100,000।
নিচের কোডে itertools.combinations দিয়ে সব $2^6 = 64$টি সাবসেট পরীক্ষা করে
বাজেটের মধ্যে থাকা সাবসেটগুলোর মধ্যে যেটার মোট PW সবচেয়ে বেশি, সেটাই অপ্টিমাল পোর্টফোলিও হিসেবে বের করা হবে
— এরপর এটিকে PI-ভিত্তিক গ্রিডি ফলাফলের সাথে তুলনা করা হবে।
# ক্যাপিটাল বাজেটিং -- ব্রুট-ফোর্স সাবসেট সার্চ বনাম প্রফিটেবিলিটি-ইনডেক্স গ্রিডি
import itertools
# প্রতিটি প্রজেক্ট: (cost, PW)
projects = {
'A': (20000, 5000),
'B': (30000, 9000),
'C': (25000, 6000),
'D': (15000, 4500),
'E': (40000, 11000),
'F': (35000, 8000),
}
budget = 100000
names = list(projects.keys())
# --- প্রফিটেবিলিটি ইনডেক্স প্রিন্ট করা ---
print("প্রফিটেবিলিটি ইনডেক্স (PI = PW / cost):")
for p in names:
cost, pw = projects[p]
print(f" {p}: cost=${cost:,.0f}, PW=${pw:,.0f}, PI={pw / cost:.3f}")
# --- ব্রুট-ফোর্স: সব সম্ভাব্য সাবসেট (2^6 = 64টি) পরীক্ষা করা ---
best_subset, best_cost, best_pw = (), 0, -1
for r in range(len(names) + 1):
for combo in itertools.combinations(names, r):
total_cost = sum(projects[p][0] for p in combo)
if total_cost > budget:
continue # বাজেটের মধ্যে না থাকলে বাতিল
total_pw = sum(projects[p][1] for p in combo)
if total_pw > best_pw:
best_subset, best_cost, best_pw = combo, total_cost, total_pw
print(f"\nব্রুট-ফোর্স অপ্টিমাল সাবসেট: {best_subset}")
print(f"মোট খরচ = ${best_cost:,.0f} (বাজেট ${budget:,.0f}-এর মধ্যে), মোট PW = ${best_pw:,.0f}")
# --- গ্রিডি: PI অনুযায়ী নামিয়ে সাজিয়ে, বাজেট শেষ না হওয়া পর্যন্ত যোগ করা ---
sorted_by_pi = sorted(names, key=lambda p: projects[p][1] / projects[p][0], reverse=True)
greedy_subset, greedy_cost, greedy_pw = [], 0, 0
for p in sorted_by_pi:
cost, pw = projects[p]
if greedy_cost + cost <= budget:
greedy_subset.append(p)
greedy_cost += cost
greedy_pw += pw
print(f"\nগ্রিডি (PI-অনুযায়ী) সাবসেট: {greedy_subset}")
print(f"মোট খরচ = ${greedy_cost:,.0f}, মোট PW = ${greedy_pw:,.0f}")
print()
if greedy_pw == best_pw:
print("গ্রিডি ও ব্রুট-ফোর্স একই ফলাফল দিয়েছে -- এই ক্ষেত্রে গ্রিডিও অপ্টিমাল।")
else:
print(f"গ্রিডি সাব-অপ্টিমাল -- ব্রুট-ফোর্স অপ্টিমাল (${best_pw:,.0f}) গ্রিডির (${greedy_pw:,.0f})-এর চেয়ে "
f"${best_pw - greedy_pw:,.0f} বেশি PW দেয়।")
ক্যাপিটাল র্যাশনিং একটি সাবসেট-নির্বাচন (নাপস্যাক-ধরনের) সমস্যা — লক্ষ্য একটি একক প্রজেক্টের রিটার্ন নয়, বরং বাজেটের মধ্যে থেকে মোট PW সর্বোচ্চ করা। প্রজেক্ট সংখ্যা কম হলে ব্রুট-ফোর্স সাবসেট সার্চ নিশ্চিত অপ্টিমাল উত্তর দেয়; প্রফিটেবিলিটি-ইনডেক্স গ্রিডি র্যাংকিং একটি দ্রুত heuristic, কিন্তু সবসময় নির্ভরযোগ্য নয়।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ গ্রিডি পদ্ধতি কেন {A, B, D, F} সাবসেটটি খুঁজে পায়নি, যদিও এটি বাজেটের মধ্যেই ফিট করে?
গ্রিডি পদ্ধতি প্রথমে সবচেয়ে বেশি PI-ওয়ালা প্রজেক্ট (B ও D) নেয়, তারপর পরবর্তী সেরা PI-ওয়ালা E নেয় — কিন্তু একবার E নেওয়ার পর বাকি বাজেটে ($15,000) A, C বা F কোনোটাই আর ফিট করে না। গ্রিডি পদ্ধতি একবার একটি প্রজেক্ট নেওয়ার পর পিছিয়ে গিয়ে "যদি E না নিয়ে A+F নিতাম" এই ধরনের বিকল্প কম্বিনেশন যাচাই করে না — এটাই তার সীমাবদ্ধতা।
প্র ০২ প্রজেক্ট সংখ্যা ৬ থেকে বেড়ে ৩০ হলে ব্রুট-ফোর্স পদ্ধতিতে কী সমস্যা হবে?
সাবসেট সংখ্যা $2^{30}$ ≈ ১০০ কোটিরও বেশি হয়ে যাবে, যা ব্রুট-ফোর্স দিয়ে যুক্তিসঙ্গত সময়ে পরীক্ষা করা প্রায় অসম্ভব হয়ে পড়বে। বড় সংখ্যক প্রজেক্টের জন্য ডাইনামিক প্রোগ্রামিং (knapsack DP) বা অন্যান্য অপ্টিমাইজেশন কৌশল ব্যবহার করা হয়, যা এই কোর্সের পরিধির বাইরে।
প্র ০৩
উপরের কোডে if total_cost > budget: continue লাইনটি বাদ দিলে ফলাফলে কী ভুল হতো?
এই লাইনটি বাদ দিলে বাজেট-সীমা ছাড়িয়ে যাওয়া সাবসেটগুলোও PW তুলনায় অংশ নিত, ফলে best_subset
এমন একটি কম্বিনেশন হতে পারত যার মোট খরচ $100,000-এর বেশি — যা বাস্তবে সম্ভবই না। এই ফিল্টার
(feasibility check) না থাকলে পুরো ক্যাপিটাল-র্যাশনিং constraint-টাই উপেক্ষিত হয়ে যেত।
অনুশীলন
-
চিন্তা করুন: কেন একটি প্রজেক্টের PW বেশি হলেও, শুধু PW-এর ভিত্তিতে (PI না দেখে) র্যাংক
করলে ক্যাপিটাল র্যাশনিং সমস্যায় ভুল সিদ্ধান্ত হতে পারে?
শুধু PW দেখলে বড় খরচের প্রজেক্ট (যেমন E, PW=$11,000) সবসময় ছোট প্রজেক্টের চেয়ে "ভালো" মনে হবে, কিন্তু আসলে সেই বড় খরচ বাজেটের বড় একটি অংশ দখল করে ফেলে, ফলে অন্য একাধিক ছোট প্রজেক্ট বাদ পড়ে যায়। PI (PW প্রতি ডলার বিনিয়োগ) বিবেচনায় নিলে বোঝা যায় কোন প্রজেক্ট সীমিত বাজেটের প্রতি ডলার থেকে বেশি মূল্য বের করে আনছে।
-
পরীক্ষা করুন: উপরের কোড সেলে
budget-কে100000থেকে120000-এ বদলে Run চেপে দেখুন ব্রুট-ফোর্স অপ্টিমাল সাবসেট বদলায় কি না।বাজেট $120,000 হলে আরও বেশি প্রজেক্ট কম্বিনেশন সম্ভব হবে (যেমন সব ৬টি প্রজেক্টের মোট খরচ $165,000, তাই এখনো সবগুলো একসাথে ফিট করবে না, কিন্তু কিছু বড় কম্বিনেশন এখন ফিট করবে যা আগে করত না) — ব্রুট-ফোর্স সার্চ স্বয়ংক্রিয়ভাবে নতুন বাজেট-সীমার মধ্যে নতুন অপ্টিমাল সাবসেট খুঁজে বের করবে।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ টাইম ভ্যালু অফ মানি, ক্যাশ ফ্লো সিরিজ, ওয়ার্থ-ভিত্তিক তুলনা, রেট অফ রিটার্ন, ডেপ্রিসিয়েশন, ট্যাক্স, ইনফ্লেশন, রিস্ক অ্যানালাইসিস ও ক্যাপিটাল বাজেটিং — সম্পূর্ণ কোর্স এক জায়গায়।
- পরের পাঠ L54 মাল্টিপল অ্যাট্রিবিউট ডিসিশন-মেকিং — যখন সিদ্ধান্তে শুধু টাকা নয়, নন-মনিটারি ক্রাইটেরিয়াও বিবেচনা করতে হয়।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps, Computer Networks, Operating Systems, Computer Architecture, Programming Languages & Compiler Design, Software Engineering & Git, Theory of Computation ও Engineering Economics — সব এক জায়গায়।