SciPy (phát âm là sai pie) là một gói toán học dựa trên NumPy cũng bao gồm các thư viện C và Fortran. SciPy biến phiên Python tương tác của bạn thành môi trường khoa học dữ liệu hoàn chỉnh như MATLAB, IDL, Octave, R hoặc SciLab.
Trong bài viết này, chúng ta sẽ xem xét các kỹ thuật cơ bản của lập trình toán học - giải các bài toán tối ưu hóa có điều kiện cho hàm vô hướng nhiều biến bằng cách sử dụng gói scipy.optimize. Các thuật toán tối ưu hóa không giới hạn đã được thảo luận trong bài viết cuối cùng. Bạn luôn có thể nhận được trợ giúp chi tiết và cập nhật hơn về các hàm scipy bằng cách sử dụng lệnh help(), Shift+Tab hoặc trong tài liệu chính thức.
Giới thiệu
Một giao diện chung để giải quyết cả các vấn đề tối ưu hóa có điều kiện và không bị ràng buộc trong gói scipy.optizes được cung cấp bởi hàm minimize(). Tuy nhiên, người ta biết rằng không có một phương pháp chung nào để giải quyết mọi vấn đề, vì vậy việc lựa chọn một phương pháp phù hợp như mọi khi đều thuộc về người nghiên cứu.
Thuật toán tối ưu hóa thích hợp được chỉ định bằng cách sử dụng đối số hàm minimize(..., method="").
Để tối ưu hóa có điều kiện một hàm nhiều biến, có thể triển khai các phương pháp sau:
SLSQP — lập trình bậc hai tuần tự có ràng buộc, phương pháp Newton để giải hệ Lagrange. bài viết Wiki.
TNC - Cắt ngắn ràng buộc Newton, hạn chế số lần lặp, tốt cho các hàm phi tuyến có số lượng biến độc lập lớn. bài viết Wiki.
L-BFGS-B — một phương pháp của nhóm Broyden–Fletcher–Goldfarb–Shanno, được triển khai với mức tiêu thụ bộ nhớ giảm do tải một phần vectơ từ ma trận Hessian. bài viết Wiki, bài viết về Habré.
COBYLA — Tối ưu hóa ràng buộc MARE bằng xấp xỉ tuyến tính, tối ưu hóa ràng buộc với xấp xỉ tuyến tính (không tính toán độ dốc). bài viết Wiki.
Tùy thuộc vào phương pháp đã chọn, các điều kiện và hạn chế để giải quyết vấn đề được đặt ra khác nhau:
đối tượng lớp Bounds đối với các phương thức L-BFGS-B, TNC, SLSQP, Trust-constr;
danh sách (min, max) đối với các phương thức tương tự L-BFGS-B, TNC, SLSQP, Trust-constr;
một đối tượng hoặc một danh sách các đối tượng LinearConstraint, NonlinearConstraint đối với các phương thức COBYLA, SLSQP, Trust-constr;
từ điển hoặc danh sách từ điển {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} cho các phương pháp COBYLA, SLSQP.
Đề cương bài viết:
1) Xem xét việc sử dụng thuật toán tối ưu hóa có điều kiện trong vùng tin cậy (method=”trust-constr”) với các ràng buộc được chỉ định làm đối tượng Bounds, LinearConstraint, NonlinearConstraint ;
2) Xem xét lập trình tuần tự bằng phương pháp bình phương nhỏ nhất (phương thức = "SLSQP") với các hạn chế được chỉ định dưới dạng từ điển {'type', 'fun', 'jac', 'args'};
3) Phân tích một ví dụ về tối ưu hóa các sản phẩm được sản xuất bằng cách sử dụng ví dụ về một studio trên web.
Phương pháp tối ưu hóa có điều kiện="trust-constr"
Thực hiện phương pháp trust-constr dựa trên EQSQP cho các vấn đề có ràng buộc về hình thức bình đẳng và về TRIP cho các bài toán có ràng buộc ở dạng bất đẳng thức. Cả hai phương pháp đều được thực hiện bằng thuật toán để tìm cực tiểu cục bộ trong vùng tin cậy và rất phù hợp cho các bài toán quy mô lớn.
Công thức toán học của bài toán tìm cực tiểu ở dạng tổng quát:
Đối với các ràng buộc bình đẳng nghiêm ngặt, giới hạn dưới được đặt bằng giới hạn trên .
Đối với ràng buộc một chiều, giới hạn trên hoặc giới hạn dưới được đặt np.inf bằng dấu tương ứng.
Cần tìm giá trị nhỏ nhất của hàm Rosenbrock đã biết của hai biến:
Trong trường hợp này, các hạn chế sau được đặt trên miền định nghĩa của nó:
Trong trường hợp của chúng tôi, có một giải pháp duy nhất tại thời điểm , trong đó chỉ hạn chế thứ nhất và thứ tư là hợp lệ.
Chúng ta hãy xem xét các hạn chế từ dưới lên trên và xem cách chúng ta có thể viết chúng trong scipy.
Hạn chế и hãy xác định nó bằng đối tượng Bounds.
Ma trận Jacobian cho các ràng buộc cũng có thể được tính bằng cách sử dụng sai phân hữu hạn. Tuy nhiên, trong trường hợp này, ma trận Hessian không thể tính được bằng sai phân hữu hạn. Hessian phải được định nghĩa là một hàm hoặc sử dụng lớp HessianUpdateStrategy.
Ngoài ra, đạo hàm bậc nhất và bậc hai của hàm đang được tối ưu hóa có thể được tính gần đúng. Ví dụ: Hessian có thể được tính gần đúng bằng cách sử dụng hàm SR1 (xấp xỉ gần đúng Newton). Độ dốc có thể được tính gần đúng bằng sai phân hữu hạn.
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)
Phương pháp tối ưu hóa có điều kiện="SLSQP"
Phương pháp SLSQP được thiết kế để giải quyết các bài toán cực tiểu hóa hàm có dạng:
Где и - tập hợp các chỉ số biểu thức mô tả các hạn chế dưới dạng đẳng thức hoặc bất đẳng thức. - tập hợp các giới hạn dưới và trên cho miền định nghĩa của hàm.
Các ràng buộc tuyến tính và phi tuyến được mô tả dưới dạng từ điển với các phím 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])
}
Việc tìm kiếm giá trị nhỏ nhất được thực hiện như sau:
Optimization terminated successfully. (Exit mode 0)
Current function value: 0.34271757499419825
Iterations: 4
Function evaluations: 5
Gradient evaluations: 4
[0.41494475 0.1701105 ]
Ví dụ về tối ưu hóa
Liên quan đến việc chuyển đổi sang cơ cấu công nghệ thứ năm, chúng ta hãy xem xét việc tối ưu hóa sản xuất bằng ví dụ về một studio web, mang lại cho chúng ta một khoản thu nhập nhỏ nhưng ổn định. Hãy tưởng tượng mình là giám đốc của một nhà bếp sản xuất ba loại sản phẩm:
x0 - bán landing page, từ 10 tr.
x1 - website công ty, từ 20 tr.
x2 - cửa hàng trực tuyến, từ 30 tr.
Đội ngũ làm việc thân thiện của chúng tôi bao gồm bốn cấp dưới, hai cấp trung và một cấp cao. Quỹ thời gian làm việc hàng tháng của họ:
Tháng Sáu: 4 * 150 = 600 чел * час,
giữa: 2 * 150 = 300 чел * час,
thưa ông: 150 чел * час.
Hãy để cấp dưới sẵn có đầu tiên dành (0, 1, 2) giờ cho việc phát triển và triển khai một trang loại (x10, x20, x30), cấp trung - (7, 15, 20), cấp cao - (5, 10, 15 ) giờ trong khoảng thời gian đẹp nhất trong cuộc đời bạn.
Giống như bất kỳ giám đốc bình thường nào, chúng tôi muốn tối đa hóa lợi nhuận hàng tháng. Bước đầu tiên để thành công là viết ra hàm mục tiêu value là số tiền thu nhập từ sản phẩm được sản xuất mỗi tháng:
Và cuối cùng, giả định màu hồng nhất là vì giá rẻ và chất lượng cao nên hàng dài khách hàng hài lòng liên tục xếp hàng chờ chúng tôi. Chúng ta có thể tự mình chọn khối lượng sản xuất hàng tháng, dựa trên việc giải quyết vấn đề tối ưu hóa bị ràng buộc với scipy.optimize:
Kết luận: để giám đốc nhận được mức tối đa xứng đáng của mình, tối ưu nhất là tạo 8 trang đích, 6 trang cỡ trung bình và 3 cửa hàng mỗi tháng. Trong trường hợp này, đàn anh phải cày mà không được nhìn lên khỏi máy, tải trọng của đàn giữa sẽ xấp xỉ 2/3, đàn em ít hơn một nửa.
Kết luận
Bài viết nêu ra những kỹ thuật cơ bản để làm việc với gói scipy.optimize, được sử dụng để giải các bài toán tối thiểu hóa có điều kiện. Cá nhân tôi sử dụng scipy hoàn toàn vì mục đích học thuật, đó là lý do tại sao ví dụ được đưa ra lại mang tính chất hài hước như vậy.
Bạn có thể tìm thấy rất nhiều lý thuyết và ví dụ ảo, chẳng hạn như trong cuốn sách “Lập trình toán học trong các ví dụ và bài toán” của I.L. Akulich. Nhiều ứng dụng khó tính hơn scipy.optimize để xây dựng cấu trúc 3D từ một tập hợp hình ảnh (bài viết về Habré) có thể được xem trong sách dạy nấu ăn scipy.
Nguồn thông tin chính là tài liệu.scipy.orgnhững người muốn đóng góp vào việc dịch phần này và phần khác scipy Chào mừng bạn đến GitHub.