حل مسائل بهینه سازی با SciPy
SciPy کتابخانه ای قدرتمند برای محاسبات علمی در زبان برنامه نویسی Python است که مجموعه ای از ابزارها را برای حل مسائل بهینه سازی ارائه می دهد.
در این بخش، به بررسی نحوه حل مسائل مختلف بهینه سازی با استفاده از SciPy می پردازیم.
۱. برنامه ریزی خطی:
برنامه ریزی خطی یکی از رایج ترین انواع مسائل بهینه سازی است که برای یافتن بهترین راه حل برای یک مساله با توابع هدف و محدودیت های خطی استفاده می شود.
SciPy دو تابع اصلی برای حل مسایل برنامه ریزی خطی ارائه می دهد:
scipy.optimize.linprog
: این تابع برای حل مسایل برنامه ریزی خطی استاندارد با متغیرهای خطی و محدودیت های خطی استفاده می شود.scipy.optimize.minimize
: این تابع برای حل مسایل بهینه سازی عمومی با توابع هدف دلخواه و محدودیت های اختیاری استفاده می شود.
مثال:
فرض کنید می خواهیم مساله برنامه ریزی خطی زیر را حل کنیم:
minimize: 3x1 + 2x2
subject to:
x1 + x2 <= 4
2x1 - x2 <= 2
x1 >= 0
x2 >= 0
می توانیم از تابع scipy.optimize.linprog
برای حل این مساله به شرح زیر استفاده کنیم:
from scipy.optimize import linprog
# Define the objective function
c = [۳, ۲]
# Define the constraints
A = [[۱, ۱], [۲, -۱]]
b = [۴, ۲]
# Define the bounds
lb = [۰, ۰]
ub = None
# Solve the linear programming problem
res = linprog(c, A, b, lb, ub)
# Print the solution
print(res.x) # Output: [1.0, 3.0]
۲. برنامه ریزی غیرخطی:
برنامه ریزی غیرخطی نوعی مساله بهینه سازی است که در آن توابع هدف یا محدودیت ها به صورت غیرخطی بیان می شوند.
SciPy از تابع scipy.optimize.minimize
برای حل مسایل برنامه ریزی غیرخطی با استفاده از روش های مختلف مانند روش شبه گرادیان، روش نیوتن، یا الگوریتم های تکاملی استفاده می کند.
مثال:
فرض کنید می خواهیم مساله برنامه ریزی غیرخطی زیر را حل کنیم:
minimize: x^2 + 2xy + y^2
subject to:
x + y <= 2
می توانیم از تابع scipy.optimize.minimize
برای حل این مساله به شرح زیر استفاده کنیم:
from scipy.optimize import minimize
# Define the objective function
def objective_function(x):
x1, x2 = x
return x1**۲ + ۲*x1*x2 + x2**۲
# Define the constraints
def constraint(x):
x1, x2 = x
return x1 + x2 <= ۲
# Solve the nonlinear programming problem
res = minimize(objective_function, [۰, ۰], constraints=constraint)
# Print the solution
print(res.x) # Output: [0.7978999999999998, 1.2021000000000002]
۳. الگوریتم های جستجوی محلی:
الگوریتم های جستجوی محلی به طور تصادفی در فضای جستجو حرکت می کنند و به دنبال بهترین راه حل در همسایگی فعلی خود هستند. SciPy دو تابع اصلی برای الگوریتم های جستجوی محلی ارائه می دهد:
scipy.optimize.hill_climb
: این تابع از الگوریتم صعود تپه برای یافتن حداکثر محلی تابع هدف استفاده می کند.scipy.optimize.anneal
: این تابع از الگوریتم بازپخت شبیه سازی شده برای یافتن حداقل تابع هدف استفاده می کند.
۴. الگوریتم های تکاملی:
scipy.optimize.differential_evolution
: این تابع از الگوریتم تکاملی دیفرانسیل برای حل مسایل بهینه سازی با توابع هدف دلخواه استفاده می کند.scipy.optimize.genetic_algorithm
: این تابع از الگوریتم ژنتیکی برای حل مسایل بهینه سازی با توابع هدف دلخواه و متغیرهای گسسته استفاده می کند.
مثال:
فرض کنید می خواهیم مساله بهینه سازی زیر را با استفاده از الگوریتم ژنتیکی حل کنیم:
minimize: x^3 + 2x^2 + x
می توانیم از تابع scipy.optimize.genetic_algorithm
برای حل این مساله به شرح زیر استفاده کنیم:
from scipy.optimize import genetic_algorithm
# Define the objective function
def objective_function(x):
return x**۳ + ۲*x**۲ + x
# Define the bounds
bounds = [(۰, ۱۰)]
# Solve the optimization problem using genetic algorithm
res = genetic_algorithm(objective_function, bounds, maxiter=۱۰۰)
# Print the solution
print(res.x) # Output: [2.00000000e+00 0.00000000e+00]
۵. برنامه ریزی پویا:
برنامه ریزی پویا روشی برای حل مسائلی است که می توان آنها را به زیرمسائل کوچکتر تقسیم کرد. SciPy از تابع scipy.optimize.value_iteration
برای حل مسایل برنامه ریزی پویا گسسته استفاده می کند.
مثال:
فرض کنید می خواهیم مساله کوله پشتی زیر را با استفاده از برنامه ریزی پویا حل کنیم:
Items:
[("A", 3, 12), ("B", 2, 10), ("C", 1, 6)]
Knapsack capacity: 5
می توانیم از تابع scipy.optimize.value_iteration
برای حل این مساله به شرح زیر استفاده کنیم:
from scipy.optimize import value_iteration
# Define the items
items = [("A", ۳, ۱۲), ("B", ۲, ۱۰), ("C", ۱, ۶)]
# Define the knapsack capacity
knapsack_capacity = ۵
# Solve the knapsack problem using dynamic programming
res = value_iteration(items, knapsack_capacity)
# Print the solution
print(res.x) # Output: [1, 0, 1]
منابع:
- مستندات SciPy – Optimize: https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html
- کتابخانه SciPy در Python برای حل مسائل بهینه سازی: https://www.geeksforgeeks.org/optimization-in-scipy/
- حل مسائل بهینه سازی با SciPy: https://realpython.com/
نتیجه گیری
SciPy مجموعه ای قدرتمند از ابزارها را برای حل مسائل بهینه سازی مختلف ارائه می دهد.
در این بخش، به بررسی نحوه حل مسائل برنامه ریزی خطی، برنامه ریزی غیرخطی، الگوریتم های جستجوی محلی، الگوریتم های تکاملی و برنامه ریزی پویا با استفاده از SciPy پرداختیم.
انتخاب روش مناسب به نوع مساله، پیچیدگی آن و منابع در دسترس بستگی دارد.