
I-SciPy (ebizwa ngokuba yi-sai pie) yiphakheji yezibalo esekwe kwi-numpy ekwabandakanya amathala eencwadi e-C kunye ne-Fortran. I-SciPy ijika iseshoni yakho yePython esebenzayo ibe yindawo epheleleyo yesayensi yedatha efana neMATLAB, IDL, Octave, R, okanye SciLab.
Kweli nqaku, siza kujonga iindlela ezisisiseko zokucwangcisa imathematika - ukusombulula iingxaki zokuphucula iimeko zomsebenzi we-scalar wezinto ezininzi ezahlukeneyo usebenzisa iphakheji ye-scipy.optimize. Ii-algorithms ezinganyanzelwanga zokuphucula sele kuxoxiwe ngazo . Iinkcukacha ezithe kratya kunye noncedo oluhlaziyiweyo kwimisebenzi ye-scipy lunokuhlala lufumaneka usebenzisa uncedo () umyalelo, Shift+Tab okanye kwi. .
Intshayelelo
Ujongano oluqhelekileyo lokusombulula zombini iingxaki ezinemiqathango nezingathintelekiyo kwipakethe ye-scipy.optimize inikwe ngumsebenzi. minimize(). Nangona kunjalo, kuyaziwa ukuba akukho ndlela yendalo yonke yokusombulula zonke iingxaki, ngoko ke ukhetho lwendlela eyaneleyo, njengokuba njalo, luwela kumahlombe omphandi.
I-algorithm yolungiselelo olufanelekileyo ixelwa kusetyenziswa ingxabano yomsebenzi minimize(..., method="").
Ukulungiswa okunemiqathango komsebenzi weenguqu ezininzi, ukuphunyezwa kwezi ndlela zilandelayo ziyafumaneka:
trust-constr— khangela ubuncinci bendawo kwindawo yokuzithemba. , ;SLSQP- inkqubo ye-quadratic elandelelanayo enemithintelo, indlela yeNewtonian yokusombulula inkqubo yeLagrange. .TNC- I-Truncated Newton Constrained, inani elilinganiselweyo lokuphindaphinda, ilungile kwimisebenzi engabonakaliyo kunye nenani elikhulu lezinto ezizimeleyo. .L-BFGS-B-indlela esuka kwiqela le-Broyden-Fletcher-Goldfarb-Shanno, ephunyezwe ngokunciphisa ukusetyenziswa kwememori ngenxa yokulayishwa ngokuyinxenye kwee-vectors ezivela kwi-matrix ye-Hessian. , .COBYLA-I-MARE Constrained Optimization nguLinear Approximation, ukunyanzeliswa kokulungelelaniswa kunye noqikelelo lomda (ngaphandle kokubala kwegradient). .
Ngokuxhomekeke kwindlela ekhethiweyo, iimeko kunye nezithintelo zokusombulula ingxaki zisetwa ngokwahlukileyo:
- into yeklasi
Boundskwiindlela ze-L-BFGS-B, TNC, SLSQP, trust-constr; - uluhlu
(min, max)kwiindlela ezifanayo L-BFGS-B, TNC, SLSQP, trust-constr; - into okanye uluhlu lwezinto
LinearConstraint,NonlinearConstraintyeCOBYLA, SLSQP, iindlela zokuthembela-constr; - isichazi-magama okanye uluhlu lwezichazi-magama
{'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt}yeCOBYLA, iindlela ze-SLSQP.
Ulwandlalo lwenqaku:
1) Qwalasela ukusetyenziswa kwe-algorithm yokuphucula imiqathango kwindawo yokuthembela (indlela = "trust-constr") kunye nemiqobo echazwe njengezinto. Bounds, LinearConstraint, NonlinearConstraint ;
2) Qwalasela udweliso lwenkqubo olulandelelanayo usebenzisa indlela yezikwere ezincinci (indlela = "SLSQP") enezithintelo ezichazwe kuhlobo lwesichazi-magama. {'type', 'fun', 'jac', 'args'};
3) Hlalutya umzekelo wokulungiswa kweemveliso ezenziweyo usebenzisa umzekelo we-studio yewebhu.
Indlela yokuphucula enemiqathango="ithemba-constr"
Ukuphunyezwa kwendlela trust-constr ngenxa ye kwiingxaki ezinemithintelo yohlobo lokulingana kunye nokuqhubeka kwiingxaki ezinemiqobo ngendlela yokungalingani. Zombini iindlela ziphunyezwa nge-algorithms zokufumana ubuncinci bendawo kwindawo yokuzithemba kwaye zilungele kakuhle iingxaki ezinkulu.
Ukuqulunqwa kwezibalo zengxaki yokufumana ubuncinci kwifom ngokubanzi:



Kwimiqobo engqongqo yokulingana, umda ophantsi ubekwe ulingana nomda ophezulu
.
Ukunyanzeliswa kwendlela enye, umda ophezulu okanye osezantsi ubekiwe np.inf ngophawu oluhambelanayo.
Makube yimfuneko ukufumana ubuncinci bomsebenzi owaziwayo weRosenbrock wezinto ezimbini eziguquguqukayo:

Kule meko, ezi zithintelo zilandelayo zisetwe kwindawo yayo yenkcazo:






Kwimeko yethu, kukho isisombululo esikhethekileyo kwinqanaba
, apho kuphela izithintelo zokuqala nezesine zivumelekile.
Makhe sidlule kwizithintelo ukusuka ezantsi ukuya phezulu kwaye sijonge indlela esinokuyibhala ngayo kwi-scipy.
Zi thintelo
и
masiyichaze sisebenzisa into yeMida.
from scipy.optimize import Bounds
bounds = Bounds ([0, -0.5], [1.0, 2.0])Zi thintelo
и
Masiyibhale ngendlela yomgca:

Makhe sichaze le miqobo njengento ye-LinearConstraint:
import numpy as np
from scipy.optimize import LinearConstraint
linear_constraint = LinearConstraint ([[1, 2], [2, 1]], [-np.inf, 1], [1, 1])Kwaye ekugqibeleni isithintelo esingenamgca kwifom ye-matrix:

Sichaza i-matrix ye-Jacobian yesi sithintelo kunye nendibaniselwano yomgca we-matrix ye-Hessian kunye ne-vector engafanelekanga.
:


Ngoku sinokuchaza isithintelo esingenamgca njengento 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)Ukuba ubungakanani bukhulu, iimatriki nazo zinokuchazwa ngendlela enqabileyo:
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)okanye njengento 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)Xa ubala i-matrix ye-Hessian
kufuna umgudu omkhulu, ungasebenzisa iklasi . Ezi zicwangciso zilandelayo ziyafumaneka: BFGS и SR1.
from scipy.optimize import BFGS
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess=BFGS())I-Hessian ingabalwa ngokusebenzisa iiyantlukwano ezinqamlekileyo:
nonlinear_constraint = NonlinearConstraint (cons_f, -np.inf, 1, jac = cons_J, hess = '2-point')I-matrix ye-Jacobian yezithintelo nayo ingabalwa ngokusebenzisa iiyantlukwano ezinqamlekileyo. Nangona kunjalo, kule meko i-matrix ye-Hessian ayinakubalwa ngokusebenzisa iiyantlukwano ezinqamlekileyo. I-Hessian kufuneka ichazwe njengomsebenzi okanye usebenzisa iklasi ye-HessianUpdateStrategy.
nonlinear_constraint = NonlinearConstraint (cons_f, -np.inf, 1, jac = '2-point', hess = BFGS ())Isisombululo kwingxaki yolungiselelo sijongeka ngolu hlobo:
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]Ukuba kuyimfuneko, umsebenzi wokubala i-Hessian unokuchazwa kusetyenziswa iklasi ye-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)okanye imveliso ye-Hessian kunye ne-vector engafanelekanga ngeparameter 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)Kungenjalo, i-derivatives yokuqala neyesibini yomsebenzi owenziwayo inokuqikelelwa. Umzekelo, i-Hessian inokuqikelelwa kusetyenziswa umsebenzi SR1 (quasi-Newtonian approximation). Ithambeka linokuqikelelwa ngomahluko onomda.
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)Indlela yokuphucula enemiqathango="SLSQP"
Indlela ye-SLSQP yenzelwe ukusombulula iingxaki zokunciphisa umsebenzi ngendlela:




Kuphi
и
- iiseti zezalathisi zentetho ezichaza izithintelo ngendlela yokulingana okanye ukungalingani.
- iiseti zemida ephantsi kunye nephezulu kwi-domain yenkcazo yomsebenzi.
Izithintelo zomgca kunye nezingahambelaniyo zichazwe ngendlela yezichazi-magama ezinezitshixo 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])
}Ukukhangela ubuncinci benziwa ngolu hlobo lulandelayo:
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 ]Umzekelo wokuphucula
Ngokubhekiselele kwinguqu kwisakhiwo seteknoloji yesihlanu, makhe sijonge ukulungelelaniswa kwemveliso usebenzisa umzekelo we-studio yewebhu, esizisa umvuzo omncinci kodwa ozinzile. Masibe nomfanekiso-ngqondweni wethu njengomlawuli wenqanawa evelisa iindidi ezintathu zeemveliso:
- x0 - ukuthengisa amaphepha okumisa, ukusuka kwi-10 tr.
- x1 - iiwebhusayithi zenkampani, ukusuka kwi-20 tr.
- x2 - iivenkile ze-intanethi, ukusuka kwi-30 tr.
Iqela lethu elisebenza ngobuhlobo libandakanya abancinci abane, abaphakathi ababini kunye nomnye ophezulu. Ingxowa-mali yabo yexesha lokusebenza yenyanga:
- NgoJuni:
4 * 150 = 600 чел * час, - iphakathi:
2 * 150 = 300 чел * час, - umncedisi:
150 чел * час.
Vumela abancinci bokuqala abakhoyo bachithe (0, 1, 2) iiyure kuphuhliso kunye nokusasazwa kwendawo enye yohlobo (x10, x20, x30), phakathi - (7, 15, 20), abadala - (5, 10, 15 ) iiyure zelona xesha lilungileyo lobomi bakho.
Njengaye nawuphi na umlawuli oqhelekileyo, sifuna ukwandisa inzuzo yenyanga. Inyathelo lokuqala lokuphumelela kukubhala phantsi umsebenzi wenjongo value njengesixa sengeniso evela kwiimveliso eziveliswa ngenyanga:
def value(x):
return - 10*x[0] - 20*x[1] - 30*x[2]Oku akuyompazamo xa ukhangela ubuninzi, umsebenzi wenjongo uyancitshiswa ngophawu oluchaseneyo.
Inyathelo elilandelayo kukuthintela abasebenzi bethu ekusebenzeni ngokugqithisileyo kunye nokwazisa izithintelo kwiiyure zokusebenza:

Yintoni elinganayo:

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]])
}Isithintelo esisesikweni kukuba imveliso kufuneka ibe ntle kuphela:
bnds = Bounds ([0, 0, 0], [np.inf, np.inf, np.inf])Kwaye okokugqibela, eyona ngcinga intle kukuba ngenxa yexabiso eliphantsi kunye nomgangatho ophezulu, umgca wabathengi abonelisekileyo uhlala ufolele thina. Singazikhethela ngokwethu umthamo wemveliso wenyanga ngokwethu, ngokusekwe ekusombululeni ingxaki yokuphucula enemiqobo 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]Masijikeleze ngokukhululekileyo kumanani apheleleyo kwaye sibale umthwalo wenyanga wababheqi ngokusasazwa ngokufanelekileyo kweemveliso x = (8, 6, 3) :
- NgoJuni:
8 * 10 + 6 * 20 + 3 * 30 = 290 чел * час; - iphakathi:
8 * 7 + 6 * 15 + 3 * 20 = 206 чел * час; - umncedisi:
8 * 5 + 6 * 10 + 3 * 15 = 145 чел * час.
Isiphelo: ukwenzela ukuba umlawuli afumane ubuninzi bakhe obufanelekileyo, kulungele ukudala amaphepha angama-8, iindawo ezi-6 eziphakathi kunye neevenkile ezi-3 ngenyanga. Kule meko, umntu ophezulu kufuneka alime ngaphandle kokujonga phezulu kumatshini, umthwalo we-middles uya kuba malunga ne-2/3, abancinci ngaphantsi kwesiqingatha.
isiphelo
Inqaku lichaza iindlela ezisisiseko zokusebenza kunye nephakheji scipy.optimize, esetyenziselwa ukusombulula iingxaki zokunciphisa iimeko. Ngokwam ndisebenzisa scipy kuphela ngeenjongo zemfundo, yiyo loo nto umzekelo onikiweyo ungowohlobo oluhlekisayo.
Ithiyori eninzi kunye nemizekelo ebonakalayo inokufumaneka, umzekelo, kwincwadi ka-I.L. Akulich "Inkqubo yezibalo kwimizekelo kunye neengxaki." Usetyenziso olunzima ngakumbi scipy.optimize ukwakha isakhelo se-3D ukusuka kwiseti yemifanekiso () inokujongwa kwi .
Umthombo oyintloko wolwazi abo banqwenela ukufaka isandla ekuguqulelweni kweli candelo namanye scipy Wamkelekile kwi .
Спасибо ngokuthatha inxaxheba ekulungiseleleni upapasho.
umthombo: www.habr.com
