Tiến hóa khác biệt SciPy

Tien Hoa Khac Biet Scipy



Bài này viết về Sự tiến hóa khác biệt của SciPy (DE). SciPy là thư viện của ngôn ngữ Python và Sự tiến hóa khác biệt là phương thức hoặc chức năng của thư viện SciPy. Hầu hết mọi người đã học Python, cho dù họ có phải là nhà phát triển hay không, vì nhiều thư viện và chức năng của Python làm cho nó rất an toàn và đáng tin cậy. SciPy thường được sử dụng để giải các phương trình vi phân và đại số, nội suy, tối ưu hóa, v.v. Ở đây, chúng ta đang thảo luận về cách sử dụng SciPy DE để giúp bạn hiểu cách triển khai hàm tiến hóa vi phân SciPy trong các ứng dụng Python.

Sự tiến hóa khác biệt của SciPy trong ngôn ngữ Python là gì?

scipy là một thư viện bề ngoài, miễn phí và dễ hiểu được sử dụng để giải quyết các vấn đề khoa học và toán học. SciPy là một hộp kho báu dành cho các nhà phát triển vì thư viện của nó chứa đầy các mô-đun quý giá. SciPy mở rộng chức năng NumPy với một cụm thuật toán có giá trị. Thư viện SciPy có các gói con có thể được sử dụng để tính toán, chẳng hạn như scipy.io, scipy.optimize, v.v. SciPy tạo ra một hàm “tiến hóa vi phân” và nhiều hàm mạnh mẽ trong gói scipy.optimize. scipy.optimize được sử dụng để tối ưu hóa trong các ứng dụng Python.

Hàm tiến hóa vi phân là một hàm toàn cục có được nhờ gói tối ưu hóa SciPy được sử dụng để tìm giá trị cực tiểu toàn cầu của các hàm đa biến. Nó có thể quản lý các hàm mục tiêu đa chiều phi tuyến tính và không khả vi. Nó là một thuật toán tìm kiếm được sử dụng để tìm kiếm các khu vực của các hàm không gian liên tục. Chức năng này hoạt động trên các giá trị thực.







Cú pháp của hàm tiến hóa vi phân

Hàm tiến hóa vi phân có trong Python sử dụng hàm differ_evolution(). Cú pháp của hàm tiến hóa vi phân được hiển thị bên dưới:





Hãy xem qua các tham số chức năng:





Hàm phải có thể gọi được với f(x,*args); giới hạn đề cập đến chuỗi các biến có thể được chỉ định theo hai cách: chiến lược là tùy chọn hoặc một chuỗi có giá trị mặc định “best1bin”; maxiter là tùy chọn hoặc một giá trị int; popsize là int hoặc tùy chọn; tol là int hoặc tùy chọn; giá trị đột biến ở dạng float hoặc tùy chọn; giá trị tái tổ hợp ở dạng float hoặc tùy chọn; hạt giống là none, int, NumPy và Random.

Trong phần tiếp theo, chúng ta sẽ thảo luận về hàm tiến hóa vi phân với sự trợ giúp của các ví dụ đơn giản.



ví dụ 1

Hãy bắt đầu với một ví dụ đơn giản sẽ giúp bạn quan tâm hơn đến việc hiểu khái niệm về hàm tiến hóa vi phân. Chúng tôi đã sử dụng hàm differ_evolution() để tìm giá trị nhỏ nhất. Tuy nhiên, để tìm giá trị nhỏ nhất, hàm yêu cầu giới hạn tìm kiếm và hàm mục tiêu có thể gọi được đã xác định. Do đó, chúng ta định nghĩa một hàm trước khi sử dụng hàm differ_evolution trong chương trình. Mã tham chiếu của chương trình được đề cập dưới đây:

nhập khẩu cục mịch như ví dụ.
từ scipy nhập khẩu tối ưu hóa
từ scipy. tối ưu hóa nhập khẩu sự khác biệt_evolution
nhập khẩu matplotlib. pyplot như py
từ matplotlib nhập khẩu cm

chắc chắn chức năng ( P ) :

Với , x = P

h = ví dụ. câu hỏi ( với ** 4 +x** 4 )

trở về ví dụ. câu hỏi ( h )


DE_bounds = [ [ - 6 , 6 ] , [ - 6 , 6 ] ]

độ phân giải = sự khác biệt_evolution ( chức năng , DE_bounds )

in ( độ phân giải )

Chúng tôi đã nhập các thư viện như SciPy và NumPy để tính toán số mảng. Chúng tôi đã nhập hàm differ_evolution từ mô-đun scipy.optimize. Sau đó, với từ khóa “def”, chúng ta xác định hàm mục tiêu có thể gọi được và truyền tham số “p”. Chúng tôi đã xác định thành công hàm tìm căn bậc hai của phép cộng các biến NumPy, đó là z, x. Giá trị căn bậc hai được lưu trong biến “h”. Chúng tôi trả về giá trị căn bậc hai trong hàm đã xác định. Nó được trả về như một đối số.

Sau đó, chúng tôi giải quyết các giới hạn của biến có thể được chia thành từng mục bằng cách giải thích các giá trị tối thiểu và tối đa của hàm. Chúng tôi thực thi hàm differ_evolution với ‘DE_bounds”’ làm đối số. Chúng tôi đã gọi giá trị hàm bằng một biến có tên là res. Cuối cùng, chúng tôi sử dụng câu lệnh in để hiển thị đầu ra. Kết quả được hiển thị sau khi chạy chương trình. Ảnh chụp màn hình đầu ra dự kiến ​​được hiển thị bên dưới:

Differential_evolution() cho biết giá trị nhỏ nhất của hàm được hiển thị tại điểm (0, 0).

ví dụ 2

Đây là một ví dụ khác về hàm tiến hóa vi phân. Trong phần này, chúng tôi lấy các mảng và áp dụng các thao tác khác nhau giữa chúng. Mã tham chiếu của chương trình được đề cập dưới đây:

nhập khẩu cục mịch như ví dụ.
từ scipy nhập khẩu tối ưu hóa
từ scipy. tối ưu hóa nhập khẩu sự khác biệt_evolution

chắc chắn object_func ( đ ) :
trở về ( đ [ 1 ] - 1.2 ) / 2 + 0,5 * d [ 0 ] * 1.3 * ( đ [ 1 ] + 0,5 ) ** 3

_giới hạn = [ ( - 0,3 , 0,3 ) , ( - 0,3 , 0,3 ) ]

phân tán = sự khác biệt_evolution ( object_func , _giới hạn , bật lên = 80 , đánh bóng = Sai )

in ( phân tán )

Như được hiển thị trong ảnh chụp màn hình trước, chúng tôi đã nhập thành công thư viện SciPy.optimize.differential_evolution và thư viện NumPy vào chương trình. Bây giờ, chúng tôi xác định một hàm mục tiêu thay mặt cho chúng tôi tìm thấy một giá trị tối thiểu. Chúng tôi đã chuyển biểu thức toán học trong hàm mục tiêu và trả về một giá trị làm đối số cho hàm đã xác định. Ranh giới giữa các giá trị chức năng là phải. Vì vậy, sau khi xác định chức năng, chúng tôi đã cố định cả hai giá trị (tối đa và tối thiểu).

Sau khi xác định tất cả các biến thiết yếu, chúng tôi đã gọi hàm differ_evolution để tìm giá trị nhỏ nhất của hàm. Chúng tôi đã lưu giá trị trả về tối thiểu của hàm trong một biến có tên là disp. Kết thúc chương trình, ta truyền biến disp vào câu lệnh print để hiển thị kết quả. Sau khi chạy chương trình, giá trị nhỏ nhất của hàm xác định được hiển thị trên màn hình với các giới hạn. Sau đây là đầu ra:

ví dụ 3

Như chúng ta có thể thấy, tiến hóa vi phân trả về các giá trị tối thiểu khác nhau của hàm mục tiêu dựa trên định nghĩa của nó. Ở đây, chúng tôi lấy một ví dụ khác liên quan đến differ_evolution(). Mã tham chiếu cho chương trình này được hiển thị bên dưới:

nhập khẩu cục mịch như ví dụ.
từ scipy nhập khẩu tối ưu hóa
từ scipy. tối ưu hóa nhập khẩu sự khác biệt_evolution

chắc chắn obj_func ( nhà điều hành ) :
trở lại 3 ** 9 / 0,2 + 6 / 3 * 2 ** hai mươi

ranh giới = [ ( - 0,5 , 0,5 ) , ( - 0,5 , 0,5 ) ]

ngoài = sự khác biệt_evolution ( obj_func , ranh giới , đánh bóng = Thật )

in ( 'Đầu ra là:' , ngoài )

Các thư viện được nhập thành công vào chương trình này vì chúng tôi không thể thực hiện các thao tác mà chúng tôi mong muốn nếu không có chúng. Do đó, chúng tôi đưa thư viện SciPy vào chương trình. Sau đó, xác định hàm mục tiêu với phép toán cần thiết. Ta tìm giá trị nhỏ nhất của hàm số xác định đó. Sau khi điều chỉnh ranh giới của hàm, chúng tôi đã gọi hàm đã xác định trong quá trình tiến hóa vi phân để tìm giá trị tối thiểu của hàm. Điều này sau đó được giữ trong biến. Chúng tôi hiển thị điều này bằng cách gọi biến này trong câu lệnh in. Đầu ra của chương trình này được hiển thị dưới đây:

Như trong ảnh chụp màn hình trước, giá trị nhỏ nhất của hàm là [0,29236931, 0,16808904]. Bạn cũng có thể chạy các ví dụ này trong môi trường của mình để hiểu rõ hơn về khái niệm hàm differ_evolution.

Phần kết luận

Hãy tóm tắt nhanh bài viết này. Chúng tôi đã nắm được chức năng cơ bản của phương pháp tiến hóa vi phân thuộc thư viện SciPy trong Python. Python là ngôn ngữ mới nhất, với nhiều thư viện linh hoạt. Hầu hết các nhà phát triển đã được hỗ trợ trong việc giải quyết các cấu trúc mã phức tạp bằng các hàm và thư viện được xác định trước. Tiến hóa khác biệt là một chức năng hoặc phương pháp tối ưu hóa gói SciPy được sử dụng để giảm thiểu. Khi bạn sử dụng các ví dụ trước đó trong mã, bạn sẽ hiểu rõ hơn về khái niệm tiến hóa khác biệt.