SciPy, optimization le maemo

SciPy, optimization le maemo

SciPy (e bitsoa sai pie) ke sephutheloana sa lipalo se thehiloeng ho numpy se kenyeletsang lilaebrari tsa C le Fortran. SciPy e fetola seboka sa hau sa Python se sebetsang tikolohong e felletseng ea mahlale a data joalo ka MATLAB, IDL, Octave, R, kapa SciLab.

Sehloohong sena, re tla sheba mekhoa ea motheo ea lenaneo la lipalo - ho rarolla mathata a ho ntlafatsa maemo bakeng sa ts'ebetso ea scalar ea mefuta e mengata e sebelisang sephutheloana sa scipy.optimize. Li-algorithms tsa optimization tse sa lekanyetsoang li se li tšohliloe ho sengoloa sa ho qetela. Thuso e qaqileng haholoanyane le ea morao-rao mabapi le mesebetsi ea scipy e ka fumanoa kamehla ka thuso () taelo, Shift+Tab kapa ho litokomane tsa molao.

Selelekela

Sehokelo se tloaelehileng sa ho rarolla mathata a nang le maemo le a sa tsitsang ka har'a sephutheloana sa scipy.optimize se fanoa ke mosebetsi. minimize(). Leha ho le joalo, hoa tsebahala hore ha ho na mokhoa oa bokahohleng oa ho rarolla mathata ohle, kahoo khetho ea mokhoa o lekaneng, joalo ka kamehla, o oela mahetleng a mofuputsi.
Algorithm e nepahetseng ea optimization e hlalositsoe ho sebelisoa khang ea tšebetso minimize(..., method="").
Bakeng sa optimization ea maemo a ts'ebetso ea mefuta e mengata, ts'ebetsong ea mekhoa e latelang ea fumaneha:

  • trust-constr - batla bonyane ba lehae sebakeng sa kholiseho. Sengoloa sa Wiki, sengoloa se buang ka Habré;
  • SLSQP - lenaneo la sequential quadratic le lithibelo, mokhoa oa Newtonian oa ho rarolla sistimi ea Lagrange. Sengoloa sa Wiki.
  • TNC - Newton Constrained, palo e lekanyelitsoeng ea ho pheta-pheta, e ntle bakeng sa mesebetsi e sa tloaelehang e nang le palo e kholo ea mefuta e ikemetseng. Sengoloa sa Wiki.
  • L-BFGS-B - mokhoa o tsoang ho sehlopha sa Broyden-Fletcher-Goldfarb-Shanno, o kenngoeng ts'ebetsong ka tšebeliso e fokotsehileng ea mohopolo ka lebaka la ho kenya li-vector ho tloha matrix a Hessian. Sengoloa sa Wiki, sengoloa se buang ka Habré.
  • COBYLA - MARE Constrained Optimization By Linear Approximation, e thibelang ts'ebetso e nang le tekanyo e lekanang (ntle le lipalo tsa gradient). Sengoloa sa Wiki.

Ho latela mokhoa o khethiloeng, maemo le lithibelo tsa ho rarolla bothata li behiloe ka tsela e fapaneng:

  • ntho ea sehlopha Bounds bakeng sa mekhoa ea L-BFGS-B, TNC, SLSQP, trust-constr;
  • lethathamo (min, max) bakeng sa mekhoa e tšoanang L-BFGS-B, TNC, SLSQP, trust-constr;
  • ntho kapa lenane la dintho LinearConstraint, NonlinearConstraint bakeng sa COBYLA, SLSQP, mekhoa ea trust-constr;
  • bukantswe kapa lenane la bukantswe {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} bakeng sa COBYLA, mekhoa ea SLSQP.

Kemiso ea sengoloa:
1) Nahana ka tšebeliso ea algorithm ea optimization e nang le maemo sebakeng sa trust (mokhoa = "trust-constr") ka lithibelo tse boletsoeng joalo ka lintho. Bounds, LinearConstraint, NonlinearConstraint ;
2) Nahana ka tatellano ea mananeo u sebelisa mokhoa o fokolang oa lisekoere (mokhoa = "SLSQP") ka lithibelo tse boletsoeng ka mokhoa oa bukantswe. {'type', 'fun', 'jac', 'args'};
3) Sekaseka mohlala oa ntlafatso ea lihlahisoa tse entsoeng u sebelisa mohlala oa studio ea webo.

Conditional optimization method="trust-constr"

Phethahatso ea mokhoa trust-constr ho ipapisitsoe le EQSQP bakeng sa mathata a dithibelo tsa sebopeho sa tekano le ho ya pele TS'ELISO bakeng sa mathata a nang le lithibelo ka mokhoa oa ho se lekane. Mekhoa ena ka bobeli e sebelisoa ke li-algorithms bakeng sa ho fumana bonyane ba lehae sebakeng sa kholiseho mme e loketse hantle bakeng sa mathata a maholo.

Tlhahiso ea lipalo ea bothata ba ho fumana bonyane ka mokhoa o akaretsang:

SciPy, optimization le maemo

SciPy, optimization le maemo

SciPy, optimization le maemo

Bakeng sa lithibelo tse tiileng tsa tekano, moeli o ka tlaase o behiloe o lekana le moeli o ka holimo SciPy, optimization le maemo.
Bakeng sa thibelo ea tsela e le 'ngoe, moeli o ka holimo kapa o tlaase o behiloe np.inf ka letshwao le tsamaellanang le lona.
Ho ke ho hlokehe ho fumana bonyane ba ts'ebetso e tsebahalang ea Rosenbrock ea mefuta e 'meli:

SciPy, optimization le maemo

Tabeng ena, lithibelo tse latelang li behiloe sebakeng sa tlhaloso ea eona:

SciPy, optimization le maemo

SciPy, optimization le maemo

SciPy, optimization le maemo

SciPy, optimization le maemo

SciPy, optimization le maemo

SciPy, optimization le maemo

Tabeng ea rona, ho na le tharollo e ikhethang ntlheng ena SciPy, optimization le maemo, e leng feela lithibelo tsa pele le tsa bone tse sebetsang.
Ha re feteleng ka lithibelo ho tloha tlase ho ea holimo 'me re shebe hore na re ka li ngola joang ka scipy.
Lithibelo SciPy, optimization le maemo и SciPy, optimization le maemo ha re e hlalose re sebelisa ntho ea Meeli.

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

Lithibelo SciPy, optimization le maemo и SciPy, optimization le maemo Ha re e ngole ka mokhoa oa mela:

SciPy, optimization le maemo

Ha re hlalose litšitiso tsena e le ntho ea LinearConstraint:

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

Mme qetellong tšitiso e se nang moeli ka sebopeho sa matrix:

SciPy, optimization le maemo

Re hlalosa matrix a Jacobian bakeng sa tšitiso ena le motsoako oa linear oa matrix oa Hessian o nang le vector e ikemetseng. SciPy, optimization le maemo:

SciPy, optimization le maemo

SciPy, optimization le maemo

Hona joale re ka hlalosa tšitiso e se nang moeli e le ntho 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)

Haeba boholo bo le boholo, matrices a ka hlalosoa ka mokhoa o fokolang:

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)

kapa joalo ka ntho 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)

Ha u bala matrix a Hessian SciPy, optimization le maemo e hloka boiteko bo boholo, o ka sebelisa sehlopha HessianUpdateStrategy. Maano a latelang a teng: BFGS и SR1.

from scipy.optimize import BFGS

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

Hessian e ka baloa ho sebelisa liphapang tse fokolang:

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

Matrix a Jacobian bakeng sa lithibelo a ka boela a baloa ho sebelisoa liphapang tse fokolang. Leha ho le joalo, tabeng ena matrix ea Hessian e ke ke ea baloa ho sebelisoa liphapang tse fokolang. Hessian e tlameha ho hlalosoa e le ts'ebetso kapa ho sebelisa sehlopha sa HessianUpdateStrategy.

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

Tharollo ea bothata ba optimization e shebahala tjena:

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]

Haeba ho hlokahala, ts'ebetso ea ho bala Hessian e ka hlalosoa ho sebelisoa sehlopha sa 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)

kapa sehlahisoa sa Hessian le vector e ikemetseng ka paramente 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)

Ntle le moo, li-derivatives tsa pele le tsa bobeli tsa ts'ebetso e ntlafalitsoeng li ka hakanyetsoa. Mohlala, Hessian e ka hakanyetsoa ho sebelisoa ts'ebetso SR1 (karolelano ea quasi-Newtonian). Gradient e ka hakanyetsoa ka liphapang tse fokolang.

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)

Mokhoa oa ho ntlafatsa ka maemo = "SLSQP"

Mokhoa oa SLSQP o etselitsoe ho rarolla mathata a ho fokotsa ts'ebetso ka sebopeho:

SciPy, optimization le maemo

SciPy, optimization le maemo

SciPy, optimization le maemo

SciPy, optimization le maemo

Moo SciPy, optimization le maemo и SciPy, optimization le maemo - lihlopha tsa li-indices tsa lipolelo tse hlalosang lithibelo ka mokhoa oa ho lekana kapa ho se lekane. SciPy, optimization le maemo - lihlopha tsa meeli e tlaase le e ka holimo bakeng sa sebaka sa tlhaloso ea mosebetsi.

Litšitiso tsa linear le tse se nang moeli li hlalosoa ka mokhoa oa lidikishinari tse nang le linotlolo 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])
          }

Patlo ea bonyane e etsoa ka tsela e latelang:

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 ]

Mohlala oa Ntlafatso

Mabapi le phetoho ea mokhoa oa bohlano oa theknoloji, a re shebeng ntlafatso ea tlhahiso ka mohlala oa studio ea websaete, e re tlisetsang chelete e nyenyane empa e tsitsitse. A re inahane re le motsamaisi oa sekepe se hlahisang mefuta e meraro ea lihlahisoa:

  • x0 - ho rekisa maqephe a lulisa, ho tloha ho 10 tr.
  • x1 - liwebsaete tsa khoebo, ho tloha ho 20 tr.
  • x2 - mabenkele a marang-rang, ho tloha ho 30 tr.

Sehlopha sa rona se sebetsang se nang le botsoalle se kenyelletsa bacha ba bane, ba mahareng ba babeli le ba baholo a le mong. Letlole la bona la khoeli le khoeli la nako ea ho sebetsa:

  • Phuptjane: 4 * 150 = 600 чел * час,
  • mahareng: 2 * 150 = 300 чел * час,
  • sebono: 150 чел * час.

Lumella bacha ba pele ba fumanehang hore ba qete lihora tse (0, 1, 2) ho nts'etsopele le phepelo ea sebaka se le seng sa mofuta (x10, x20, x30), bohareng - (7, 15, 20), ba baholo - (5, 10, 15 ) lihora tsa nako e monate ea bophelo ba hau.

Joalo ka motsamaisi ofe kapa ofe ea tloaelehileng, re batla ho eketsa phaello ea khoeli le khoeli. Mohato oa pele oa katleho ke ho ngola mosebetsi oa sepheo value joalo ka chelete e kenang lihlahisoa tse hlahisoang ka khoeli:

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

Sena ha se phoso; ha u batla boholo, mosebetsi oa sepheo o fokotsoa ka lets'oao le fapaneng.

Mohato o latelang ke ho thibela basebetsi ba rona ho sebetsa ho feta tekano le ho hlahisa lithibelo tsa lihora tsa mosebetsi:

SciPy, optimization le maemo

Ke eng e lekanang:

SciPy, optimization le maemo

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

Thibelo ea molao ke hore tlhahiso ea sehlahisoa e tlameha ho ba ntle feela:

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

'Me qetellong, maikutlo a monate ka ho fetisisa ke hore ka lebaka la theko e tlaase le boleng bo phahameng, mokoloko oa bareki ba khotsofetseng o lula o re emetse. Re ka khetha palo ea khoeli le khoeli ea tlhahiso ka borona, ho ipapisitse le ho rarolla bothata bo thata ba ho ntlafatsa ka 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]

Ha re potolohe ka mokhoa o hlephileng ho ea ho linomoro tse felletseng 'me re bale mojaro oa khoeli le khoeli oa bapalami ka kabo e nepahetseng ea lihlahisoa. x = (8, 6, 3) :

  • Phuptjane: 8 * 10 + 6 * 20 + 3 * 30 = 290 чел * час;
  • mahareng: 8 * 7 + 6 * 15 + 3 * 20 = 206 чел * час;
  • sebono: 8 * 5 + 6 * 10 + 3 * 15 = 145 чел * час.

Qetello: e le hore motsamaisi a fumane boholo ba hae bo mo loketseng, ho loketse ho theha maqephe a 8 a ho lulisa, libaka tse 6 tsa boholo bo mahareng le mabenkele a 3 ka khoeli. Tabeng ena, batho ba baholo ba tlameha ho lema ntle le ho sheba holimo ho tloha mochine, mojaro oa li-middles e tla ba hoo e ka bang 2/3, ba banyenyane ka tlase ho halofo.

fihlela qeto e

Sehlooho se hlalosa mekhoa ea motheo ea ho sebetsa le sephutheloana scipy.optimize, e sebelisetsoang ho rarolla mathata a ho fokotsa maemo. Ka bonna kea sebelisa scipy bakeng sa merero ea thuto feela, ke ka hona mohlala o fanoeng e le oa mofuta oa metlae.

Likhopolo tse ngata le mehlala ea sebele li ka fumanoa, ka mohlala, bukeng ea I.L. Akulich "Lenaneo la lipalo ka mehlala le mathata." Sesebelisoa se thata haholoanyane scipy.optimize ho aha sebopeho sa 3D ho tsoa sehlopheng sa litšoantšo (sengoloa se buang ka Habré) e ka shejoa ho scipy-cookbook.

Mohloli o ka sehloohong oa boitsebiso ke docs.scipy.orgba lakatsang ho kenya letsoho phetolelong ea karolo ena le tse ling scipy Rea u amohela ho GitHub.

Спасибо mephistophees bakeng sa ho kenya letsoho ho lokisetseng khatiso.

Source: www.habr.com

Eketsa ka tlhaloso