Το SciPy (προφέρεται πίτα sai) είναι ένα πακέτο μαθηματικών βασισμένο σε numpy που περιλαμβάνει επίσης βιβλιοθήκες C και Fortran. Το SciPy μετατρέπει τη διαδραστική συνεδρία Python σε ένα πλήρες περιβάλλον επιστήμης δεδομένων όπως το MATLAB, το IDL, το Octave, το R ή το SciLab.
Σε αυτό το άρθρο, θα δούμε τις βασικές τεχνικές μαθηματικού προγραμματισμού - επίλυση προβλημάτων βελτιστοποίησης υπό όρους για μια βαθμωτή συνάρτηση πολλών μεταβλητών χρησιμοποιώντας το πακέτο scipy.optimize. Οι αλγόριθμοι βελτιστοποίησης χωρίς περιορισμούς έχουν ήδη συζητηθεί στο τελευταίο άρθρο. Μπορείτε πάντα να λάβετε πιο λεπτομερή και ενημερωμένη βοήθεια για τις λειτουργίες scipy χρησιμοποιώντας την εντολή help(), Shift+Tab ή στο επίσημη τεκμηρίωση.
Εισαγωγή
Μια κοινή διεπαφή για την επίλυση προβλημάτων βελτιστοποίησης υπό όρους και χωρίς περιορισμούς στο πακέτο scipy.optimize παρέχεται από τη συνάρτηση minimize(). Ωστόσο, είναι γνωστό ότι δεν υπάρχει καθολική μέθοδος για την επίλυση όλων των προβλημάτων, επομένως η επιλογή μιας κατάλληλης μεθόδου, όπως πάντα, πέφτει στους ώμους του ερευνητή.
Ο κατάλληλος αλγόριθμος βελτιστοποίησης καθορίζεται χρησιμοποιώντας το όρισμα συνάρτησης minimize(..., method="").
Για τη βελτιστοποίηση υπό όρους μιας συνάρτησης πολλών μεταβλητών, είναι διαθέσιμες υλοποιήσεις των ακόλουθων μεθόδων:
SLSQP — διαδοχικός τετραγωνικός προγραμματισμός με περιορισμούς, Νευτώνεια μέθοδος για την επίλυση του συστήματος Lagrange. άρθρο του Wiki.
TNC - Περικομμένος Newton Περιορισμένος, περιορισμένος αριθμός επαναλήψεων, κατάλληλος για μη γραμμικές συναρτήσεις με μεγάλο αριθμό ανεξάρτητων μεταβλητών. άρθρο του Wiki.
L-BFGS-B — μια μέθοδος από την ομάδα Broyden–Fletcher–Goldfarb–Shanno, που υλοποιήθηκε με μειωμένη κατανάλωση μνήμης λόγω μερικής φόρτωσης διανυσμάτων από τον πίνακα Hessian. άρθρο του Wiki, άρθρο για το Habré.
COBYLA — Περιορισμένη βελτιστοποίηση MARE με γραμμική προσέγγιση, περιορισμένη βελτιστοποίηση με γραμμική προσέγγιση (χωρίς υπολογισμό κλίσης). άρθρο του 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) Εξετάστε τη χρήση ενός αλγορίθμου βελτιστοποίησης υπό όρους στην περιοχή αξιοπιστίας (μέθοδος=”trust-constr”) με περιορισμούς που καθορίζονται ως αντικείμενα Bounds, LinearConstraint, NonlinearConstraint ;
2) Εξετάστε τον διαδοχικό προγραμματισμό χρησιμοποιώντας τη μέθοδο των ελαχίστων τετραγώνων (μέθοδος = "SLSQP") με περιορισμούς που καθορίζονται με τη μορφή λεξικού {'type', 'fun', 'jac', 'args'};
3) Αναλύστε ένα παράδειγμα βελτιστοποίησης κατασκευασμένων προϊόντων χρησιμοποιώντας το παράδειγμα ενός web studio.
Μέθοδος βελτιστοποίησης υπό όρους = "trust-constr"
Εφαρμογή της μεθόδου trust-constr βασισμένο στο EQSQP για προβλήματα με περιορισμούς της μορφής της ισότητας και επί TRIP για προβλήματα με περιορισμούς με τη μορφή ανισοτήτων. Και οι δύο μέθοδοι υλοποιούνται από αλγόριθμους για την εύρεση ενός τοπικού ελάχιστου στην περιοχή εμπιστοσύνης και είναι κατάλληλες για προβλήματα μεγάλης κλίμακας.
Μαθηματική διατύπωση του προβλήματος της εύρεσης ενός ελάχιστου σε γενική μορφή:
Για αυστηρούς περιορισμούς ισότητας, το κάτω όριο ορίζεται ίσο με το άνω όριο .
Για περιορισμό μονής κατεύθυνσης, ορίζεται το ανώτερο ή το κατώτερο όριο np.inf με το αντίστοιχο πρόσημο.
Ας είναι απαραίτητο να βρούμε το ελάχιστο μιας γνωστής συνάρτησης Rosenbrock δύο μεταβλητών:
Σε αυτήν την περίπτωση, τίθενται οι ακόλουθοι περιορισμοί στον τομέα ορισμού του:
Στην περίπτωσή μας, υπάρχει μια μοναδική λύση στο σημείο , για τα οποία ισχύουν μόνο ο πρώτος και ο τέταρτος περιορισμός.
Ας δούμε τους περιορισμούς από κάτω προς τα πάνω και ας δούμε πώς μπορούμε να τους γράψουμε αναλυτικά.
Περιορισμοί и ας το ορίσουμε χρησιμοποιώντας το αντικείμενο Bounds.
Κατά τον υπολογισμό του Hessian matrix απαιτεί πολλή προσπάθεια, μπορείτε να χρησιμοποιήσετε μια τάξη HessianUpdateStrategy. Οι ακόλουθες στρατηγικές είναι διαθέσιμες: BFGS и SR1.
Ο Jacobian πίνακας για περιορισμούς μπορεί επίσης να υπολογιστεί χρησιμοποιώντας πεπερασμένες διαφορές. Ωστόσο, σε αυτή την περίπτωση ο πίνακας της Έσσης δεν μπορεί να υπολογιστεί χρησιμοποιώντας πεπερασμένες διαφορές. Το Hessian πρέπει να οριστεί ως συνάρτηση ή χρησιμοποιώντας την κλάση HessianUpdateStrategy.
Εναλλακτικά, η πρώτη και η δεύτερη παράγωγος της βελτιστοποιούμενης συνάρτησης μπορούν να προσεγγιστούν. Για παράδειγμα, το Hessian μπορεί να προσεγγιστεί χρησιμοποιώντας τη συνάρτηση 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)
Μέθοδος βελτιστοποίησης υπό όρους = "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])
}
Η αναζήτηση για το ελάχιστο πραγματοποιείται ως εξής:
Optimization terminated successfully. (Exit mode 0)
Current function value: 0.34271757499419825
Iterations: 4
Function evaluations: 5
Gradient evaluations: 4
[0.41494475 0.1701105 ]
Παράδειγμα βελτιστοποίησης
Σε σχέση με τη μετάβαση στην πέμπτη τεχνολογική δομή, ας δούμε τη βελτιστοποίηση παραγωγής χρησιμοποιώντας το παράδειγμα ενός web studio, που μας φέρνει ένα μικρό αλλά σταθερό εισόδημα. Ας φανταστούμε τον εαυτό μας ως διευθυντή μιας γαλέρας που παράγει τρία είδη προϊόντων:
x0 - πώληση σελίδων προορισμού, από 10 tr.
x1 - εταιρικοί ιστότοποι, από 20 τρ.
x2 - ηλεκτρονικά καταστήματα, από 30 τρ.
Η φιλική ομάδα εργασίας μας περιλαμβάνει τέσσερις junior, δύο μεσαίους και έναν ανώτερο. Το μηνιαίο ταμείο χρόνου εργασίας τους:
Ιούνιος: 4 * 150 = 600 чел * час,
μεσαίες: 2 * 150 = 300 чел * час,
κύριος: 150 чел * час.
Αφήστε τον πρώτο διαθέσιμο junior να αφιερώσει (0, 1, 2) ώρες για την ανάπτυξη και την ανάπτυξη ενός ιστότοπου τύπου (x10, x20, x30), μεσαίου - (7, 15, 20), ανώτερου - (5, 10, 15 ) ώρες από την καλύτερη στιγμή της ζωής σας.
Όπως κάθε κανονικός διευθυντής, θέλουμε να μεγιστοποιήσουμε τα μηνιαία κέρδη. Το πρώτο βήμα προς την επιτυχία είναι να γράψετε την αντικειμενική συνάρτηση value ως το ποσό του εισοδήματος από προϊόντα που παράγονται ανά μήνα:
Και, τέλος, η πιο ρόδινη υπόθεση είναι ότι λόγω της χαμηλής τιμής και της υψηλής ποιότητας, μια ουρά ικανοποιημένων πελατών δημιουργεί συνεχώς ουρά για εμάς. Μπορούμε να επιλέξουμε μόνοι μας τους μηνιαίους όγκους παραγωγής, με βάση την επίλυση του προβλήματος περιορισμένης βελτιστοποίησης scipy.optimize:
Συμπέρασμα: για να λάβει ο σκηνοθέτης το άξιο του μέγιστο, είναι βέλτιστο να δημιουργείτε 8 σελίδες προορισμού, 6 ιστότοπους μεσαίου μεγέθους και 3 καταστήματα ανά μήνα. Σε αυτή την περίπτωση, ο ανώτερος πρέπει να οργώσει χωρίς να κοιτάξει ψηλά από το μηχάνημα, το φορτίο των μεσαίων θα είναι περίπου 2/3, οι junior λιγότερο από το μισό.
Συμπέρασμα
Το άρθρο περιγράφει τις βασικές τεχνικές για την εργασία με το πακέτο scipy.optimize, χρησιμοποιείται για την επίλυση προβλημάτων ελαχιστοποίησης υπό όρους. Προσωπικά χρησιμοποιώ scipy καθαρά για ακαδημαϊκούς σκοπούς, γι' αυτό και το παράδειγμα που δίνεται είναι τόσο κωμικού χαρακτήρα.
Πολλά θεωρητικά και εικονικά παραδείγματα μπορούν να βρεθούν, για παράδειγμα, στο βιβλίο του I.L. Akulich «Μαθηματικός προγραμματισμός σε παραδείγματα και προβλήματα». Περισσότερη σκληροπυρηνική εφαρμογή scipy.optimize για την κατασκευή μιας τρισδιάστατης δομής από ένα σύνολο εικόνων (άρθρο για το Habré) μπορεί να προβληθεί σε scipy-cookbook.
Η κύρια πηγή πληροφοριών είναι docs.scipy.orgόσοι επιθυμούν να συνεισφέρουν στη μετάφραση αυτής και άλλων ενοτήτων scipy Καλωσήρθες στο GitHub.
σας ευχαριστώ μεφιστοφείς για συμμετοχή στην προετοιμασία της έκδοσης.