SciPy (تلفظ شوی sai pie) د ریاضیاتو یو نمپسي بسته ده چې د C او Fortran کتابتونونه هم پکې شامل دي. SciPy ستاسو د متقابل پایتون سیشن په بشپړ ډیټا ساینس چاپیریال لکه MATLAB، IDL، Octave، R، یا SciLab بدلوي.
په دې مقاله کې، موږ به د ریاضيکي پروګرام کولو بنسټیز تخنیکونه وګورو - د scipy.optimize کڅوړې په کارولو سره د څو متغیرونو د سکیلر فعالیت لپاره د شرطي اصلاح کولو ستونزې حل کول. د غیر محدود اصلاح کولو الګوریتمونه دمخه بحث شوي
پېژندنه
په scipy.optimize بسته کې د شرطي او غیر محدود اصلاح کولو ستونزو حل کولو لپاره یو عام انٹرفیس د فنکشن لخوا چمتو شوی. minimize()
. په هرصورت، دا معلومه ده چې د ټولو ستونزو د حل لپاره یو نړیوال میتود شتون نلري، نو د کافي میتود انتخاب، د تل په څیر، د څیړونکي په اوږو راځي.
مناسب اصلاح الګوریتم د فنکشن دلیل په کارولو سره مشخص شوی minimize(..., method="")
.
د څو متغیرونو د فعالیت د مشروط اصلاح کولو لپاره، د لاندې میتودونو پلي کول شتون لري:
trust-constr
- د باور په سیمه کې د محلي لږترلږه لټون.ويکي ليکنه ,د Habré په اړه مقاله ;SLSQP
- د محدودیتونو سره ترتیب شوي څلور اړخیز پروګرامونه، د لیګرینج سیسټم حل کولو لپاره د نیوتونین میتود.ويکي ليکنه .TNC
- د نیوټن محدودیت کم شوی، د تکرار محدود شمیر، د غیر خطي دندو لپاره ښه دی د لوی شمیر خپلواک متغیرونو سره.ويکي ليکنه .L-BFGS-B
- د برویډن – فلیچر – ګولډفارب – شانو ټیم څخه یوه میتود چې د هیسین میټریکس څخه د ویکٹرونو د جزوي بار کولو له امله د حافظې د کم مصرف سره پلي کیږي.ويکي ليکنه ,د Habré په اړه مقاله .COBYLA
- د خطي اندازې په واسطه د MARE محدودیت اصلاح کول، د خطي اندازې سره محدود اصلاح کول (پرته له تدریجي محاسبې).ويکي ليکنه .
د غوره شوي میتود پورې اړه لري، د ستونزې د حل لپاره شرایط او محدودیتونه په مختلف ډول ټاکل شوي دي:
- ټولګي اعتراض
Bounds
د میتودونو لپاره L-BFGS-B, TNC, SLSQP, trust-constr; - لیست
(min, max)
د ورته میتودونو لپاره L-BFGS-B, TNC, SLSQP, trust-constr; - یو څیز یا د شیانو لیست
LinearConstraint
,NonlinearConstraint
د COBYLA، SLSQP، د باور جوړونې میتودونو لپاره؛ - لغت یا د لغتونو لیست
{'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt}
د COBYLA، SLSQP میتودونو لپاره.
د مقالې لنډیز:
1) د باور په سیمه کې د مشروط اصلاح الګوریتم کارول په پام کې ونیسئ (میتود = "ټرسټ-کنسټر") د اعتراضونو په توګه مشخص شوي محدودیتونو سره Bounds
, LinearConstraint
, NonlinearConstraint
;
2) د لږ تر لږه مربع میتود (طریقه = "SLSQP") په کارولو سره ترتیب شوي پروګرامونه په پام کې ونیسئ چې محدودیتونه د لغت په بڼه مشخص شوي {'type', 'fun', 'jac', 'args'}
;
3) د ویب سټوډیو مثال په کارولو سره د تولید شوي محصولاتو اصلاح کولو مثال تحلیل کړئ.
د شرطي اصلاح کولو طریقه = "trust-constr"
د میتود پلي کول trust-constr
پر بنسټ
په عمومي شکل کې د لږ تر لږه د موندلو د ستونزې ریاضياتي تشکیل:
د سخت مساوي محدودیتونو لپاره، ټیټ حد د پورتنۍ حد سره مساوي ټاکل شوی .
د یو طرفه خنډ لپاره، پورتنۍ یا ټیټ حد ټاکل شوی np.inf
د اړونده نښه سره.
اجازه راکړئ چې د دوه متغیرونو لږترلږه پیژندل شوي روزنبروک فعالیت ومومئ:
په دې حالت کې، لاندې محدودیتونه د تعریف په ډومین کې ټاکل شوي دي:
زموږ په قضیه کې، په نقطه کې یو ځانګړی حل شتون لري د کوم لپاره چې یوازې لومړی او څلورم محدودیتونه د اعتبار وړ دي.
راځئ چې له لاندې څخه تر پورتنۍ محدودیتونو ته لاړ شو او وګورو چې موږ څنګه کولی شو دوی په سکیپي کې ولیکو.
محدودیتونه и راځئ چې دا د Bounds څیز په کارولو سره تعریف کړو.
from scipy.optimize import Bounds
bounds = Bounds ([0, -0.5], [1.0, 2.0])
محدودیتونه и راځئ چې دا په خطي بڼه ولیکو:
راځئ چې دا محدودیتونه د LinearConstraint څیز په توګه تعریف کړو:
import numpy as np
from scipy.optimize import LinearConstraint
linear_constraint = LinearConstraint ([[1, 2], [2, 1]], [-np.inf, 1], [1, 1])
او په نهایت کې د میټریکس په شکل کې غیر خطي خنډ:
موږ د دې محدودیت لپاره د جیکوبیان میټرکس تعریف کوو او د هیسیان میټرکس یو خطي ترکیب د خپل سري ویکتور سره :
اوس موږ کولی شو یو غیر خطي خنډ د اعتراض په توګه تعریف کړو NonlinearConstraint
:
from scipy.optimize import NonlinearConstraint
def cons_f(x):
return [x[0]**2 + x[1], x[0]**2 - x[1]]
def cons_J(x):
return [[2*x[0], 1], [2*x[0], -1]]
def cons_H(x, v):
return v[0]*np.array([[2, 0], [0, 0]]) + v[1]*np.array([[2, 0], [0, 0]])
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess=cons_H)
که اندازه لویه وي، میټریکونه هم په لږ شکل کې مشخص کیدی شي:
from scipy.sparse import csc_matrix
def cons_H_sparse(x, v):
return v[0]*csc_matrix([[2, 0], [0, 0]]) + v[1]*csc_matrix([[2, 0], [0, 0]])
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1,
jac=cons_J, hess=cons_H_sparse)
یا د یو څیز په توګه LinearOperator
:
from scipy.sparse.linalg import LinearOperator
def cons_H_linear_operator(x, v):
def matvec(p):
return np.array([p[0]*2*(v[0]+v[1]), 0])
return LinearOperator((2, 2), matvec=matvec)
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1,
jac=cons_J, hess=cons_H_linear_operator)
کله چې د هیسین میټرکس محاسبه کول ډیرې هڅې ته اړتیا لري، تاسو کولی شئ ټولګي وکاروئ HessianUpdateStrategy
BFGS
и SR1
.
from scipy.optimize import BFGS
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess=BFGS())
هیسین هم د محدود توپیرونو په کارولو سره محاسبه کیدی شي:
nonlinear_constraint = NonlinearConstraint (cons_f, -np.inf, 1, jac = cons_J, hess = '2-point')
د محدودیتونو لپاره د جیکوبیان میټرکس هم د محدود توپیرونو په کارولو سره محاسبه کیدی شي. په هرصورت، پدې حالت کې د هیسیان میټرکس د محدود توپیرونو په کارولو سره محاسبه نشي کیدی. Hessian باید د فنکشن په توګه تعریف شي یا د HessianUpdateStrategy ټولګي په کارولو سره.
nonlinear_constraint = NonlinearConstraint (cons_f, -np.inf, 1, jac = '2-point', hess = BFGS ())
د اصلاح کولو ستونزې حل داسې ښکاري:
from scipy.optimize import minimize
from scipy.optimize import rosen, rosen_der, rosen_hess, rosen_hess_prod
x0 = np.array([0.5, 0])
res = minimize(rosen, x0, method='trust-constr', jac=rosen_der, hess=rosen_hess,
constraints=[linear_constraint, nonlinear_constraint],
options={'verbose': 1}, bounds=bounds)
print(res.x)
`gtol` termination condition is satisfied.
Number of iterations: 12, function evaluations: 8, CG iterations: 7, optimality: 2.99e-09, constraint violation: 1.11e-16, execution time: 0.033 s.
[0.41494531 0.17010937]
که اړتیا وي، د هیسین محاسبه کولو فعالیت د LinearOperator ټولګي په کارولو سره تعریف کیدی شي
def rosen_hess_linop(x):
def matvec(p):
return rosen_hess_prod(x, p)
return LinearOperator((2, 2), matvec=matvec)
res = minimize(rosen, x0, method='trust-constr', jac=rosen_der, hess=rosen_hess_linop,
constraints=[linear_constraint, nonlinear_constraint],
options={'verbose': 1}, bounds=bounds)
print(res.x)
یا د پیرامیټر له لارې د هیسین محصول او یو تیري ویکتور hessp
:
res = minimize(rosen, x0, method='trust-constr', jac=rosen_der, hessp=rosen_hess_prod,
constraints=[linear_constraint, nonlinear_constraint],
options={'verbose': 1}, bounds=bounds)
print(res.x)
په بدیل سره، د مطلوب فعالیت لومړی او دویم مشتق نږدې کیدی شي. د مثال په توګه، هیسین د فنکشن په کارولو سره نږدې کیدی شي SR1
(نږدې نیوتونین). تدریجي د محدود توپیرونو له مخې اټکل کیدی شي.
from scipy.optimize import SR1
res = minimize(rosen, x0, method='trust-constr', jac="2-point", hess=SR1(),
constraints=[linear_constraint, nonlinear_constraint],
options={'verbose': 1}, bounds=bounds)
print(res.x)
د شرطي اصلاح کولو میتود="SLSQP"
د SLSQP میتود د دې لپاره ډیزاین شوی چې په فارم کې د فعالیت کمولو ستونزې حل کړي:
چیرته и - د بیانونو شاخصونه چې د مساواتو یا نابرابریو په بڼه محدودیتونه بیانوي. - د فنکشن تعریف د ډومین لپاره د ټیټ او پورتنیو حدودو سیټ.
خطي او غیر خطي خنډونه د کلیدونو سره د لغتونو په بڼه بیان شوي type
, fun
и jac
.
ineq_cons = {'type': 'ineq',
'fun': lambda x: np.array ([1 - x [0] - 2 * x [1],
1 - x [0] ** 2 - x [1],
1 - x [0] ** 2 + x [1]]),
'jac': lambda x: np.array ([[- 1.0, -2.0],
[-2 * x [0], -1.0],
[-2 * x [0], 1.0]])
}
eq_cons = {'type': 'eq',
'fun': lambda x: np.array ([2 * x [0] + x [1] - 1]),
'jac': lambda x: np.array ([2.0, 1.0])
}
د لږترلږه لټون په لاندې ډول ترسره کیږي:
x0 = np.array([0.5, 0])
res = minimize(rosen, x0, method='SLSQP', jac=rosen_der,
constraints=[eq_cons, ineq_cons], options={'ftol': 1e-9, 'disp': True},
bounds=bounds)
print(res.x)
Optimization terminated successfully. (Exit mode 0)
Current function value: 0.34271757499419825
Iterations: 4
Function evaluations: 5
Gradient evaluations: 4
[0.41494475 0.1701105 ]
د اصلاح کولو بېلګه
د پنځم ټیکنالوژیک جوړښت ته د لیږد په تړاو، راځئ چې د ویب سټوډیو مثال په کارولو سره د تولید اصلاح وګورو، کوم چې موږ ته یو کوچنی مګر باثباته عاید راوړي. راځئ چې خپل ځان د یوې ګیلي رییس په توګه تصور کړو چې درې ډوله محصولات تولیدوي:
- x0 - د لینډینګ پاڼې پلورل، د 10 tr څخه.
- x1 - د کارپوریټ ویب پاڼې، د 20 tr څخه.
- x2 - آنلاین پلورنځي، له 30 tr څخه.
زموږ دوستانه کاري ټیم کې څلور کوچنيان، دوه منځني او یو لوړ پوړی شامل دي. د دوی میاشتني کاري وخت فنډ:
- جون:
4 * 150 = 600 чел * час
, - منځونه:
2 * 150 = 300 чел * час
, - مشر:
150 чел * час
.
اجازه راکړئ چې لومړی موجود جونیئر (0, 1, 2) ساعته د یو ډول سایټ (x10, x20, x30) په پراختیا او ځای پرځای کولو کې مصرف کړي، منځنی - (7, 15, 20)، لوړ پوړی - (5, 10, 15) ستاسو د ژوند ترټولو غوره وخت ساعتونه.
د هر عادي رییس په څیر، موږ غواړو چې میاشتنۍ ګټې اعظمي کړو. د بریالیتوب لومړی ګام د هدف فعالیت لیکل دي value
په میاشت کې تولید شوي محصولاتو څخه د عاید مقدار په توګه:
def value(x):
return - 10*x[0] - 20*x[1] - 30*x[2]
دا کومه تېروتنه نه ده؛ کله چې د اعظمي په لټه کې وي، د هدف فعالیت د مخالف نښه سره کم شوی.
بل ګام دا دی چې زموږ کارمندان د ډیر کار کولو څخه منع کړي او د کاري ساعتونو محدودیتونه معرفي کړي:
څه شی دی:
ineq_cons = {'type': 'ineq',
'fun': lambda x: np.array ([600 - 10 * x [0] - 20 * x [1] - 30 * x[2],
300 - 7 * x [0] - 15 * x [1] - 20 * x[2],
150 - 5 * x [0] - 10 * x [1] - 15 * x[2]])
}
یو رسمي محدودیت دا دی چې د محصول محصول باید یوازې مثبت وي:
bnds = Bounds ([0, 0, 0], [np.inf, np.inf, np.inf])
او په نهایت کې ، ترټولو ګلابي انګیرنه دا ده چې د ټیټ نرخ او لوړ کیفیت له امله ، د مطمین پیرودونکو قطار په دوامداره توګه زموږ لپاره ولاړ وي. موږ کولی شو د میاشتني تولید حجم پخپله وټاکو ، د محدودیت اصلاح کولو ستونزې حل کولو پراساس scipy.optimize
:
x0 = np.array([10, 10, 10])
res = minimize(value, x0, method='SLSQP', constraints=ineq_cons, bounds=bnds)
print(res.x)
[7.85714286 5.71428571 3.57142857]
راځئ چې د ټولو شمیرو سره په نرمۍ سره وګرځو او د محصولاتو غوره توزیع سره د قطارونو میاشتنۍ بار محاسبه کړو x = (8, 6, 3)
:
- جون:
8 * 10 + 6 * 20 + 3 * 30 = 290 чел * час
; - منځونه:
8 * 7 + 6 * 15 + 3 * 20 = 206 чел * час
; - مشر:
8 * 5 + 6 * 10 + 3 * 15 = 145 чел * час
.
پایله: د دې لپاره چې رییس خپل ښه مستحق اعظمي ترلاسه کړي ، دا غوره ده چې په میاشت کې 8 لینډینګ پا pagesې ، 6 متوسط سایټونه او 3 پلورنځي رامینځته کړئ. په دې حالت کې، لوړ پوړی باید پرته له دې چې د ماشین څخه پورته وګوري، د مینځلو بار به نږدې 2/3 وي، د نیمایي څخه کم.
پایلې
مقاله د کڅوړې سره د کار کولو لومړني تخنیکونه په ګوته کوي scipy.optimize
د مشروط کمولو ستونزې حل کولو لپاره کارول کیږي. په شخصي توګه زه کاروم scipy
په بشپړه توګه د اکادمیک موخو لپاره، له همدې امله ورکړل شوی مثال د داسې طنز طبیعت دی.
ډیری تیوری او مجازی مثالونه موندل کیدی شي، د بیلګې په توګه، د I.L. اکولیچ په کتاب کې "په مثالونو او ستونزو کې د ریاضیاتو پروګرامونه." ډیر سخت غوښتنلیک scipy.optimize
د عکسونو له سیټ څخه د 3D جوړښت رامینځته کول (
د معلوماتو اصلي سرچینه ده scipy
ښه راغلاست
سپوږمکۍ
سرچینه: www.habr.com