SciPy، د شرایطو سره سمون

SciPy، د شرایطو سره سمون

SciPy (تلفظ شوی sai pie) د ریاضیاتو یو نمپسي بسته ده چې د C او Fortran کتابتونونه هم پکې شامل دي. SciPy ستاسو د متقابل پایتون سیشن په بشپړ ډیټا ساینس چاپیریال لکه MATLAB، IDL، Octave، R، یا SciLab بدلوي.

په دې مقاله کې، موږ به د ریاضيکي پروګرام کولو بنسټیز تخنیکونه وګورو - د scipy.optimize کڅوړې په کارولو سره د څو متغیرونو د سکیلر فعالیت لپاره د شرطي اصلاح کولو ستونزې حل کول. د غیر محدود اصلاح کولو الګوریتمونه دمخه بحث شوي وروستنی مقاله. د سکایپ فنکشنونو په اړه نور تفصيلي او تازه مرستې تل د help() کمانډ، Shift+Tab یا په کارولو سره ترلاسه کیدی شي رسمي اسناد.

پېژندنه

په 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 پر بنسټ EQSQP د ستونزو لپاره چې د مساواتو په بڼه او د خنډونو سره مخ دي سفر د نابرابرۍ په بڼه د خنډونو سره د ستونزو لپاره. دواړه میتودونه د باور په سیمه کې د محلي لږترلږه موندلو لپاره د الګوریتم لخوا پلي کیږي او د لوی کچې ستونزو لپاره مناسب دي.

په عمومي شکل کې د لږ تر لږه د موندلو د ستونزې ریاضياتي تشکیل:

SciPy، د شرایطو سره سمون

SciPy، د شرایطو سره سمون

SciPy، د شرایطو سره سمون

د سخت مساوي محدودیتونو لپاره، ټیټ حد د پورتنۍ حد سره مساوي ټاکل شوی SciPy، د شرایطو سره سمون.
د یو طرفه خنډ لپاره، پورتنۍ یا ټیټ حد ټاکل شوی np.inf د اړونده نښه سره.
اجازه راکړئ چې د دوه متغیرونو لږترلږه پیژندل شوي روزنبروک فعالیت ومومئ:

SciPy، د شرایطو سره سمون

په دې حالت کې، لاندې محدودیتونه د تعریف په ډومین کې ټاکل شوي دي:

SciPy، د شرایطو سره سمون

SciPy، د شرایطو سره سمون

SciPy، د شرایطو سره سمون

SciPy، د شرایطو سره سمون

SciPy، د شرایطو سره سمون

SciPy، د شرایطو سره سمون

زموږ په قضیه کې، په نقطه کې یو ځانګړی حل شتون لري SciPy، د شرایطو سره سموند کوم لپاره چې یوازې لومړی او څلورم محدودیتونه د اعتبار وړ دي.
راځئ چې له لاندې څخه تر پورتنۍ محدودیتونو ته لاړ شو او وګورو چې موږ څنګه کولی شو دوی په سکیپي کې ولیکو.
محدودیتونه SciPy، د شرایطو سره سمون и SciPy، د شرایطو سره سمون راځئ چې دا د Bounds څیز په کارولو سره تعریف کړو.

from scipy.optimize import Bounds
bounds = Bounds ([0, -0.5], [1.0, 2.0])

محدودیتونه SciPy، د شرایطو سره سمون и SciPy، د شرایطو سره سمون راځئ چې دا په خطي بڼه ولیکو:

SciPy، د شرایطو سره سمون

راځئ چې دا محدودیتونه د LinearConstraint څیز په توګه تعریف کړو:

import numpy as np
from scipy.optimize import LinearConstraint
linear_constraint = LinearConstraint ([[1, 2], [2, 1]], [-np.inf, 1], [1, 1])

او په نهایت کې د میټریکس په شکل کې غیر خطي خنډ:

SciPy، د شرایطو سره سمون

موږ د دې محدودیت لپاره د جیکوبیان میټرکس تعریف کوو او د هیسیان میټرکس یو خطي ترکیب د خپل سري ویکتور سره SciPy، د شرایطو سره سمون:

SciPy، د شرایطو سره سمون

SciPy، د شرایطو سره سمون

اوس موږ کولی شو یو غیر خطي خنډ د اعتراض په توګه تعریف کړو 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)

کله چې د هیسین میټرکس محاسبه کول SciPy، د شرایطو سره سمون ډیرې هڅې ته اړتیا لري، تاسو کولی شئ ټولګي وکاروئ 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 میتود د دې لپاره ډیزاین شوی چې په فارم کې د فعالیت کمولو ستونزې حل کړي:

SciPy، د شرایطو سره سمون

SciPy، د شرایطو سره سمون

SciPy، د شرایطو سره سمون

SciPy، د شرایطو سره سمون

چیرته SciPy، د شرایطو سره سمون и SciPy، د شرایطو سره سمون - د بیانونو شاخصونه چې د مساواتو یا نابرابریو په بڼه محدودیتونه بیانوي. SciPy، د شرایطو سره سمون - د فنکشن تعریف د ډومین لپاره د ټیټ او پورتنیو حدودو سیټ.

خطي او غیر خطي خنډونه د کلیدونو سره د لغتونو په بڼه بیان شوي 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]

دا کومه تېروتنه نه ده؛ کله چې د اعظمي په لټه کې وي، د هدف فعالیت د مخالف نښه سره کم شوی.

بل ګام دا دی چې زموږ کارمندان د ډیر کار کولو څخه منع کړي او د کاري ساعتونو محدودیتونه معرفي کړي:

SciPy، د شرایطو سره سمون

څه شی دی:

SciPy، د شرایطو سره سمون

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 جوړښت رامینځته کول (د Habré په اړه مقاله) کې لیدل کیدی شي د پخلي کتاب.

د معلوماتو اصلي سرچینه ده docs.scipy.orgهغه کسان چې غواړي د دې او نورو برخو په ژباړه کې مرسته وکړي scipy ښه راغلاست GitHub.

سپوږمکۍ mephistophees د خپرونې په چمتو کولو کې د ګډون لپاره.

سرچینه: www.habr.com

Add a comment