SciPy, leas iomlán a bhaint le coinníollacha

SciPy, leas iomlán a bhaint le coinníollacha

Is pacáiste matamaitice numpy-bhunaithe é SciPy (pronounced sai pie) a chuimsíonn leabharlanna C agus Fortran freisin. Déanann SciPy do sheisiún idirghníomhach Python a thiontú ina thimpeallacht iomlán eolaíochta sonraí ar nós MATLAB, IDL, Octave, R, nó SciLab.

San Airteagal seo, féachfaimid ar na teicnící bunúsacha a bhaineann le ríomhchlárú matamaitice - fadhbanna leas iomlán a bhaint coinníollach a réiteach le haghaidh feidhm scálach roinnt athróg ag baint úsáide as an bpacáiste scipy.optimize. Tá algartaim bharrfheabhsaithe neamhshrianta pléite cheana féin i an t-alt deireanach. Is féidir cabhair níos mionsonraithe agus níos nuashonraithe a fháil i gcónaí ar fheidhmeanna scipy trí úsáid a bhaint as an ordú Help(), Shift+Tab nó in doiciméadú oifigiúil.

Réamhrá

Soláthraíonn an fheidhm comhéadan coiteann chun fadhbanna optamaithe coinníollach agus neamhshrianta a réiteach sa phacáiste scipy.optimize minimize(). Mar sin féin, tá a fhios nach bhfuil aon mhodh uilíoch ann chun gach fadhb a réiteach, agus mar sin tá rogha modh leordhóthanach, mar i gcónaí, ar ghualainn an taighdeora.
Sonraítear an t-algartam optamaithe cuí ag baint úsáide as an argóint feidhme minimize(..., method="").
Chun leas iomlán a bhaint go coinníollach d’fheidhm roinnt athróg, tá cur i bhfeidhm na modhanna seo a leanas ar fáil:

  • trust-constr — íosmhéid áitiúil a chuardach sa réigiún muiníne. alt Vicí, alt ar Habré;
  • SLSQP — ríomhchlárú cearnach seicheamhach le srianta, modh Newtonian chun córas Lagrange a réiteach. alt Vicí.
  • TNC - Newton Teasctha Srianta, líon teoranta atriallta, go maith le haghaidh feidhmeanna neamhlíneacha le líon mór athróg neamhspleách. alt Vicí.
  • L-BFGS-B — modh ó fhoireann Broyden-Fletcher-Goldfarb-Shanno, curtha i bhfeidhm le tomhaltas cuimhne laghdaithe mar gheall ar pháirt-lódáil veicteoirí ó mhaitrís Heiseáin. alt Vicí, alt ar Habré.
  • COBYLA — Optamú Srianta MARE Trí Chomhfhogasú Líneach, barrfheabhsú srianta le comhfhogasú líneach (gan ríomh grádáin). alt Vicí.

Ag brath ar an modh roghnaithe, socraítear coinníollacha agus srianta éagsúla chun an fhadhb a réiteach:

  • réad ranga Bounds le haghaidh modhanna L-BFGS-B, TNC, SLSQP, trust-constr;
  • an liosta (min, max) do na modhanna céanna L-BFGS-B, TNC, SLSQP, trust-constr;
  • réad nó liosta rudaí LinearConstraint, NonlinearConstraint do COBYLA, SLSQP, modhanna muinín-constr;
  • foclóir nó liosta foclóirí {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} le haghaidh COBYLA, modhanna SLSQP.

Imlíne alt:
1) Smaoinigh ar úsáid a bhaint as algartam barrfheabhsaithe coinníollach sa réigiún iontaobhais (modh = ”trust-constr”) le srianta sonraithe mar oibiachtaí Bounds, LinearConstraint, NonlinearConstraint ;
2) Déan machnamh ar ríomhchlárú seicheamhach agus úsáid á baint as modh na gcearnóga is lú (modh = "SLSQP") le srianta sonraithe i bhfoirm foclóir {'type', 'fun', 'jac', 'args'};
3) Déan anailís ar shampla de bharrfheabhsú táirgí monaraithe ag baint úsáide as an sampla de stiúideo gréasáin.

Modh leas iomlán a bhaint coinníollach = "trust-constr"

Cur i bhfeidhm an mhodha trust-constr bunaithe ar EQSQP le haghaidh fadhbanna le srianta foirm an chomhionannais agus ar TRIP le haghaidh fadhbanna le srianta i bhfoirm éagothroime. Cuirtear an dá mhodh i bhfeidhm le halgartaim chun íosmhéid áitiúil a aimsiú sa réigiún muiníne agus tá siad oiriúnach go maith le haghaidh fadhbanna ar scála mór.

Foirmiú matamaiticiúil ar an bhfadhb maidir le híosmhéid a aimsiú i bhfoirm ghinearálta:

SciPy, leas iomlán a bhaint le coinníollacha

SciPy, leas iomlán a bhaint le coinníollacha

SciPy, leas iomlán a bhaint le coinníollacha

Le haghaidh srianta comhionannais dian, socraítear an teorainn íochtair comhionann leis an teorainn uachtarach SciPy, leas iomlán a bhaint le coinníollacha.
Le haghaidh srian aon-bhealach, socraítear an teorainn uachtarach nó níos ísle np.inf leis an gcomhartha comhfhreagrach.
Bíodh sé riachtanach an t-íosmhéid d’fheidhm Rosenbrock aitheanta de dhá athróg a fháil:

SciPy, leas iomlán a bhaint le coinníollacha

Sa chás seo, leagtar na srianta seo a leanas ar a réimse sainmhínithe:

SciPy, leas iomlán a bhaint le coinníollacha

SciPy, leas iomlán a bhaint le coinníollacha

SciPy, leas iomlán a bhaint le coinníollacha

SciPy, leas iomlán a bhaint le coinníollacha

SciPy, leas iomlán a bhaint le coinníollacha

SciPy, leas iomlán a bhaint le coinníollacha

In ár gcás, tá réiteach uathúil ar an bpointe SciPy, leas iomlán a bhaint le coinníollacha, nach bhfuil ach an chéad agus an ceathrú srian bailí ina leith.
A ligean ar dul tríd na srianta ó bhun go barr agus féachaint ar conas is féidir linn iad a scríobh i scipy.
Srianta SciPy, leas iomlán a bhaint le coinníollacha и SciPy, leas iomlán a bhaint le coinníollacha a ligean ar a shainiú ag baint úsáide as an réad Bounds.

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

Srianta SciPy, leas iomlán a bhaint le coinníollacha и SciPy, leas iomlán a bhaint le coinníollacha Scríobhaimis é i bhfoirm líneach:

SciPy, leas iomlán a bhaint le coinníollacha

Sainmhínímid na srianta seo mar réad LinearConstraint:

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

Agus ar deireadh an srian neamhlíneach i bhfoirm maitrís:

SciPy, leas iomlán a bhaint le coinníollacha

Sainmhínímid an mhaitrís Seacaibíteach don srian seo agus teaglaim líneach den mhaitrís Heiseánach le veicteoir treallach SciPy, leas iomlán a bhaint le coinníollacha:

SciPy, leas iomlán a bhaint le coinníollacha

SciPy, leas iomlán a bhaint le coinníollacha

Anois is féidir linn srian neamhlíneach a shainiú mar réad 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)

Má tá an méid mór, is féidir maitrísí a shonrú i bhfoirm tanaí freisin:

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)

nó mar réad 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)

Agus an maitrís Heiseán á ríomh SciPy, leas iomlán a bhaint le coinníollacha Éilíonn a lán iarracht, is féidir leat úsáid a bhaint as rang HessianUpdateStrategy. Tá na straitéisí seo a leanas ar fáil: BFGS и SR1.

from scipy.optimize import BFGS

nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess=BFGS())

Is féidir an Heiseán a ríomh freisin trí úsáid a bhaint as difríochtaí críochta:

nonlinear_constraint = NonlinearConstraint (cons_f, -np.inf, 1, jac = cons_J, hess = '2-point')

Is féidir an mhaitrís Seacaibíteach le haghaidh srianta a ríomh freisin trí úsáid a bhaint as difríochtaí críochta. Sa chás seo, áfach, ní féidir maitrís Heiseán a ríomh trí úsáid a bhaint as difríochtaí críochta. Ní mór an Heiseán a shainiú mar fheidhm nó ag baint úsáide as an rang HessianUpdateStrategy.

nonlinear_constraint = NonlinearConstraint (cons_f, -np.inf, 1, jac = '2-point', hess = BFGS ())

Breathnaíonn an réiteach ar an bhfadhb optamaithe mar seo:

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]

Más gá, is féidir an fheidhm chun an Heiseán a ríomh a shainiú ag baint úsáide as an rang 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)

nó táirge an Heiseáin agus veicteoir treallach tríd an bparaiméadar 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)

Mar mhalairt air sin, is féidir an chéad agus an dara díorthach den fheidhm atá á optamú a chomhfhogasú. Mar shampla, is féidir an Heiseán a chomhfhogasú leis an bhfeidhm SR1 (comhfhogasú gar-Newtonian). Is féidir an grádán a chomhfhogasú trí dhifríochtaí críochta.

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)

Modh optamaithe coinníollach="SLSQP"

Tá an modh SLSQP deartha chun fadhbanna a bhaineann le feidhm a íoslaghdú a réiteach i bhfoirm:

SciPy, leas iomlán a bhaint le coinníollacha

SciPy, leas iomlán a bhaint le coinníollacha

SciPy, leas iomlán a bhaint le coinníollacha

SciPy, leas iomlán a bhaint le coinníollacha

Cá háit SciPy, leas iomlán a bhaint le coinníollacha и SciPy, leas iomlán a bhaint le coinníollacha — tacair innéacsanna de nathanna a dhéanann cur síos ar shrianta i bhfoirm comhionannais nó neamhionannais. SciPy, leas iomlán a bhaint le coinníollacha — tacair de theorainneacha íochtair agus uachtair don réimse sainmhínithe ar an bhfeidhm.

Déantar cur síos ar shrianta líneacha agus neamhlíneacha i bhfoirm foclóirí le heochracha 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])
          }

Déantar an cuardach don íosmhéid mar seo a leanas:

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 ]

Sampla leas iomlán a bhaint

Maidir leis an aistriú go dtí an cúigiú struchtúr teicneolaíochta, déanaimis féachaint ar bharrfheabhsú táirgeachta ag baint úsáide as an sampla de stiúideo gréasáin, a thugann ioncam beag ach cobhsaí dúinn. Samhlóimis sinn féin mar stiúrthóir ar bhilse a tháirgeann trí chineál táirgí:

  • x0 - díol leathanaigh tuirlingthe, ó 10 tr.
  • x1 - láithreáin ghréasáin corparáideacha, ó 20 tr.
  • x2 - siopaí ar líne, ó 30 tr.

Cuimsíonn ár bhfoireann oibre chairdiúil ceathrar sóisear, beirt lár agus duine sinsearach. A gciste míosúil ama oibre:

  • Meitheamh: 4 * 150 = 600 чел * час,
  • lár: 2 * 150 = 300 чел * час,
  • seanóir: 150 чел * час.

Lig don chéad sóisearach atá ar fáil uaireanta (0, 1, 2) a chaitheamh ar fhorbairt agus ar imscaradh láithreán amháin de chineál (x10, x20, x30), lár - (7, 15, 20), sinsearach - (5, 10, 15). ) uair an chloig den am is fearr de do shaol.

Cosúil le haon ghnáthstiúrthóir, ba mhaith linn brabúis mhíosúla a uasmhéadú. Is é an chéad chéim chun rathúlachta ná an fheidhm oibiachtúil a scríobh síos value mar mhéid an ioncaim ó tháirgí a tháirgtear in aghaidh na míosa:

def value(x):
    return - 10*x[0] - 20*x[1] - 30*x[2]

Ní earráid é seo; nuair a bhíonn an t-uasmhéid á chuardach, íoslaghdaítear an fheidhm oibiachtúil leis an gcomhartha eile.

Is é an chéad chéim eile ná cosc ​​a chur ar ár bhfostaithe ró-obair a dhéanamh agus srianta ar uaireanta oibre a thabhairt isteach:

SciPy, leas iomlán a bhaint le coinníollacha

Cad is comhionann:

SciPy, leas iomlán a bhaint le coinníollacha

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]])
            }

Srian foirmiúil é nach mór d’aschur táirge a bheith dearfach amháin:

bnds = Bounds ([0, 0, 0], [np.inf, np.inf, np.inf])

Agus ar deireadh, is é an toimhde is rosy ná mar gheall ar an bpraghas íseal agus ar ardchaighdeán, go bhfuil scuaine de chustaiméirí sásta i gcónaí ag teacht suas dúinn. Is féidir linn na méideanna táirgeachta míosúla a roghnú dúinn féin, bunaithe ar an bhfadhb optamaithe srianta a réiteach 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]

Déanaimis slánú go dtí slánuimhreacha agus ríomhaimid ualach míosúil na n-iomairí le dáileadh optamach táirgí x = (8, 6, 3) :

  • Meitheamh: 8 * 10 + 6 * 20 + 3 * 30 = 290 чел * час;
  • lár: 8 * 7 + 6 * 15 + 3 * 20 = 206 чел * час;
  • seanóir: 8 * 5 + 6 * 10 + 3 * 15 = 145 чел * час.

Conclúid: ionas go bhfaighidh an stiúrthóir an t-uasmhéid atá tuillte go maith aige, is fearr 8 leathanach tuirlingthe, 6 shuíomh meánmhéide agus 3 stór in aghaidh na míosa a chruthú. Ag an am céanna, ní mór don sinsearach treabhadh gan breathnú suas as an meaisín a bheith thart ar 2/3, na sóisearacha níos lú ná leath.

Conclúid

Imlíníonn an t-alt na teicnící bunúsacha chun oibriú leis an bpacáiste scipy.optimize, a úsáidtear chun fadhbanna íoslaghdaithe coinníollach a réiteach. Go pearsanta úsáidim scipy chun críocha acadúla amháin, agus sin an fáth go bhfuil an sampla a thugtar chomh grinn sin.

Tá go leor teoiricí agus samplaí fíorúla le fáil, mar shampla, sa leabhar le I.L. Iarratas hardcore níos mó scipy.optimize struchtúr 3D a thógáil ó thacar íomhánna (alt ar Habré) le feiceáil i scipy-cócaireacht.

Is é an príomhfhoinse faisnéise docs.scipy.orgiad siúd ar mian leo cur le haistriúchán na míre seo agus rannóg eile scipy Fáilte go GitHub.

Go raibh maith agat mefaistéití do rannpháirtíocht in ullmhú an fhoilseacháin.

Foinse: will.com

Ceannaigh óstáil iontaofa do shuímh le cosaint DDoS, freastalaithe VPS VDS 🔥 Ceannaigh óstáil gréasáin iontaofa le cosaint DDoS, freastalaithe VPS VDS | ProHoster