Quy hoạch động

From Systems analysis wiki
Jump to navigation Jump to search

Quy hoạch động (QHĐ; tiếng Anh: dynamic programming, DP) — là phương pháp giải các bài toán tối ưu phức tạp, dựa trên việc phân chia bài toán gốc thành một chuỗi các bài toán con đơn giản hơn[1][2]. Phương pháp được áp dụng cho các quá trình ra quyết định nhiều bước, trong đó nghiệm tối ưu của toàn bộ bài toán có thể được xây dựng từ các nghiệm tối ưu của các bài toán con.

Thuật ngữ này được giới thiệu bởi nhà toán học người Mỹ Richard Bellman vào những năm 1950[3]. Trong ngữ cảnh này, từ "programming" (lập trình) được dùng với nghĩa "lập kế hoạch" hoặc "xây dựng kế hoạch hành động tối ưu", chứ không phải viết mã máy tính[4].

Các tính chất và định lý then chốt

Khả năng áp dụng quy hoạch động cho một bài toán được xác định bởi sự tồn tại của hai tính chất cơ bản.

Nguyên lý tối ưu Bellman

Khái niệm trung tâm của phương pháp là nguyên lý tối ưu Bellman (tiếng Anh: Bellman's principle of optimality). Nguyên lý phát biểu rằng: bất kể trạng thái ban đầu và quyết định ban đầu là gì, các quyết định tiếp theo phải tạo thành một chiến lược tối ưu đối với trạng thái thu được từ quyết định đầu tiên[3].

Nói cách khác, bất kỳ đoạn nào của quỹ đạo tối ưu tự nó cũng là tối ưu. Tính chất này cho phép phân chia bài toán tổng thể thành một chuỗi các bài toán con đơn giản hơn và giải chúng một cách đệ quy.

Bài toán con chồng lấp

Một bài toán có tính chất bài toán con chồng lấp (tiếng Anh: overlapping subproblems) nếu khi giải đệ quy, các bài toán con giống nhau xuất hiện nhiều lần. QHĐ cho phép tránh các phép tính lặp lại bằng cách lưu trữ các nghiệm của các bài toán con đã gặp (kỹ thuật này được gọi là memoization hoặc tabulation), qua đó tăng đáng kể hiệu quả so với duyệt đệ quy ngây thơ.

Phương trình Bellman

Từ nguyên lý tối ưu suy ra quan hệ truy hồi cơ bản của phương pháp — phương trình Bellman[1]. Nó liên kết "giá trị" (phần thưởng hoặc chi phí tối ưu) của trạng thái hiện tại với các giá trị của các trạng thái tiếp theo. Dạng tổng quát cho quá trình nhiều bước tất định với hàm mục tiêu cộng tính như sau:

Vk1(x)=maxyU(x){φk(x,y)+Vk(fk(x,y))}

trong đó:

  • k — số thứ tự bước (từ m đến 1);
  • x — trạng thái của hệ thống tại bước k1;
  • y — quyết định điều khiển được đưa ra tại bước k;
  • φk(x,y) — phần thưởng (hoặc chi phí) tại bước thứ k;
  • fk(x,y) — hàm xác định trạng thái mới của hệ thống;
  • Vk(s) — giá trị tối ưu của hàm mục tiêu cho bài toán con bắt đầu từ bước k tại trạng thái s.

Phương trình được giải tuần tự, thông thường là "từ cuối", tiến từ bước cuối cùng về bước đầu tiên.

Các ví dụ áp dụng

  • Bài toán đường đi ngắn nhất trong đồ thị: Bài toán này có tính chất cấu trúc con tối ưu, vì bất kỳ đoạn nào của đường đi ngắn nhất cũng tự nó là ngắn nhất. Các thuật toán Bellman-Ford và Floyd-Warshall là những ví dụ kinh điển về áp dụng QHĐ để giải bài toán này[5].
  • Bài toán cái túi (knapsack): Bài toán về việc lấp đầy tối ưu một chiếc túi có dung lượng giới hạn bằng các vật phẩm có giá trị và trọng lượng khác nhau. QHĐ cho phép giải bài toán này bằng cách xét các vật phẩm lần lượt và tính toán tại mỗi bước giá trị tối đa cho tất cả các giá trị có thể của dung lượng còn lại.
  • Bài toán phân bổ tài nguyên: Phân bổ tài nguyên giới hạn (ví dụ: vốn đầu tư) giữa nhiều dự án nhằm tối đa hóa hiệu quả tổng thể.

Hạn chế

Hạn chế chính của phương pháp là 'lời nguyền chiều (tiếng Anh: curse of dimensionality) — thuật ngữ do Bellman đặt ra để chỉ sự tăng trưởng theo hàm mũ của số lượng trạng thái và do đó là độ phức tạp tính toán khi số biến mô tả trạng thái của hệ thống tăng lên[6][7]. Điều này hạn chế việc áp dụng thực tế của QHĐ chính xác cho các bài toán có kích thước rất lớn.

Các khái niệm liên quan

  • Nghiên cứu vận trù học
  • Lý thuyết điều khiển tối ưu
  • Quá trình quyết định Markov (tổng quát hóa ngẫu nhiên)
  • Phương trình Hamilton – Jacobi – Bellman (tương tự cho thời gian liên tục)

Ghi chú

[1] [2] [3] [4] [5] [6] [7] </references>

  1. 1.0 1.1 1.2 "Динамическое программирование". Большая российская энциклопедия. [1]
  2. 2.0 2.1 "Динамическое программирование". Википедия. [2]
  3. 3.0 3.1 3.2 Решетников А. Н., Коченков А. В., Пиров Д. М., Рябоконь Д. А. (2011). Динамическое программирование. Примеры применения. Учебное пособие, ННГУ им. Лобачевского (ВМиК). [3]
  4. 4.0 4.1 "Dynamic programming". Wikipedia. [4]
  5. 5.0 5.1 Bradley S. P., Hax A. C., Magnanti T. L. (1977). Applied Mathematical Programming. Addison-Wesley. [5]
  6. 6.0 6.1 "Проклятие размерности". Википедия. [6]
  7. 7.0 7.1 Jensen P. A. (2004). Dynamic Programming – Models. Operations Research Models and Methods, Univ. of Texas. [7]