Python में Optimization तकनीकें
Python optimization समस्याएँ हल करने के लिए कई शक्तिशाली तकनीकें प्रदान करता है—सरल gradient-आधारित तरीकों से लेकर अधिक जटिल एल्गोरिदम तक। ये तकनीकें मशीन लर्निंग, इंजीनियरिंग, या ऑपरेशंस रिसर्च में फ़ंक्शनों के न्यूनतम या अधिकतम को कुशलता से खोजने देती हैं।
इस खंड में, हम Python में आम तौर पर लागू की जाने वाली optimization तकनीकों को कवर करेंगे, जिनमें gradient descent, Newton की विधि, conjugate gradient विधि, quasi-Newton विधियाँ, Simplex विधि, और trust-region विधियाँ शामिल हैं।
नोट: इस खंड में विज़ुअलाइज़ेशन बनाने के लिए उपयोग किए गए सभी कोड देखने हेतु यह DataLab देखें।
चलिए शुरू करते हैं!
Gradient descent
Gradient descent numerical optimization की सबसे बुनियादी तकनीकों में से एक है। यह एक आवर्तक विधि है जो फ़ंक्शन के gradient (या ढलान) के ऋणात्मक दिशा का अनुसरण करके उसके न्यूनतम तक पहुँचती है।
मुख्य विचार यह है कि एक आरंभी अनुमान से शुरू करें और सबसे तेज़ अवरोह (steepest descent) की दिशा में चलते हुए उसे क्रमिक रूप से अद्यतन करें जब तक अभिसरण (convergence) न हो जाए। मशीन लर्निंग मॉडलों के प्रशिक्षण में यह सबसे सामान्य optimization तकनीकों में से है, जहाँ उद्देश्य loss फ़ंक्शन को न्यूनतम करना होता है।
Newton's method
Newton की विधि एक optimization तकनीक है जो objective फ़ंक्शन के gradient और दूसरी कोटि के अवकलज (Hessian मैट्रिक्स) दोनों का उपयोग करके न्यूनतम ढूँढती है। Gradient descent के विपरीत, जो केवल प्रथम-कोटि अवकलजों पर निर्भर करती है, Newton की विधि वक्रता (curvature) की जानकारी का लाभ उठाती है, जिससे विशेषकर convex फ़ंक्शनों के लिए तेज़ अभिसरण मिलता है।
हालाँकि Newton की विधि तीव्रता से अभिसरित होती है, इसे Hessian मैट्रिक्स की गणना की आवश्यकता होती है, जो बड़े पैमाने की समस्याओं के लिए संगणकीय रूप से महँगा और अव्यावहारिक हो सकता है। फिर भी, यह छोटी, स्मूद convex समस्याओं के लिए अत्यंत प्रभावी है।

Conjugate gradient method
Conjugate gradient विधि बड़े पैमाने की समस्याओं के लिए एक कुशल optimization तकनीक है, विशेषकर तब जब Hessian मैट्रिक्स को संग्रहीत करना अव्यावहारिक हो। यह conjugate दिशाएँ क्रमशः बनाती है और उन्हीं के साथ अनुकूलन करती है, पूर्ण Hessian की आवश्यकता के बिना—इसे बड़े quadratic फ़ंक्शनों को न्यूनतम करने जैसी समस्याओं के लिए उपयुक्त बनाते हुए।
यह विधि finite element analysis या बड़े पैमाने की मशीन लर्निंग अनुप्रयोगों में सहायक है, जहाँ मैट्रिक्स गणनाएँ बोझिल हो जाती हैं।

Quasi-newton विधियाँ (BFGS)
Quasi-Newton विधियाँ, जैसे Broyden–Fletcher–Goldfarb–Shanno (BFGS) एल्गोरिदम, Hessian मैट्रिक्स का प्रत्यक्ष गणना करने के बजाय उसका सन्निकटन (approximation) बनाती हैं। ये विधियाँ पूर्ण Hessian की गणना के भारी बोझ के बिना द्वितीय-कोटि जानकारी का उपयोग करके gradient descent से तेज़ अभिसरण प्राप्त करती हैं।

Simplex method
Simplex विधि linear programming (LP) समस्याओं को हल करने के लिए व्यापक रूप से प्रयुक्त एल्गोरिदम है, जहाँ objective फ़ंक्शन और constraints दोनों linear होते हैं। यह संभव क्षेत्र (feasible region) के शिखरों (polyhedron के vertices) की क्रमबद्ध जाँच करती है और उस इष्टतम शिखर की ओर बढ़ती है जहाँ objective फ़ंक्शन अपना अधिकतम या न्यूनतम मान प्राप्त करता है।

Trust-region methods
Trust-region विधियाँ ऐसे optimization एल्गोरिदम हैं जो वर्तमान समाधान के आस-पास एक “trust region” के भीतर objective फ़ंक्शन का स्थानीय मॉडल बनाते हैं।
Gradient descent की तरह पूर्व-निर्धारित दिशा में कदम लेने के बजाय, एल्गोरिदम trust region के भीतर एक सरल उपसमस्या (subproblem) परिभाषित करता है और उसे आवर्तक रूप से हल करके समाधान को परिष्कृत करता है। ये विधियाँ जटिल, nonlinear समस्याओं को संभालने में विशेष रूप से प्रभावी होती हैं और पारंपरिक gradient-आधारित विधियों की तुलना में बेहतर स्थिरता देती हैं।

Rosenbrock के फ़ंक्शन को न्यूनतम करते समय trust regions और उनकी त्रिज्या | स्रोत: Shivangi Khare द्वारा Trust Region Methods
Optimization के लिए आम Python पैकेज
Numerical optimization को सुगम बनाने के लिए कई लाइब्रेरी और पैकेज उपलब्ध हैं। हर एक की अपनी खूबियाँ और अनुप्रयोग हैं, लेकिन चाहे आपकी optimization समस्या कुछ भी हो, आम तौर पर Python में उसे हल करने के लिए एक सशक्त टूल मौजूद रहता है।
यहाँ चार सबसे आम optimization पैकेज दिए गए हैं:
SciPy optimization (scipy.optimize)
scipy.optimize मॉड्यूल SciPy इकोसिस्टम में एक बहुपयोगी लाइब्रेरी है, जो unconstrained और constrained—दोनों प्रकार की optimization समस्याओं के लिए विस्तृत एल्गोरिदम प्रदान करता है। इसमें स्केलर और बहु-चर फ़ंक्शनों के न्यूनतम खोजने, मूल (root) खोजने, और डेटा पर वक्र फिटिंग के लिए फ़ंक्शंस शामिल हैं।
इस मॉड्यूल के फ़ंक्शंस में शामिल हैं:
minimize(): एक या अधिक चरों के स्केलर फ़ंक्शन को न्यूनतम करने के लिए प्रयुक्त फ़ंक्शन।
from scipy.optimize import minimize
def objective_function(x):
return x[0]**2 + x[1]**2
result = minimize(objective_function, [1, 1], method='BFGS')
print(result.x) # Optimal solution
# >>> [-1.07505143e-08 -1.07505143e-08]
root(): वेक्टर फ़ंक्शन का मूल ढूँढता है—अ-रैखिक समीकरणों की प्रणालियाँ हल करने के लिए अत्यंत उपयोगी।
from scipy.optimize import root
def equations(vars):
x, y = vars
return [x + 2*y - 3, x - y - 1]
result = root(equations, [0, 0])
print(result.x)
# >>> [1.66666667 0.66666667]
curve_fit(): यह फ़ंक्शन डेटा बिंदुओं के सेट पर एक वक्र फिट करता है और डेटा फिटिंग व पैरामीटर अनुमान के लिए उपयोगी है।
from scipy.optimize import curve_fit
import numpy as np
def model(x, a, b):
return a * np.exp(b * x)
x_data = np.array([1, 2, 3])
y_data = np.array([2.7, 7.4, 20.1])
params, covariance = curve_fit(model, x_data, y_data)
print(params) # Fitted parameters
# >>> [0.9981286 1.00089935]
CVXPY
CVXPY एक Python लाइब्रेरी है जो convex optimization समस्याओं के लिए डिज़ाइन की गई है। यह उपयोगकर्ताओं को उच्च-स्तरीय, घोषणात्मक (declarative) सिंटैक्स का उपयोग करके समस्याएँ परिभाषित और हल करने देता है। यह objective फ़ंक्शन और constraints को स्वाभाविक और पठनीय तरीके से निर्दिष्ट करके जटिल optimization समस्याओं का विन्यास सरल बनाता है।
CVXPY की विशेषताएँ:
- Declarative सिंटैक्स: Python के गणितीय अभिव्यक्तियों से समस्याओं का सहज मॉडलिंग।
- State-of-the-art solvers: ECOS, SCS, और OSQP जैसे उन्नत solvers के साथ इंटर्फेस—जो convex समस्याओं को कुशलता से संभालते हैं।
import cvxpy as cp
# Define variables
x = cp.Variable()
y = cp.Variable()
# Define constraints
constraints = [x + y == 1, x - y >= 2]
# Define the objective function
objective = cp.Minimize(x**2 + y**2)
# Formulate the problem
prob = cp.Problem(objective, constraints)
# Solve the problem
result = prob.solve()
print(f"Optimal value: {result}")
print(f"x: {x.value}, y: {y.value}")
# >>> Optimal value: 2.5
# x: 1.5, y: -0.5000000000000001
Pyomo
Pyomo एक लचीला और व्यापक optimization मॉडलिंग पैकेज है, जो linear, nonlinear, और mixed-integer programming का समर्थन करता है। यह जटिल optimization समस्याओं के लिए डिज़ाइन किया गया है और GLPK, CBC, और CPLEX जैसे solvers के साथ सहजता से एकीकृत होता है।
Pyomo की विशेषताएँ:
- Modeling लचीलापन: Pyomo जटिल constraints और objectives सहित उच्च लचीलेपन के साथ optimization समस्याएँ परिभाषित करने देता है।
- Solver एकीकरण: यह व्यापक दायरे के solvers का समर्थन करता है, जिससे किसी विशिष्ट समस्या के लिए सर्वश्रेष्ठ टूल चुनने की लचीलापन मिलती है।
Gurobi और CPLEX (Pyomo या direct API के माध्यम से)
Gurobi और CPLEX बड़े पैमाने की optimization समस्याओं के लिए उच्च-प्रदर्शन solvers हैं। इनका उपयोग उद्योग में आपूर्ति शृंखला अनुकूलन, पोर्टफोलियो प्रबंधन, और लॉजिस्टिक्स जैसे कार्यों के लिए आम है।
ये जटिल और बड़े पैमाने की समस्याओं को कुशलता से संभालने हेतु उन्नत एल्गोरिदम प्रदान करते हैं।
- Gurobi: Pyomo या इसके direct API के माध्यम से सुलभ; linear, integer, और quadratic programming समस्याएँ तेज़ी और विश्वसनीयता से हल करने के लिए प्रसिद्ध।
- CPLEX: इसी तरह, CPLEX शक्तिशाली optimization क्षमताएँ देता है और विविध क्षेत्रों में जटिल परिचालन और रणनीतिक समस्याओं को हल करने के लिए उपयोग होता है। इसे Pyomo के माध्यम से या सीधे इसके API से एक्सेस किया जा सकता है।
इन solvers का उपयोग अक्सर उद्योग-स्तरीय समस्याओं में किया जाता है, जहाँ संगणकीय दक्षता और सुदृढ़ता महत्वपूर्ण होती है।
Python में Numerical Optimization के वास्तविक-world अनुप्रयोग
जैसा कि प्रस्तावना में कहा, numerical optimization अनेक डोमेनों में अहम भूमिका निभाता है। यह जटिल समस्याएँ हल करने और डेटा-आधारित निर्णय लेने के लिए आवश्यक तकनीकें प्रदान करता है।
उदाहरण के लिए:
- Machine learning: मॉडल मूलतः numerical optimization से प्रशिक्षित होते हैं। इसमें loss फ़ंक्शन को न्यूनतम करने वाले इष्टतम पैरामीटर खोजना शामिल है, जो बताता है कि मॉडल लक्ष्य चर का कितना अच्छा पूर्वानुमान करता है।
- Operations research: Optimization तकनीकें विभिन्न परिचालन मीट्रिक को अधिकतम या न्यूनतम करने वाले रणनीतिक निर्णय लेने में मदद करती हैं। Constraints के अधीन objective फ़ंक्शनों को optimize करके, आपूर्ति शृंखला प्रबंधन, कार्यबल शेड्यूलिंग, और उत्पादन योजना जैसी प्रक्रियाओं में दक्षता बढ़ाई जा सकती है।
- वित्त (Finance): Numerical optimization पोर्टफोलियो optimization जैसे कार्यों में अत्यंत महत्वपूर्ण है। यह प्रतिफल अधिकतम करने या जोखिम न्यूनतम करने हेतु सर्वोत्तम परिसंपत्ति आवंटन निर्धारित करने में मदद करता है।
- इंजीनियरिंग डिज़ाइन: विशिष्ट प्रदर्शन मानदंडों को पूरा करते हुए लागत को न्यूनतम रखने के लिए प्रणालियाँ और ढाँचे डिज़ाइन करने में numerical optimization लागू होता है। यह पुलों और विमानों से लेकर विनिर्माण प्रक्रियाओं और ऊर्जा प्रणालियों तक के कुशल डिज़ाइन हासिल करने में सहायक है।
Python में Numerical Optimization के श्रेष्ठ तौर-तरीके
Python में अपनी optimization कोशिशों से सर्वश्रेष्ठ परिणाम पाने के लिए कई कारकों पर विचार करना आवश्यक है। इन सर्वोत्तम प्रथाओं का पालन करें:
सही एल्गोरिदम चुनना
उच्च-गुणवत्ता वाले परिणाम के लिए सही optimization एल्गोरिदम का चयन महत्वपूर्ण है। एल्गोरिदम का चुनाव समस्या की प्रकृति पर निर्भर करता है:
- Linear बनाम nonlinear: Linear समस्याओं के लिए Simplex या interior-point जैसी linear programming तकनीकें उपयुक्त हैं। Nonlinear समस्याओं के लिए gradient descent, Newton की विधि, या quasi-Newton (जैसे, BFGS) विधियाँ अधिक उपयुक्त हो सकती हैं।
- Constrained बनाम unconstrained: Constraints वाली समस्याओं के लिए Sequential Quadratic Programming (SQP) जैसे एल्गोरिदम या constraints को नैटिव तौर पर संभालने वाली विधियाँ (जैसे, interior-point) चाहिए। Unconstrained समस्याएँ gradient descent या Newton की विधि से कुशलता से हल की जा सकती हैं।
समस्या की विशेषताओं के आधार पर सही एल्गोरिदम चुनने से तेज़ अभिसरण और अधिक सटीक समाधान मिलते हैं।
Constraints को संभालना
Optimization समस्याओं में constraints एल्गोरिदम और समाधान-रणनीति के चयन को काफी प्रभावित कर सकते हैं। Constraints संभालने के कई तरीके हैं:
- Penalty विधियाँ: Constraint उल्लंघन पर दंड (penalty) जोड़कर constraints को objective फ़ंक्शन में समाहित करना। इससे constrained समस्या को unconstrained में बदला जा सकता है और unconstrained विधियाँ लागू की जा सकती हैं।
- Barrier विधियाँ: Constraints के निकट जाते ही objective में एक barrier पद जोड़ना जो अनंत की ओर बढ़ता है, ताकि उल्लंघन न हो।
- Native समर्थन: ऐसे solvers का उपयोग करें जो constraints को मूल रूप से सपोर्ट करते हों।
scipy.optimizeया CVXPY जैसे आधुनिक solvers constraints को सीधे और कुशलता से संभालते हैं।
Constraints को संभालने के लिए उपयुक्त तरीका चुनने से समाधान व्यावहारिक (feasible) रहता है और सभी आवश्यकताओं को पूरा करता है।
स्केलिंग और preprocessing
डेटा का सही स्केलिंग और preprocessing optimization एल्गोरिदम के प्रदर्शन को काफ़ी सुधार सकता है:
- स्केलिंग: इनपुट डेटा को सामान्यीकृत (normalize) या मानकीकृत (standardize) करें ताकि सभी फ़ीचर्स objective में समान रूप से योगदान दें। इससे संख्यात्मक स्थिरता से जुड़ी समस्याएँ कम होती हैं और अभिसरण तेज़ होता है।
- Preprocessing: फ़ीचर इंजीनियरिंग या आयामीयता में कमी (dimensionality reduction) जैसी तकनीकें लागू करें ताकि समस्या सरल हो। सही preprocessing समस्या की जटिलता घटाता है और समाधान प्रक्रिया तेज़ करता है।
परिणामों की व्याख्या
Optimization एल्गोरिदम के परिणामों की व्याख्या में कई पहलुओं को समझना शामिल है:
- Solution गुणवत्ता: यह जाँचें कि समाधान इष्टतम परिस्थितियों और constraints को संतुष्ट करता है या नहीं। ज्ञात benchmarks से तुलना करें या cross-validation के माध्यम से मान्य करें।
- Convergence मानदंड: Convergence संदेश, iterations की संख्या, या objective मान में परिवर्तन देख कर आकलन करें कि एल्गोरिदम अभिसरित हुआ है या नहीं। सुनिश्चित करें कि समाधान वास्तविक optimum के क़रीब है।
- Numerical precision: संख्यात्मक शुद्धता के प्रभाव पर विचार करें। छोटे-छोटे त्रुटि-योग (round-off errors) एकत्र होकर अंतिम समाधान को प्रभावित कर सकते हैं, खासकर बड़े पैमाने या सख़्त सहनशीलता (tight tolerances) वाली समस्याओं में।
निष्कर्ष
Numerical optimization आधुनिक समस्या-समाधान का आधार है। यह मशीन लर्निंग, इंजीनियरिंग, वित्त, और ऑपरेशंस रिसर्च जैसे क्षेत्रों में जटिल चुनौतियों से निपटने के लिए शक्तिशाली टूल प्रदान करता है।
Python का समृद्ध optimization इकोसिस्टम—जैसे SciPy, CVXPY, और Pyomo—इन उन्नत तकनीकों को सुलभ बनाता है, जिससे शोधकर्ताओं, इंजीनियरों, और डेटा वैज्ञानिकों को कुशल प्रणालियाँ डिज़ाइन करने, मॉडलों का अनुकूलन करने, और अधिक स्मार्ट, डेटा-आधारित निर्णय लेने में सशक्तता मिलती है।
सही तकनीकों और सर्वोत्तम प्रथाओं से लैस होकर, अब आप Python में सबसे चुनौतीपूर्ण optimization समस्याओं से भी निपटने के लिए तैयार हैं। आगे सीखने के लिए ये संसाधन देखें:
FAQs
Optimization क्या है?
Optimization, विश्लेषणात्मक समाधानों के बजाय आवर्तक संगणकीय विधियों का उपयोग करके किसी फ़ंक्शन का न्यूनतम या अधिकतम निकालने की प्रक्रिया है।
Optimization क्यों महत्वपूर्ण है?
Optimization महत्वपूर्ण है क्योंकि यह machine learning, इंजीनियरिंग, और वित्त जैसे क्षेत्रों में जटिल, वास्तविक समस्याओं को हल करने में मदद करता है, जहाँ सीधे समाधान अव्यावहारिक या असंभव होते हैं।
Numerical optimization के लिए कौन से Python पैकेज सबसे अच्छे हैं?
Numerical optimization के लिए लोकप्रिय Python पैकेजों में SciPy (सामान्य उद्देश्य optimization), CVXPY (convex optimization), Pyomo (लचीला मॉडलिंग), और Gurobi व CPLEX जैसे शक्तिशाली solvers शामिल हैं—जो बड़े पैमाने की औद्योगिक अनुप्रयोगों के लिए उपयुक्त हैं।
Machine learning में numerical optimization का उपयोग कैसे होता है?
Machine learning में numerical optimization का उपयोग loss फ़ंक्शन को न्यूनतम करने के लिए किया जाता है, जो मापता है कि कोई मॉडल अपने लक्ष्य चरों का कितना अच्छा पूर्वानुमान करता है।
Constrained और unconstrained optimization में क्या अंतर है?
Unconstrained optimization में objective फ़ंक्शन का इष्टतम मान बिना किसी चर-प्रतिबंध के खोजा जाता है। इसके विपरीत, constrained optimization में चरों पर समानता या असमानता जैसी बाधाएँ लागू होती हैं, और इष्टतम समाधान को इन बाधाओं को संतुष्ट करते हुए फ़ंक्शन का अनुकूलन करना पड़ता है।

Optimization मशीन लर्निंग की मुख्य तकनीकों में से एक है। मैंने इसे सबसे पहले सीखा था, लेकिन जल्द ही महसूस किया कि इसका उपयोग ML के दायरे से कहीं आगे तक फैला हुआ है।
संख्यात्मक (Numerical) optimization विभिन्न क्षेत्रों में जटिल समस्याओं को हल करने में निर्णायक भूमिका निभाता है। इसके बिना, डेटा वैज्ञानिक, अर्थशास्त्री, और इंजीनियर सभी अक्षम, महंगे टूल बनाते रह जाते और उप-इष्टतम (non-optimal) निर्णय लेते।
इसीलिए इस लेख में हम Python में optimization को कवर कर रहे हैं—सबसे आम पैकेज, तकनीकें, और सर्वोत्तम प्रथाएँ (best practices) शामिल हैं।
अपनी सीट बेल्ट बांधें, सफर शुरू करते हैं, और इस DataLab Workbook के साथ-साथ चलें।
Numerical Optimization क्या है?
दुनिया में मौजूद कई समस्याओं के लिए सीधे सर्वोत्तम हल निकालना मुश्किल होता है। इन समस्याओं को हल करने के लिए एक आवर्तक (iterative) दृष्टिकोण चाहिए—यहीं संख्यात्मक optimization काम आता है।
Numerical optimization किसी फ़ंक्शन का न्यूनतम या अधिकतम मान आवर्तक संगणकीय विधियों से खोजना है, न कि बीजीय हेरफेर से निकले विश्लेषणात्मक (analytical) समाधानों से।
विश्लेषणात्मक विधियों के विपरीत, जो कभी-कभी सटीक बंद-रूप (closed form) समाधान देती हैं, numerical optimization ऐसे एल्गोरिदम पर निर्भर करता है जो कई iterations के साथ अनुमानित हल को क्रमशः बेहतर करते हुए optimum के करीब पहुँचते हैं।
यह तरीका विशेष रूप से तब उपयोगी होता है जब फ़ंक्शन:
ऐसी स्थितियों में सटीक विश्लेषणात्मक समाधान पाना असंभव या अव्यावहारिक होता है, इसलिए iterative तरीका अपनाया जाता है।
आम Optimization समस्याएँ
Numerical optimization में समस्याओं को प्रायः उद्देश्य फ़ंक्शन (objective function) की प्रकृति और बाधाओं (constraints) की उपस्थिति या अनुपस्थिति के आधार पर वर्गीकृत किया जाता है।
इसलिए, सबसे आम समस्याएँ निम्नानुसार वर्गीकृत की जा सकती हैं:
Unconstrained optimization
यह optimization का सबसे सरल रूप है। इसमें बिना किसी बाधा के objective फ़ंक्शन का न्यूनतम या अधिकतम ढूँढना शामिल है।
लक्ष्य यह है कि केवल इसके गणितीय ढाँचे के आधार पर यह बिंदु निर्धारित किया जाए जहाँ फ़ंक्शन अपना इष्टतम मान (न्यूनतम या अधिकतम) प्राप्त करता है।
Gradient descent या Newton की विधि जैसी तकनीकें unconstrained समस्याओं को हल करने के लिए आम हैं (इन पर आगे चर्चा होगी)। फोकस, फ़ंक्शन के अवकलज (derivatives) का आकलन कर समाधान को क्रमिक रूप से बेहतर करने पर होता है।
उदाहरण के लिए, लागत फ़ंक्शन f(x) को न्यूनतम करना, जो एक या अधिक चरों x पर निर्भर करता है, और x किन मानों को ले सकता है इस पर कोई प्रतिबंध नहीं है—यह एक सामान्य unconstrained समस्या है।
Constrained optimization
इसके विपरीत, constrained optimization में objective फ़ंक्शन का इष्टतम मान ऐसे पाया जाता है कि चरों पर एक या अधिक बाधाएँ लगी हों। ये बाधाएँ समता (equalities) या असमता (inequalities) के रूप में हो सकती हैं।
यहाँ चुनौती यह है कि फ़ंक्शन को optimize करते हुए समाधान दी गई बाधाओं को भी संतुष्ट करे।
उदाहरण के लिए, इंजीनियरिंग डिज़ाइन में एक सामान्य constrained समस्या में सामग्री लागत (objective) को कम करना शामिल हो सकता है, जबकि कुछ भौतिक सीमाओं, जैसे मज़बूती या वज़न (constraints), का पालन भी करना होता है।
Lagrange multipliers, penalty functions, और barrier methods जैसी विधियाँ अक्सर इन बाधाओं को optimization प्रक्रिया में समाहित करने के लिए उपयोग की जाती हैं।
Linear बनाम nonlinear optimization
Linear optimization में objective फ़ंक्शन और constraints—दोनों, जैसा कि आप समझ ही गए—रैखिक (linear) होते हैं। यानी चरों के बीच के संबंध रैखिक समीकरणों या असमताओं से व्यक्त होते हैं।
Linear optimization समस्याओं का समाधान-स्थान (solution space) अपेक्षाकृत सरल और सुव्यवस्थित होता है, जिससे Simplex या interior-point जैसी विधियों से कुशल समाधान मिलते हैं।
Linear optimization का एक क्लासिक उदाहरण linear programming है, जहाँ लक्ष्य संसाधन-सीमाओं (linear inequalities) के अधीन रहते हुए लाभ (एक linear फ़ंक्शन) को अधिकतम करना हो सकता है।
इसके विपरीत, nonlinear optimization में objective फ़ंक्शन या constraints में से कोई एक nonlinear होता है, जिससे समस्या कहीं अधिक जटिल हो जाती है।
वास्तविक जीवन में जहाँ चरों के बीच संबंध सीधे-साधे नहीं होते, वहाँ nonlinear optimization अक्सर देखने को मिलता है। ऐसी समस्याओं में कई स्थानीय optimum हो सकते हैं, जो इन्हें linear समस्याओं की तुलना में कठिन बनाते हैं।
Gradient-आधारित विधियाँ, Newton की विधि, और evolutionary algorithms जैसी तकनीकें nonlinear optimization को सुलझाने के लिए सामान्य हैं।
Nonlinear optimization का उदाहरण एक जटिल भौतिक निर्भरताओं वाले ऊर्जा फ़ंक्शन को न्यूनतम करना हो सकता है, जैसे वायुगतिकीय दक्षता के लिए विमान पंख के आकार का अनुकूलन—जहाँ डिज़ाइन चरों और प्रदर्शन मीट्रिक के बीच nonlinear संबंध होते हैं।