SciPy (ΠΏΡΠΎΠΈΠ·Π½ΠΎΡΠΈΡΡΡ ΠΊΠ°ΠΊ ΡΠ°ΠΉ ΠΏΠ°ΠΉ) β ΡΡΠΎ ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΠΉ Π½Π° numpy ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ, Π²ΠΊΠ»ΡΡΠ°ΡΡΠΈΠΉ Π² ΡΠ΅Π±Ρ ΡΠ°ΠΊΠΆΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π½Π° C ΠΈ Fortran. Π‘ SciPy ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΠΉ ΡΠ΅Π°Π½Ρ Python ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² ΡΠ°ΠΊΡΡ ΠΆΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΡ ΡΡΠ΅Π΄Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ , ΠΊΠ°ΠΊ MATLAB, IDL, Octave, R ΠΈΠ»ΠΈ SciLab.
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΡΠΈΠ΅ΠΌΡ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ β ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π΄Π»Ρ ΡΠΊΠ°Π»ΡΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠ°ΠΊΠ΅ΡΠ° scipy.optimize. ΠΠ»Π³ΠΎΡΠΈΡΠΌΡ Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΡΠΆΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Ρ Π²
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΠ±ΡΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ ΠΊΠ°ΠΊ ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ, ΡΠ°ΠΊ ΠΈ Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π² ΠΏΠ°ΠΊΠ΅ΡΠ΅ scipy.optimize ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ minimize()
. ΠΠ΄Π½Π°ΠΊΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΡΠΎ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π° Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ
Π·Π°Π΄Π°Ρ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΡΠ±ΠΎΡ Π°Π΄Π΅ΠΊΠ²Π°ΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΊΠ°ΠΊ Π²ΡΠ΅Π³Π΄Π° Π»ΠΎΠΆΠΈΡΡΡ Π½Π° ΠΏΠ»Π΅ΡΠΈ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Ρ.
ΠΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠΈΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π·Π°Π΄Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ minimize(..., method="")
.
ΠΠ»Ρ ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Π΄ΠΎΡΡΡΠΏΠ½Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ²:
trust-constr
β ΠΏΠΎΠΈΡΠΊ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡΠΌΠ° Π² Π΄ΠΎΠ²Π΅ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ.Π‘ΡΠ°ΡΡΡ Π½Π° wiki ,ΡΡΠ°ΡΡΡ Π½Π° Ρ Π°Π±ΡΠ΅ ;SLSQP
β ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΊΠ²Π°Π΄ΡΠ°ΡΠΈΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ, Π½ΡΡΡΠΎΠ½ΠΎΠ²ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΠ°Π³ΡΠ°Π½ΠΆΠ°.Π‘ΡΠ°ΡΡΡ Π½Π° Π²ΠΈΠΊΠΈ .TNC
β Truncated Newton Constrained, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ, Ρ ΠΎΡΠΎΡ Π΄Π»Ρ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ ΡΠΈΡΠ»ΠΎΠΌ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ .Π‘ΡΠ°ΡΡΡ Π½Π° wiki .L-BFGS-B
β ΠΌΠ΅ΡΠΎΠ΄ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠΊΠΈ BroydenβFletcherβGoldfarbβShanno, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ Ρ ΡΠΌΠ΅Π½ΡΡΠ΅Π½Π½ΡΠΌ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΌΡΡΠΈ Π·Π° ΡΡΠ΅Ρ ΡΠ°ΡΡΠΈΡΠ½ΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π²Π΅ΠΊΡΠΎΡΠΎΠ² ΠΈΠ· ΠΌΠ°ΡΡΠΈΡΡ ΠΠ΅ΡΡΠ΅.Π‘ΡΠ°ΡΡΡ Π½Π° wiki ,ΡΡΠ°ΡΡΡ Π½Π° Ρ Π°Π±ΡΠ΅ .COBYLA
β ΠΠΠΠ«ΠΠ Constrained Optimization By Linear Approximation, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½Π°Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Ρ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°ΠΏΠΏΡΠΎΠΊΡΠΈΠΌΠ°ΡΠΈΠ΅ΠΉ (Π±Π΅Π· Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ°).Π‘ΡΠ°ΡΡΡ Π½Π° wiki .
Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°, ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ Π·Π°Π΄Π°ΡΡΡΡ ΡΡΠ»ΠΎΠ²ΠΈΡ ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠΈ:
- ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ°
Bounds
Π΄Π»Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² L-BFGS-B, TNC, SLSQP, trust-constr; - ΡΠΏΠΈΡΠΊΠΎΠΌ
(min, max)
Π΄Π»Ρ ΡΡΠΈΡ ΠΆΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² L-BFGS-B, TNC, SLSQP, trust-constr; - ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΠΈΠ»ΠΈ ΡΠΏΠΈΡΠΊΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²
LinearConstraint
,NonlinearConstraint
Π΄Π»Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² COBYLA, SLSQP, trust-constr; - ΡΠ»ΠΎΠ²Π°ΡΠ΅ΠΌ ΠΈΠ»ΠΈ ΡΠΏΠΈΡΠΊΠΎΠΌ ΡΠ»ΠΎΠ²Π°ΡΠ΅ΠΉ
{'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt}
Π΄Π»Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² COBYLA, SLSQP.
ΠΠ»Π°Π½ ΡΡΠ°ΡΡΠΈ:
1) Π Π°ΡΡΠΌΠΎΡΡΠ΅ΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π² Π΄ΠΎΠ²Π΅ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ (method=»trust-constr») Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ, Π·Π°Π΄Π°Π½Π½ΡΠΌΠΈ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Bounds
, LinearConstraint
, NonlinearConstraint
;
2) Π Π°ΡΡΠΌΠΎΡΡΠ΅ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠΈΡ
ΠΊΠ²Π°Π΄ΡΠ°ΡΠΎΠ² (method=»SLSQP») Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ, Π·Π°Π΄Π°Π½Π½ΡΠΌΠΈ Π² Π²ΠΈΠ΄Π΅ ΡΠ»ΠΎΠ²Π°ΡΡ {'type', 'fun', 'jac', 'args'}
;
3) Π Π°Π·ΠΎΠ±ΡΠ°ΡΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π²ΡΠΏΡΡΠΊΠ°Π΅ΠΌΠΎΠΉ ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠΈ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π²Π΅Π±-ΡΡΡΠ΄ΠΈΠΈ.
Π£ΡΠ»ΠΎΠ²Π½Π°Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ method=»trust-constr»
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π° trust-constr
ΠΎΡΠ½ΠΎΠ²Π°Π½Π° Π½Π°
ΠΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°ΡΠΈ ΠΏΠΎΠΈΡΠΊΠ° ΠΌΠΈΠ½ΠΈΠΌΡΠΌΠ° Π² ΠΎΠ±ΡΠ΅ΠΌ Π²ΠΈΠ΄Π΅:
ΠΠ»Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ ΡΡΡΠΎΠ³ΠΎΠ³ΠΎ ΡΠ°Π²Π΅Π½ΡΡΠ²Π° Π½ΠΈΠΆΠ½ΡΡ Π³ΡΠ°Π½ΠΈΡΠ° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΠ°Π²Π½ΠΎΠΉ Π²Π΅ΡΡ
Π½Π΅ΠΉ .
ΠΠ»Ρ ΠΎΠ΄Π½ΠΎΡΡΠΎΡΠΎΠ½Π½Π΅Π³ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π²Π΅ΡΡ
Π½ΡΡ ΠΈΠ»ΠΈ Π½ΠΈΠΆΠ½ΡΡ Π³ΡΠ°Π½ΠΈΡΠ° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ np.inf
Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ Π·Π½Π°ΠΊΠΎΠΌ.
ΠΡΡΡΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΉΡΠΈ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΡ Π ΠΎΠ·Π΅Π½Π±ΡΠΎΠΊΠ° ΠΎΡ Π΄Π²ΡΡ
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
:
ΠΡΠΈ ΡΡΠΎΠΌ Π·Π°Π΄Π°Π½Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° Π΅Π΅ ΠΎΠ±Π»Π°ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ:
Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΠΌΠ΅Π΅ΡΡΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π² ΡΠΎΡΠΊΠ΅ , Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠΏΡΠ°Π²Π΅Π΄Π»ΠΈΠ²Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΡΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ.
ΠΡΠΎΠΉΠ΄Π΅ΠΌΡΡ ΠΏΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΠΌ ΡΠ½ΠΈΠ·Ρ Π²Π²Π΅ΡΡ
ΠΈ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡ
Π·Π°ΠΏΠΈΡΠ°ΡΡ Π² scipy.
ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Bounds.
from scipy.optimize import Bounds
bounds = Bounds ([0, -0.5], [1.0, 2.0])
ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠ΅ΠΌ Π² Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ ΡΠΎΡΠΌΠ΅:
ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° LinearConstraint:
import numpy as np
from scipy.optimize import LinearConstraint
linear_constraint = LinearConstraint ([[1, 2], [2, 1]], [-np.inf, 1], [1, 1])
Π Π½Π°ΠΊΠΎΠ½Π΅Ρ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π² ΠΌΠ°ΡΡΠΈΡΠ½ΠΎΠΉ ΡΠΎΡΠΌΠ΅:
ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΠΌΠ°ΡΡΠΈΡΡ Π―ΠΊΠΎΠ±ΠΈ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΌΠ°ΡΡΠΈΡΡ ΠΠ΅ΡΡΠ΅ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ Π²Π΅ΠΊΡΠΎΡΠΎΠΌ :
Π’Π΅ΠΏΠ΅ΡΡ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡ 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)
ΠΠΎΠ³Π΄Π° Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΈΡΡ ΠΠ΅ΡΡΠ΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π±ΠΎΠ»ΡΡΠΈΡ
Π·Π°ΡΡΠ°Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»Π°ΡΡ HessianUpdateStrategy
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 ())
Π Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
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)
ΠΈΠ»ΠΈ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΠ΅ΡΡΠΈΠ°Π½Π° ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ Π²Π΅ΠΊΡΠΎΡΠ° ΡΠ΅ΡΠ΅Π· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ 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
(ΠΊΠ²Π°Π·ΠΈ-ΠΡΡΡΠΎΠ½ΠΎΠ²ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΡ). ΠΡΠ°Π΄ΠΈΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π°ΠΏΠΏΡΠΎΠΊΡΠΈΠΌΠΈΡΠΎΠ²Π°Π½ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΌΠΈ ΡΠ°Π·Π½ΠΎΡΡΡΠΌΠΈ.
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 ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π² Π²ΠΈΠ΄Π΅:
ΠΠ΄Π΅ ΠΈ β ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠΈΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π² Π²ΠΈΠ΄Π΅ ΡΠ°Π²Π΅Π½ΡΡΠ² ΠΈΠ»ΠΈ Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ². β ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° Π½ΠΈΠΆΠ½ΠΈΡ ΠΈ Π²Π΅ΡΡ Π½ΠΈΡ Π³ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ.
ΠΠΈΠ½Π΅ΠΉΠ½ΡΠ΅ ΠΈ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π² Π²ΠΈΠ΄Π΅ ΡΠ»ΠΎΠ²Π°ΡΠ΅ΠΉ Ρ ΠΊΠ»ΡΡΠ°ΠΌΠΈ 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 ]
ΠΡΠΈΠΌΠ΅Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ
Π ΡΠ²ΡΠ·ΠΈ Ρ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΎΠΌ ΠΊ ΠΏΡΡΠΎΠΌΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠΌΡ ΡΠΊΠ»Π°Π΄Ρ, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π° Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π²Π΅Π±-ΡΡΡΠ΄ΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΎΡΠΈΡ Π½Π°ΠΌ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ, Π½ΠΎ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΡΠΉ Π΄ΠΎΡ ΠΎΠ΄. ΠΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ ΡΠ΅Π±Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΎΠΌ Π³Π°Π»Π΅ΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΡΡΠΈ Π²ΠΈΠ΄Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠΈ:
- x0 β ΠΏΡΠΎΠ΄Π°ΡΡΠΈΠ΅ Π»ΡΠ½Π΄ΠΈΠ½Π³ΠΈ, ΠΎΡ 10 Ρ.Ρ.
- x1 β ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΡΠ΅ ΡΠ°ΠΉΡΡ, ΠΎΡ 20 Ρ.Ρ.
- x2 β ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ ΠΌΠ°Π³Π°Π·ΠΈΠ½Ρ, ΠΎΡ 30 Ρ.Ρ.
ΠΠ°Ρ Π΄ΡΡΠΆΠ½ΡΠΉ ΡΠ°Π±ΠΎΡΠΈΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠ² Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΡΠ΅ΡΡΡΠ΅Ρ Π΄ΠΆΡΠ½ΠΎΠ², Π΄Π²ΡΡ ΠΌΠΈΠ΄Π»ΠΎΠ² ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ΅Π½ΡΠΎΡΠ°. Π€ΠΎΠ½Π΄ ΠΈΡ ΡΠ°Π±ΠΎΡΠ΅Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΌΠ΅ΡΡΡ:
- Π΄ΠΆΡΠ½Ρ:
4 * 150 = 600 ΡΠ΅Π» * ΡΠ°Ρ
, - ΠΌΠΈΠ΄Π»Ρ:
2 * 150 = 300 ΡΠ΅Π» * ΡΠ°Ρ
, - ΡΠ΅Π½ΡΠΎΡ:
150 ΡΠ΅Π» * ΡΠ°Ρ
.
ΠΡΡΡΡ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΡΠ° ΡΠΈΠΏΠ° (x0, x1, x2) ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠΎΠΏΠ°Π²ΡΠΈΠΉΡΡ Π΄ΠΆΡΠ½ΠΈΠΎΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡΡΠ°ΡΠΈΡΡ (10, 20, 30) ΡΠ°ΡΠΎΠ², ΠΌΠΈΠ΄Π» β (7, 15, 20), ΡΠ΅Π½ΡΠΎΡ β (5, 10, 15) ΡΠ°ΡΠΎΠ² Π»ΡΡΡΠ΅Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ²ΠΎΠ΅ΠΉ ΠΆΠΈΠ·Π½ΠΈ.
ΠΠ°ΠΊ Π»ΡΠ±ΠΎΠΌΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΌΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΡ, Π½Π°ΠΌ Ρ
ΠΎΡΠ΅ΡΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π΅ΠΆΠ΅ΠΌΠ΅ΡΡΡΠ½ΡΡ ΠΏΡΠΈΠ±ΡΠ»Ρ. ΠΠ΅ΡΠ²ΡΠΉ ΡΠ°Π³ ΠΊ ΡΡΠΏΠ΅Ρ
Ρ β Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΡΠ΅Π»Π΅Π²ΡΡ ΡΡΠ½ΠΊΡΠΈΡ value
ΠΊΠ°ΠΊ ΡΡΠΌΠΌΡ Π΄ΠΎΡ
ΠΎΠ΄ΠΎΠ² ΠΎΡ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π·Π° ΠΌΠ΅ΡΡΡ ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠΈ:
def value(x):
return - 10*x[0] - 20*x[1] - 30*x[2]
ΠΡΠΎ Π½Π΅ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΏΡΠΈ ΠΏΠΎΠΈΡΠΊΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌΠ° ΡΠ΅Π»Π΅Π²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ Ρ ΠΎΠ±ΡΠ°ΡΠ½ΡΠΌ Π·Π½Π°ΠΊΠΎΠΌ.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π³ β Π·Π°ΠΏΡΠ΅ΡΠ°Π΅ΠΌ ΠΏΠ΅ΡΠ΅ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠ²ΠΎΠΈΠΌ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠ°ΠΌ ΠΈ Π²Π²ΠΎΠ΄ΠΈΠΌ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΡΠΎΠ½Π΄ ΡΠ°Π±ΠΎΡΠ΅Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ:
Π§ΡΠΎ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎ:
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])
Π Π½Π°ΠΊΠΎΠ½Π΅Ρ ΡΠ°ΠΌΠΎΠ΅ ΡΠ°Π΄ΡΠΆΠ½ΠΎΠ΅ Π΄ΠΎΠΏΡΡΠ΅Π½ΠΈΠ΅ β ΠΈΠ·-Π·Π° Π½ΠΈΠ·ΠΊΠΎΠΉ ΡΠ΅Π½Ρ ΠΈ Π²ΡΡΠΎΠΊΠΎΠ³ΠΎ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΊ Π½Π°ΠΌ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π²ΡΡΡΡΠ°ΠΈΠ²Π°Π΅ΡΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΈΠ· Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΡΡ
ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ². ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ°ΠΌΠΈ Π²ΡΠ±ΠΈΡΠ°ΡΡ Π΅ΠΆΠ΅ΠΌΠ΅ΡΡΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΌΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠΈ, ΠΈΡΡ
ΠΎΠ΄Ρ ΠΈΠ· ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠΈ ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Ρ 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)
:
- Π΄ΠΆΡΠ½Ρ:
8 * 10 + 6 * 20 + 3 * 30 = 290 ΡΠ΅Π» * ΡΠ°Ρ
; - ΠΌΠΈΠ΄Π»Ρ:
8 * 7 + 6 * 15 + 3 * 20 = 206 ΡΠ΅Π» * ΡΠ°Ρ
; - ΡΠ΅Π½ΡΠΎΡ:
8 * 5 + 6 * 10 + 3 * 15 = 145 ΡΠ΅Π» * ΡΠ°Ρ
.
ΠΡΠ²ΠΎΠ΄: ΡΡΠΎΠ±Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡ ΠΏΠΎΠ»ΡΡΠ°Π» ΡΠ²ΠΎΠΉ Π·Π°ΡΠ»ΡΠΆΠ΅Π½Π½ΡΠΉ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ, ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ Π² ΠΌΠ΅ΡΡΡ ΠΏΠΎ 8 Π»ΡΠ½Π΄ΠΈΠ½Π³ΠΎΠ², 6 ΡΡΠ΅Π΄Π½ΠΈΡ ΡΠ°ΠΉΡΠΎΠ² ΠΈ 3 ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°. Π‘Π΅Π½ΡΠΎΡ ΠΏΡΠΈ ΡΡΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ°Ρ Π°ΡΡ Π½Π΅ ΠΎΡΡΡΠ²Π°ΡΡΡ ΠΎΡ ΡΡΠ°Π½ΠΊΠ°, Π·Π°Π³ΡΡΠ·ΠΊΠ° ΠΌΠΈΠ΄Π»ΠΎΠ² ΡΠΎΡΡΠ°Π²ΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ 2/3, Π΄ΠΆΡΠ½ΠΎΠ² ΠΌΠ΅Π½ΡΡΠ΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΡΡΠ°ΡΡΠ΅ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΡΠΈΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ scipy.optimize
, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ. ΠΠΈΡΠ½ΠΎ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ scipy
ΡΠΈΡΡΠΎ Π² Π°ΠΊΠ°Π΄Π΅ΠΌΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠ΅Π»ΡΡ
, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π½ΠΎΡΠΈΡ ΡΠ°ΠΊΠΎΠΉ ΡΡΡΠΎΡΠ½ΡΠΉ Ρ
Π°ΡΠ°ΠΊΡΠ΅Ρ.
ΠΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΎΡΠΈΠΈ ΠΈ Π²ΠΈΠ½ΡΠ°ΡΠ½ΡΡ
ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΊΠ½ΠΈΠ³Π΅ Π.Π.ΠΠΊΡΠ»ΠΈΡΠ° «ΠΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ
ΠΈ Π·Π°Π΄Π°ΡΠ°Ρ
». ΠΠΎΠ»Π΅Π΅ Ρ
Π°ΡΠ΄ΠΊΠΎΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ scipy.optimize
Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ 3D ΡΡΡΡΠΊΡΡΡΡ ΠΏΠΎ Π½Π°Π±ΠΎΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ (
ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ β scipy
Π΄ΠΎΠ±ΡΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°ΡΡ Π½Π°
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com