03/08/2026
🔄 5 đặc điểm giúp bạn nhận ra có thể áp dụng được Dynamic Programming vào một vấn đề cụ thể hay không
(Vận trù học - Phần 40)
Không phải bài toán tối ưu nào cũng nên giải bằng Dynamic Programming – Quy hoạch động. Vậy làm thế nào để nhận biết một bài toán có thể áp dụng phương pháp này ?
🚗Hãy tưởng tượng bạn cần đi từ Hà Nội đến một thành phố xa và phải lựa chọn điểm dừng sau mỗi ngày. Mỗi quyết định hôm nay sẽ ảnh hưởng đến vị trí của bạn ngày mai và tổng quãng đường của cả hành trình.
⭐Một bài toán Dynamic Programming thường có 5 đặc điểm quan trọng sau:
1️⃣ Bài toán được chia thành nhiều giai đoạn
Mỗi giai đoạn tương ứng với một thời điểm hoặc một bước trong quá trình ra quyết định. Trong bài toán tìm đường, mỗi ngày di chuyển có thể được xem là một giai đoạn.
Ở ngày thứ nhất, bạn chọn thành phố đầu tiên để dừng lại. Sang ngày thứ hai, bạn tiếp tục lựa chọn điểm đến tiếp theo.
Trong thực tế, “giai đoạn" còn có thể là:
📌 Một ngày trong kế hoạch sản xuất
📌 Một tháng trong bài toán quản lý tồn kho
📌 Một bước trong hành trình vận chuyển
📌 Một thời kỳ trong kế hoạch đầu tư
2️⃣ Mỗi giai đoạn có một hoặc nhiều trạng thái
Trạng thái là toàn bộ thông tin cần thiết để đưa ra quyết định tối ưu tại một thời điểm. Trong bài toán tìm đường, trạng thái có thể đơn giản là:
👉 Bạn đang ở thành phố nào?
Điều quan trọng là bạn không nhất thiết phải nhớ toàn bộ hành trình trước đó. Khi đã đến Đà Nẵng, quyết định tiếp theo thường chỉ phụ thuộc vào việc bạn đang ở Đà Nẵng, chứ không phụ thuộc vào việc bạn đã đến đó bằng tuyến đường nào.
3️⃣ Mỗi quyết định sẽ làm thay đổi trạng thái
Tại mỗi giai đoạn, bạn phải lựa chọn một hành động.Quyết định đó sẽ đưa hệ thống từ trạng thái hiện tại sang trạng thái ở giai đoạn tiếp theo.
Ví dụ:
📍 Trạng thái hiện tại: Bạn đang ở Hà Nội
🚗 Quyết định: Di chuyển đến Thanh Hóa
📍 Trạng thái tiếp theo: Bạn đang ở Thanh Hóa
Trong một số bài toán đơn giản, trạng thái tiếp theo được xác định chắc chắn. Tuy nhiên, trong các bài toán có yếu tố ngẫu nhiên, quyết định chỉ tạo ra một phân phối xác suất cho các trạng thái có thể xảy ra.
4️⃣ Bài toán tuân theo Nguyên lý tối ưu
Đây là tư tưởng quan trọng nhất của Dynamic Programming. Nguyên lý tối ưu phát biểu rằng:
👉 Nếu một phương án tổng thể là tối ưu, thì phần còn lại của phương án đó, tính từ bất kỳ trạng thái trung gian nào, cũng phải là phương án tối ưu.
Giả sử tuyến đường ngắn nhất từ Hà Nội đến TP.HCM đi qua Đà Nẵng. Khi đó, đoạn đường từ Đà Nẵng đến TP.HCM nằm trong tuyến đường này cũng phải là tuyến đường ngắn nhất từ Đà Nẵng đến TP.HCM.
Nếu tồn tại một tuyến đường ngắn hơn từ Đà Nẵng đến TP.HCM, ta chỉ cần thay đoạn đường cũ bằng tuyến ngắn hơn. Khi đó, toàn bộ hành trình Hà Nội – TP.HCM cũng sẽ ngắn hơn. Nói đơn giản là:
💡 Một lời giải tối ưu được tạo thành từ những lời giải tối ưu của các bài toán nhỏ hơn.
5️⃣ Có công thức truy hồi (recusion) liên kết các giai đoạn
Dynamic Programming không giải toàn bộ bài toán trong một lần. Thay vào đó, phương pháp này xây dựng một công thức cho phép sử dụng kết quả của giai đoạn sau để giải giai đoạn hiện tại.
Ví dụ, nếu đích đến là TP.HCM:
📌 Đầu tiên, tìm tuyến tốt nhất từ các thành phố gần TP.HCM đến TP.HCM
📌 Tiếp theo, tìm tuyến tốt nhất từ các thành phố ở giai đoạn trước
📌 Tiếp tục tính ngược lại cho đến điểm xuất phát
Cách làm này được gọi là working backward – giải ngược từ cuối về đầu.
✅ Tóm lại, một bài toán phù hợp với Dynamic Programming thường có:
📌 Nhiều giai đoạn ra quyết định
📌 Một tập hợp trạng thái tại mỗi giai đoạn
📌 Quyết định làm thay đổi trạng thái
📌 Nguyên lý tối ưu
📌 Công thức truy hồi giữa các giai đoạn