8

Tôi đang tìm cách chạy tối ưu hóa độ dốc gốc để giảm thiểu chi phí của việc khởi tạo biến. Chương trình của tôi rất tốn kém về mặt tính toán, vì vậy tôi đang tìm kiếm một thư viện phổ biến với việc triển khai nhanh GD. Thư viện/tài liệu tham khảo được đề xuất là gì?Triển khai thực hiện độ dốc nhanh trong thư viện C++?

+0

Điều gì sẽ là _fast_? Không chính xác? Câu trả lời được lưu trong bộ nhớ cache cho các truy vấn trước đó? Hoặc một số loại tiêu chí khác? – sarnold

+0

@sarnold True. Không chính xác là ổn, tôi không cần phải đạt mức tối ưu toàn cầu.Tôi chỉ muốn một cái gì đó có thể nhanh chóng đạt được kết quả tốt hơn so với tìm kiếm ngẫu nhiên :) Tôi muốn chơi với thời gian tôi cho phép nó chạy để xem thời gian/cải tiến cân bằng. – Jim

+0

Tại sao triển khai của bạn chậm? – Jacob

Trả lời

9

GSL là thư viện tuyệt vời (và miễn phí) đã triển khai các chức năng chung về lợi ích toán học và khoa học.

Bạn có thể xem qua toàn bộ reference manual online. Poking xung quanh, this bắt đầu trông thú vị, nhưng tôi nghĩ rằng chúng ta sẽ cần phải biết thêm về vấn đề này.

+1

Các thuật toán thay thế được liệt kê trong tham chiếu GSL là các phương pháp gradient liên hợp/biconjugate, và sẽ cho hiệu suất tốt hơn so với gốc dốc miễn là dữ liệu của bạn được "cư xử tốt". –

+2

Và nếu bạn đang tính số lượng các dẫn xuất của bạn từ các giá trị hàm thì bạn có thể muốn thay thế này: http://www.gnu.org/software/gsl/manual/html_node/Multimin-Algorithms-without-Dericies.html –

+0

Điều này trông giống như một câu trả lời thực sự tốt, nhưng tôi đang có một thời gian thực sự khó khăn nhận được điều này đi với VS2010 (cầu kỳ, tôi biết ...) – Jim

2

Hãy thử CPLEX được cung cấp miễn phí cho sinh viên.

4

Một trong những thư viện được kính trọng nhất cho loại công việc tối ưu hóa này là NAG libraries. Chúng được sử dụng trên toàn thế giới trong các trường đại học và công nghiệp. Chúng có sẵn cho C/FORTRAN. Chúng rất không miễn phí và chứa đựng nhiều chức năng hơn là các chức năng giảm thiểu - Rất nhiều toán học toán học tổng quát được đề cập đến.

Dù sao tôi nghi ngờ thư viện này quá mức cần thiết cho những gì bạn cần. Nhưng đây là những phần liên quan đến việc giảm thiểu: Local MinimisationGlobal Minimization.

+0

Thư viện này cũng có vẻ thực sự tốt, nhưng phần "rất không tự do" khiến tôi hơi lo lắng khi sử dụng nó – Jim

4

Có vẻ như bạn đang khá mới đối với các phương pháp giảm thiểu. Bất cứ khi nào tôi cần tìm hiểu một bộ phương pháp số mới, tôi thường xem trong Numerical Recipes. Đó là một cuốn sách cung cấp một cái nhìn tổng quan tốt đẹp của các phương pháp phổ biến nhất trong lĩnh vực này, sự cân bằng của họ, và (quan trọng) nơi để tìm trong các tài liệu để biết thêm thông tin. Nó thường không phải là nơi tôi dừng lại, nhưng nó thường là một điểm khởi đầu hữu ích.

Ví dụ: nếu chức năng của bạn tốn kém, thì mục tiêu của bạn là giảm thiểu số lượng đánh giá cần phải hội tụ. Nếu bạn có các biểu thức phân tích cho gradient, thì một phương thức dựa trên gradient có thể sẽ làm việc với lợi thế của bạn, giả sử rằng hàm và gradient của nó là hành vi tốt (thiếu số ít) trong miền quan tâm.

Nếu bạn không có độ phân tích, thì bạn hầu như luôn sử dụng cách tiếp cận như downhill simplex chỉ đánh giá hàm (không phải là độ dốc). Các gradient số là đắt tiền.

Cũng lưu ý rằng tất cả các cách tiếp cận này sẽ hội tụ với minima địa phương, vì vậy chúng khá nhạy cảm với điểm mà lúc đầu bạn bắt đầu trình tối ưu hóa. Tối ưu hóa toàn cầu là một con thú hoàn toàn khác.

Là tư tưởng cuối cùng, hầu như tất cả mã bạn có thể tìm để giảm thiểu sẽ có hiệu quả hợp lý. Chi phí thực tế của việc giảm thiểu là trong hàm chi phí. Bạn nên dành thời gian lược tả và tối ưu hóa chức năng chi phí của bạn, và chọn một thuật toán sẽ giảm thiểu số lần bạn cần gọi nó (các phương thức như downhill simplex, gradient liên hợp, và BFGS tất cả tỏa sáng trên các loại vấn đề khác nhau).

Về mặt mã thực tế, bạn có thể tìm thấy nhiều thói quen tốt đẹp tại NETLIB, ngoài các thư viện khác đã được đề cập. Hầu hết các thói quen đều ở FORTRAN 77, nhưng không phải tất cả; để chuyển đổi chúng thành C, f2c là khá hữu ích.

+1

Một lưu ý bổ sung về việc sử dụng các chức năng fortran là thường khá dễ dàng liên kết mã C và fortran với nhau. Đặc biệt là các thư viện fortran được cấu trúc tốt. –

Các vấn đề liên quan