পাঠ ৪৫ · ৫৭-এর মধ্যে · মডিউল ৯
Home / Courses / Numerical Methods / অপ্টিমাইজেশন

কনস্ট্রেইনড অপ্টিমাইজেশন — লাগ্রাঞ্জ মাল্টিপ্লায়ার

Constrained optimization — Lagrange multipliers
৯ মিনিট পড়া মধ্যম-কঠিন · Intermediate-Advanced Python কোডসহ সম্পূর্ণ বাংলায়

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

  • কনস্ট্রেইনড অপ্টিমাইজেশন সমস্যা কী, এবং কেন আনকনস্ট্রেইনড মেথড সরাসরি প্রয়োগ করা যায় না
  • লাগ্রাঞ্জিয়ান ফাংশন কীভাবে তৈরি হয়, এবং লাগ্রাঞ্জ মাল্টিপ্লায়ার λ কী বোঝায়
  • একটি সত্যিকারের, হাতে-সমাধান করা উদাহরণ — সমীকরণের সিস্টেম সেট আপ করে গসিয়ান এলিমিনেশন দিয়ে সমাধান
  • সমাধানে কনস্ট্রেইন্ট সত্যিই সন্তুষ্ট হয়েছে কিনা তা যাচাই করা

১ · কনস্ট্রেইনড অপ্টিমাইজেশন সমস্যা

মনে করুন আমরা f(x, y)-এর মিনিমাম খুঁজছি, কিন্তু (x, y)-কে অবশ্যই একটি শর্ত g(x, y) = 0 মেনে চলতে হবে (যেমন x + y = 6, যা g(x,y) = x + y - 6 = 0 আকারে লেখা যায়)। সরাসরি ∇f = 0 সমাধান করলে যে বিন্দু পাওয়া যাবে তা হয়তো কনস্ট্রেইন্ট মানবে না — আমাদের এমন বিন্দু চাই যা কনস্ট্রেইন্ট-এর "উপর থেকে" f-কে যতটা সম্ভব ছোট করে।

কেন সরাসরি মিনিমাইজ করা যায় না
f-এর আনকনস্ট্রেইনড মিনিমাম প্রায়ই কনস্ট্রেইন্ট-এর বাইরে পড়ে যায় — আমাদের কনস্ট্রেইন্ট-এর "উপরিতল" বরাবর সবচেয়ে ছোট মান খুঁজতে হয়।
মূল অন্তর্দৃষ্টি
মিনিমাম বিন্দুতে f-এর গ্র্যাডিয়েন্ট এবং g-এর গ্র্যাডিয়েন্ট সমান্তরাল (parallel) হতে হবে — অর্থাৎ ∇f = λ∇g কোনো ধ্রুবক λ-এর জন্য।
লাগ্রাঞ্জিয়ান
একটি সহায়ক ফাংশন L(x,y,λ) = f(x,y) - λ·g(x,y) তৈরি করে, এর তিনটি আংশিক ডেরিভেটিভ শূন্যে বসিয়ে একটি সমীকরণ-সিস্টেম পাওয়া যায়।

২ · লাগ্রাঞ্জিয়ান সেট আপ করা

টেস্ট সমস্যা: f(x,y) = (x-1)² + (y-2)²-কে মিনিমাইজ করো, শর্ত g(x,y) = x + y - 6 = 0-এর অধীনে। লাগ্রাঞ্জিয়ান:

$$ L(x, y, \lambda) = (x-1)^2 + (y-2)^2 - \lambda (x + y - 6) $$

তিনটি আংশিক ডেরিভেটিভ শূন্যে বসিয়ে (KKT শর্ত):

$$ \frac{\partial L}{\partial x} = 2(x-1) - \lambda = 0, \qquad \frac{\partial L}{\partial y} = 2(y-2) - \lambda = 0, \qquad \frac{\partial L}{\partial \lambda} = -(x+y-6) = 0 $$

এই তিনটি সমীকরণ পুনর্বিন্যাস করে একটি 3×3 লিনিয়ার সিস্টেম পাওয়া যায় — 2x - λ = 2, 2y - λ = 4, এবং x + y = 6 — যা M3/L10-এর গসিয়ান এলিমিনেশন দিয়ে সরাসরি সমাধানযোগ্য।

Python
def gaussian_elimination(A, b):
    n = len(A)
    M = [row[:] + [b[i]] for i, row in enumerate(A)]
    for col in range(n):
        pivot_row = max(range(col, n), key=lambda r: abs(M[r][col]))
        M[col], M[pivot_row] = M[pivot_row], M[col]
        pivot = M[col][col]
        for r in range(col + 1, n):
            factor = M[r][col] / pivot
            for c in range(col, n + 1):
                M[r][c] -= factor * M[col][c]
    x = [0.0] * n
    for i in range(n - 1, -1, -1):
        s = M[i][n] - sum(M[i][j] * x[j] for j in range(i + 1, n))
        x[i] = s / M[i][i]
    return x

# minimize f(x,y) = (x-1)^2 + (y-2)^2  subject to  g(x,y) = x + y - 6 = 0
# KKT system:  2x - lambda = 2 ; 2y - lambda = 4 ; x + y = 6
A = [
    [2, 0, -1],
    [0, 2, -1],
    [1, 1,  0],
]
b = [2, 4, 6]

x, y, lam = gaussian_elimination(A, b)
print(f"x = {x:.6f}, y = {y:.6f}, lambda = {lam:.6f}")

def f(x, y):
    return (x - 1)**2 + (y - 2)**2

print(f"f(x, y) = {f(x, y):.6f}")

constraint_value = x + y - 6
print(f"কনস্ট্রেইন্ট চেক: x + y - 6 = {constraint_value:.10f}  (শূন্যের কাছাকাছি হওয়া উচিত)")

r1 = 2*x - lam - 2
r2 = 2*y - lam - 4
r3 = x + y - 6
print(f"রেসিডুয়াল চেক: r1={r1:.2e}, r2={r2:.2e}, r3={r3:.2e}")

    
সমাধান হয় x = 2.500000, y = 3.500000, λ = 3.000000, এবং f(x, y) = 4.500000। কনস্ট্রেইন্ট চেক দেখায় x + y - 6 = 0.0000000000 — নিখুঁতভাবে সন্তুষ্ট। লক্ষ্য করুন, f-এর আনকনস্ট্রেইনড মিনিমাম হতো (1, 2)-এ (যেখানে f = 0), কিন্তু কনস্ট্রেইন্ট x + y = 6 সেই বিন্দুকে অনুমতি দেয় না — তাই লাগ্রাঞ্জ মাল্টিপ্লায়ার মেথড একটি ভিন্ন, কনস্ট্রেইন্ট-সন্তোষজনক বিন্দু (2.5, 3.5) খুঁজে বের করেছে, যেখানে f কনস্ট্রেইন্ট রেখা বরাবর সবচেয়ে ছোট।
λ-এর অর্থ কী

লাগ্রাঞ্জ মাল্টিপ্লায়ার λ = 3-এর একটি গুরুত্বপূর্ণ ব্যাখ্যা আছে — এটি প্রায় বলে দেয় কনস্ট্রেইন্ট সামান্য শিথিল করলে (যেমন x + y = 6-এর বদলে x + y = 6.01) মিনিমাম মান f কতটা পরিবর্তিত হবে (প্রতি একক পরিবর্তনে প্রায় λ পরিমাণ)। এই "সেনসিটিভিটি" ব্যাখ্যা M11-এ সেনসিটিভিটি অ্যানালাইসিসের সাথে সম্পর্কিত।

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

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

প্র ০১ উপরের সমাধানে আনকনস্ট্রেইনড মিনিমাম (1, 2)-এ f = 0, কিন্তু কনস্ট্রেইনড মিনিমাম (2.5, 3.5)-এ f = 4.5। এই পার্থক্য কী বোঝায়?

এটি নিশ্চিত করে কনস্ট্রেইন্ট প্রয়োগ করলে অর্জনযোগ্য সেরা মান সবসময় আনকনস্ট্রেইনড সেরা মানের সমান বা তার চেয়ে খারাপ হবে — কখনো ভালো নয় — কারণ কনস্ট্রেইন্ট সম্ভাব্য সমাধানের সেটকে সংকুচিত করে। এখানে কনস্ট্রেইন্ট x+y=6-এর কারণে "বিনামূল্যে" মিনিমাম (1,2) অ্যাক্সেসযোগ্য নয়, তাই একটি সমঝোতা (trade-off) বিন্দুতে পৌঁছাতে হয়েছে।

প্র ০২ উপরের উদাহরণে কনস্ট্রেইন্ট ছিল লিনিয়ার (x + y = 6)। যদি কনস্ট্রেইন্ট নন-লিনিয়ার হতো (যেমন x² + y² = 25), তাহলে KKT সমীকরণের সিস্টেম সমাধান করা কেন বেশি কঠিন হতো বলে আপনার মনে হয়?

নন-লিনিয়ার কনস্ট্রেইন্টে KKT সমীকরণগুলোও নন-লিনিয়ার হয়ে যায় (যেমন 2x - 2λx = 0-এর মতো পদ, যেখানে λ ও x গুণ হচ্ছে) — এই ধরনের সিস্টেম M3-এর গসিয়ান এলিমিনেশন দিয়ে সরাসরি সমাধান করা যায় না, বরং M2-এর নিউটন-রাফসনের মতো ইটারেটিভ রুট-ফাইন্ডিং মেথড প্রয়োজন হয় (বহু-চলক সংস্করণে)।

প্র ০৩ এই পাঠে একটি মাত্র "সমতা" কনস্ট্রেইন্ট (x+y=6) ব্যবহার করা হয়েছে। বাস্তব-বিশ্বের সমস্যায় প্রায়ই "অসমতা" কনস্ট্রেইন্ট থাকে (যেমন x ≥ 0)। এই ধরনের কনস্ট্রেইন্ট কেন সাধারণ লাগ্রাঞ্জ মাল্টিপ্লায়ার পদ্ধতির জন্য ভিন্ন চ্যালেঞ্জ তৈরি করে বলে আপনার মনে হয়?

সমতা কনস্ট্রেইন্টে (=) আমরা জানি সমাধান ঠিক সেই সীমারেখায় থাকবে। কিন্তু অসমতা কনস্ট্রেইন্টে (≥ বা ≤) সমাধান হয় সীমারেখায় থাকতে পারে, নয়তো ভেতরে — আগে থেকে জানা যায় না কোনটি "সক্রিয়" (active)। এই কারণে অসমতা কনস্ট্রেইন্টের জন্য আরও সাধারণ KKT (Karush-Kuhn-Tucker) শর্ত প্রয়োজন হয়, যা কোন কনস্ট্রেইন্ট সক্রিয় তা নির্ধারণ করে। M46-এ লিনিয়ার প্রোগ্রামিংয়ে এই ধরনের অসমতা কনস্ট্রেইন্ট-ই মূল বিষয়।

অনুশীলন

  1. চিন্তা করুন: উপরের কোড সেলে কনস্ট্রেইন্ট x + y = 6-এর বদলে x + y = 3 ব্যবহার করলে (অর্থাৎ b = [2, 4, 3]), নতুন সমাধান বিন্দু (1, 2)-এর (আনকনস্ট্রেইনড মিনিমাম) কাছাকাছি হবে, নাকি দূরে থাকবে বলে আপনার ধারণা?

    যেহেতু 1 + 2 = 3, নতুন কনস্ট্রেইন্ট রেখা x+y=3 ঠিক আনকনস্ট্রেইনড মিনিমাম বিন্দু (1, 2)-এর মধ্য দিয়ে যায় — তাই নতুন কনস্ট্রেইনড সমাধান সরাসরি (1, 2)-ই হবে বলে ধারণা করা যায়, এবং f-এর মান 0 হবে।

  2. পরীক্ষা করুন: উপরের কোড সেলে b = [2, 4, 6]-কে b = [2, 4, 3]-এ পরিবর্তন করে Run চেপে আপনার অনুমান যাচাই করুন।

    সমাধান হয় x = 1.000000, y = 2.000000, λ = 0.000000, এবং f(x, y) = 0.000000 — ঠিক যেমন অনুমান করা হয়েছিল। লক্ষ্যণীয়: λ = 0 কারণ কনস্ট্রেইন্ট এখানে "বাধা" দিচ্ছে না — আনকনস্ট্রেইনড মিনিমাম নিজেই কনস্ট্রেইন্ট রেখার উপর পড়ে যাওয়ায় কনস্ট্রেইন্টের কোনো "মূল্য" (marginal cost) নেই।

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

আগের পাঠ
অপ্টিমাইজেশনের জন্য নিউটনের মেথড