SciPy, optimalisering med betingelser

SciPy, optimalisering med betingelser

SciPy (произносится ΠΊΠ°ΠΊ сай ΠΏΠ°ΠΉ) β€” это основанный Π½Π° numpy матСматичСский ΠΏΠ°ΠΊΠ΅Ρ‚, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΉ Π² сСбя Ρ‚Π°ΠΊΠΆΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π° C ΠΈ Fortran. Π‘ SciPy ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ сСанс Python прСвращаСтся Π² Ρ‚Π°ΠΊΡƒΡŽ ΠΆΠ΅ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΡƒΡŽ срСду ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠ°ΠΊ MATLAB, IDL, Octave, R ΠΈΠ»ΠΈ SciLab.

I denne artikkelen skal vi se pΓ₯ de grunnleggende teknikkene for matematisk programmering - Γ₯ lΓΈse betingede optimaliseringsproblemer for en skalarfunksjon av flere variabler ved Γ₯ bruke scipy.optimize-pakken. Ubegrensede optimaliseringsalgoritmer har allerede blitt diskutert i siste artikkel. Mer detaljert og oppdatert hjelp om scipy-funksjoner kan alltid fΓ₯s ved Γ₯ bruke help()-kommandoen, Shift+Tab eller i offisiell dokumentasjon.

Innledning

Et felles grensesnitt for Γ₯ lΓΈse bΓ₯de betingede og ubegrensede optimaliseringsproblemer i scipy.optimize-pakken leveres av funksjonen minimize(). Imidlertid er det kjent at det ikke er noen universell metode for Γ₯ lΓΈse alle problemer, sΓ₯ valget av en adekvat metode, som alltid, faller pΓ₯ forskerens skuldre.
ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΡΡ‰ΠΈΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ задаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ minimize(..., method="").
For betinget optimalisering av en funksjon av flere variabler, er implementeringer av fΓΈlgende metoder tilgjengelige:

  • trust-constr β€” поиск локального ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ° Π² Π΄ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ области. Π‘Ρ‚Π°Ρ‚ΡŒΡ Π½Π° wiki, artikkel om HabrΓ©;
  • SLSQP β€” ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с ограничСниями, Π½ΡŒΡŽΡ‚ΠΎΠ½ΠΎΠ²ΡΠΊΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ систСмы Π›Π°Π³Ρ€Π°Π½ΠΆΠ°. Wiki-artikkel.
  • TNC β€” Truncated Newton Constrained, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ число ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ, Ρ…ΠΎΡ€ΠΎΡˆ для Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с большим числом нСзависимых ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π‘Ρ‚Π°Ρ‚ΡŒΡ Π½Π° wiki.
  • L-BFGS-B β€” en metode fra Broyden–Fletcher–Goldfarb–Shanno-teamet, implementert med redusert minneforbruk pΓ₯ grunn av delvis lasting av vektorer fra den hessiske matrisen. Π‘Ρ‚Π°Ρ‚ΡŒΡ Π½Π° wiki, artikkel om HabrΓ©.
  • COBYLA β€” ΠšΠžΠ‘Π«Π›Π Constrained Optimization By Linear Approximation, ограничСнная оптимизация с Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ аппроксимациСй (Π±Π΅Π· вычислСния Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π°). Π‘Ρ‚Π°Ρ‚ΡŒΡ Π½Π° wiki.

Avhengig av den valgte metoden, er betingelser og restriksjoner for Γ₯ lΓΈse problemet satt annerledes:

  • klasseobjekt Bounds для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² L-BFGS-B, TNC, SLSQP, trust-constr;
  • listen (min, max) for de samme metodene L-BFGS-B, TNC, SLSQP, trust-constr;
  • et objekt eller en liste over objekter LinearConstraint, NonlinearConstraint для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² COBYLA, SLSQP, trust-constr;
  • ordbok eller liste over ordbΓΈker {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} for COBYLA, SLSQP metoder.

Artikkeloversikt:
1) Π Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° условной ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Π΄ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ области (method=Β»trust-constrΒ») с ограничСниями, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Bounds, LinearConstraint, NonlinearConstraint ;
2) Π Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π½Π°ΠΈΠΌΠ΅Π½ΡŒΡˆΠΈΡ… ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² (method=Β»SLSQPΒ») с ограничСниями, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² Π²ΠΈΠ΄Π΅ словаря {'type', 'fun', 'jac', 'args'};
3) Analyser et eksempel pΓ₯ optimalisering av produserte produkter ved Γ₯ bruke eksemplet med et webstudio.

Betinget optimaliseringsmetode = "trust-constr"

Implementering av metoden trust-constr basert pΓ₯ EQSQP для Π·Π°Π΄Π°Ρ‡ с ограничСниями Π²ΠΈΠ΄Π° равСнства ΠΈ Π½Π° TUR for problemer med begrensninger i form av ulikheter. Begge metodene er implementert av algoritmer for Γ₯ finne et lokalt minimum i konfidensregionen og er godt egnet for store problemer.

ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΠ°Ρ постановка Π·Π°Π΄Π°Ρ‡ΠΈ поиска ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ° Π² ΠΎΠ±Ρ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅:

SciPy, optimalisering med betingelser

SciPy, optimalisering med betingelser

SciPy, optimalisering med betingelser

Для ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ строгого равСнства ниТняя Π³Ρ€Π°Π½ΠΈΡ†Π° устанавливаСтся Ρ€Π°Π²Π½ΠΎΠΉ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ SciPy, optimalisering med betingelser.
Для одностороннСго ограничСния вСрхняя ΠΈΠ»ΠΈ ниТняя Π³Ρ€Π°Π½ΠΈΡ†Π° устанавливаСтся np.inf с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π·Π½Π°ΠΊΠΎΠΌ.
La det vΓ¦re nΓΈdvendig Γ₯ finne minimum av en kjent Rosenbrock-funksjon av to variabler:

SciPy, optimalisering med betingelser

I dette tilfellet er fΓΈlgende begrensninger satt pΓ₯ definisjonsdomenet:

SciPy, optimalisering med betingelser

SciPy, optimalisering med betingelser

SciPy, optimalisering med betingelser

SciPy, optimalisering med betingelser

SciPy, optimalisering med betingelser

SciPy, optimalisering med betingelser

Π’ нашСм случаС имССтся СдинствСнноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ SciPy, optimalisering med betingelser, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ справСдливы Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠ΅ ограничСния.
ΠŸΡ€ΠΎΠΉΠ΄Π΅ΠΌΡΡ ΠΏΠΎ ограничСниям снизу Π²Π²Π΅Ρ€Ρ… ΠΈ рассмотрим, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡ… Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² scipy.
Restriksjoner SciPy, optimalisering med betingelser ΠΈ SciPy, optimalisering med betingelser ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Bounds.

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

Restriksjoner SciPy, optimalisering med betingelser ΠΈ SciPy, optimalisering med betingelser запишСм Π² Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅:

SciPy, optimalisering med betingelser

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ эти ограничСния Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° LinearConstraint:

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

Og til slutt den ikke-lineære begrensningen i matriseform:

SciPy, optimalisering med betingelser

Vi definerer den jakobiske matrisen for denne begrensningen og en lineΓ¦r kombinasjon av den hessiske matrisen med en vilkΓ₯rlig vektor SciPy, optimalisering med betingelser:

SciPy, optimalisering med betingelser

SciPy, optimalisering med betingelser

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ 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)

Ved beregning av den hessiske matrisen SciPy, optimalisering med betingelser Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π·Π°Ρ‚Ρ€Π°Ρ‚, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ класс HessianUpdateStrategy. FΓΈlgende strategier er tilgjengelige: 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')

ΠœΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Π―ΠΊΠΎΠ±ΠΈ для ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… разностСй. Однако, Π² этом случаС ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ ГСссС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… разностСй ΡƒΠΆΠ΅ Π½Π΅ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ. ГСссиан Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² Π²ΠΈΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ класса HessianUpdateStrategy.

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

LΓΈsningen pΓ₯ optimaliseringsproblemet ser slik ut:

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)

eller produktet av hessian og en vilkΓ₯rlig vektor gjennom parameteren 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 (kvasi-newtonsk tilnΓ¦rming). Gradienten kan tilnΓ¦rmes ved endelige forskjeller.

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)

Условная оптимизация method=Β»SLSQPΒ»

SLSQP-metoden er designet for Γ₯ lΓΈse problemer med Γ₯ minimere en funksjon i formen:

SciPy, optimalisering med betingelser

SciPy, optimalisering med betingelser

SciPy, optimalisering med betingelser

SciPy, optimalisering med betingelser

hvor SciPy, optimalisering med betingelser ΠΈ SciPy, optimalisering med betingelser β€” sett med indekser av uttrykk som beskriver restriksjoner i form av likheter eller ulikheter. SciPy, optimalisering med betingelser β€” мноТСства Π½ΠΈΠΆΠ½ΠΈΡ… ΠΈ Π²Π΅Ρ€Ρ…Π½ΠΈΡ… Π³Ρ€Π°Π½ΠΈΡ† для области опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Lineære og ikke-lineære begrensninger er beskrevet i form av ordbøker med nøkler 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 ]

Optimaliseringseksempel

Π’ связи с ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ ΠΊ пятому тСхнологичСскому ΡƒΠΊΠ»Π°Π΄Ρƒ, рассмотрим ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ производства Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Π΅Π±-студии, которая приносит Π½Π°ΠΌ нСбольшой, Π½ΠΎ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π΄ΠΎΡ…ΠΎΠ΄. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ сСбя Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ Π³Π°Π»Π΅Ρ€Ρ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ производится Ρ‚Ρ€ΠΈ Π²ΠΈΠ΄Π° ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ:

  • x0 - selge landingssider, fra 10 tr.
  • x1 - bedriftsnettsteder, fra 20 tr.
  • x2 β€” ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΌΠ°Π³Π°Π·ΠΈΠ½Ρ‹, ΠΎΡ‚ 30 Ρ‚.Ρ€.

Наш Π΄Ρ€ΡƒΠΆΠ½Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΈΠ² Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Π΄ΠΆΡƒΠ½ΠΎΠ², Π΄Π²ΡƒΡ… ΠΌΠΈΠ΄Π»ΠΎΠ² ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ΅Π½ΡŒΠΎΡ€Π°. Π€ΠΎΠ½Π΄ ΠΈΡ… Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° мСсяц:

  • juni: 4 * 150 = 600 Ρ‡Π΅Π» * час,
  • ΠΌΠΈΠ΄Π»Ρ‹: 2 * 150 = 300 Ρ‡Π΅Π» * час,
  • ΡΠ΅Π½ΡŒΠΎΡ€: 150 Ρ‡Π΅Π» * час.

La den fΓΈrste tilgjengelige junior bruke (0, 1, 2) timer pΓ₯ utvikling og distribusjon av ett nettsted av typen (x10, x20, x30), mellom - (7, 15, 20), senior - (5, 10, 15) ) timer av den beste tiden i livet ditt.

Som enhver vanlig direktΓΈr ΓΈnsker vi Γ₯ maksimere mΓ₯nedlig fortjeneste. Det fΓΈrste trinnet til suksess er Γ₯ skrive ned den objektive funksjonen value ΠΊΠ°ΠΊ сумму Π΄ΠΎΡ…ΠΎΠ΄ΠΎΠ² ΠΎΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π·Π° мСсяц ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ:

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

Π­Ρ‚ΠΎ Π½Π΅ ошибка, ΠΏΡ€ΠΈ поискС максимума цСлСвая функция минимизируСтся с ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌ Π·Π½Π°ΠΊΠΎΠΌ.

Det neste trinnet er Γ₯ forby vΓ₯re ansatte Γ₯ overarbeide og innfΓΈre restriksjoner pΓ₯ arbeidstid:

SciPy, optimalisering med betingelser

Π§Ρ‚ΠΎ эквивалСнтно:

SciPy, optimalisering med betingelser

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

Og til slutt, den mest rosenrΓΈde antagelsen er at pΓ₯ grunn av den lave prisen og den hΓΈye kvaliteten, stΓ₯r en kΓΈ av fornΓΈyde kunder stadig i kΓΈ for oss. Vi kan velge de mΓ₯nedlige produksjonsvolumene selv, basert pΓ₯ Γ₯ lΓΈse det begrensede optimaliseringsproblemet med 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) :

  • juni: 8 * 10 + 6 * 20 + 3 * 30 = 290 Ρ‡Π΅Π» * час;
  • ΠΌΠΈΠ΄Π»Ρ‹: 8 * 7 + 6 * 15 + 3 * 20 = 206 Ρ‡Π΅Π» * час;
  • ΡΠ΅Π½ΡŒΠΎΡ€: 8 * 5 + 6 * 10 + 3 * 15 = 145 Ρ‡Π΅Π» * час.

Konklusjon: for at regissΓΈren skal fΓ₯ sitt velfortjente maksimum, er det optimalt Γ₯ lage 8 landingssider, 6 mellomstore nettsteder og 3 butikker per mΓ₯ned. I dette tilfellet mΓ₯ senioren plΓΈye uten Γ₯ se opp fra maskinen, belastningen pΓ₯ de midterste vil vΓ¦re ca 2/3, juniorene mindre enn halvparten.

Konklusjon

Artikkelen skisserer de grunnleggende teknikkene for Γ₯ jobbe med pakken scipy.optimize, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ условной ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. Π›ΠΈΡ‡Π½ΠΎ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ scipy rent for akademiske formΓ₯l, og det er derfor eksemplet som er gitt er av en sΓ₯ komisk karakter.

Mange teorier og virtuelle eksempler finnes for eksempel i boken til I.L. Akulich "Matematisk programmering i eksempler og problemer." Mer hardcore-applikasjon scipy.optimize Γ₯ bygge en 3D-struktur fra et sett med bilder (artikkel om HabrΓ©) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² scipy-cookbook.

Hovedkilden til informasjon er docs.scipy.orgde som ΓΈnsker Γ₯ bidra til oversettelsen av denne og andre seksjoner scipy Velkommen til GitHub.

Takk mephistophees Π·Π° участиС Π² ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

Kilde: www.habr.com

Legg til en kommentar