
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 . 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 .
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. , ;SLSQP— ríomhchlárú cearnach seicheamhach le srianta, modh Newtonian chun córas Lagrange a réiteach. .TNC- Newton Teasctha Srianta, líon teoranta atriallta, go maith le haghaidh feidhmeanna neamhlíneacha le líon mór athróg neamhspleách. .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. , .COBYLA— Optamú Srianta MARE Trí Chomhfhogasú Líneach, barrfheabhsú srianta le comhfhogasú líneach (gan ríomh grádáin). .
Ag brath ar an modh roghnaithe, socraítear coinníollacha agus srianta éagsúla chun an fhadhb a réiteach:
- réad ranga
Boundsle 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,NonlinearConstraintdo 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 le haghaidh fadhbanna le srianta foirm an chomhionannais agus ar 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:



Le haghaidh srianta comhionannais dian, socraítear an teorainn íochtair comhionann leis an teorainn uachtarach
.
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:

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






In ár gcás, tá réiteach uathúil ar an bpointe
, 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
и
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
и
Scríobhaimis é i bhfoirm líneach:

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:

Sainmhínímid an mhaitrís Seacaibíteach don srian seo agus teaglaim líneach den mhaitrís Heiseánach le veicteoir treallach
:


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
Éilíonn a lán iarracht, is féidir leat úsáid a bhaint as rang . 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:




Cá háit
и
— tacair innéacsanna de nathanna a dhéanann cur síos ar shrianta i bhfoirm comhionannais nó neamhionannais.
— 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:

Cad is comhionann:

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 () le feiceáil i .
Is é an príomhfhoinse faisnéise iad siúd ar mian leo cur le haistriúchán na míre seo agus rannóg eile scipy Fáilte go .
Go raibh maith agat do rannpháirtíocht in ullmhú an fhoilseacháin.
Foinse: will.com
