Bài toán cắm hoa

Một phần của tài liệu ỨNG DỤNG PHƯƠNG PHÁP QUY HOẠCH ĐỘNG ĐỂ GIẢI CÁC BÀI TOÁN TỐI ƯU TỔ HỢP 10600755 (Trang 50)

5. Bố cục đề tài

2.5. Bài toán cắm hoa

2.5.1. Phát biểu bài toán

Có n lọ hoa sắp thẳng hàng và k bó hoa được đánh số thứ tự từ nhỏ đến lớn. Cần cắm k bó hoa trên vào n lọ sao cho hoa có số thứ tự nhỏ phải đứng trước hoa có số thứ tự lớn. Giá trị thẩm mỹ tương ứng khi cắm hoa i vào lọ thứ j là

tailor j 4 5 6 7 4 1 60 75 90 105 7 2 137 6 3 191 193 227 235 tailor j 4 5 6 7 4 1 7 2 4 6 3 7 7 6 7 i i

v(i, j). Hãy tìm cách cắm sao cho tổng giá trị thẩm mỹ là lớn nhất. Chú ý rằng mỗi bó hoa chỉ được cắm vào một lọ và mỗi lọ chỉ được cắm một bó hoa.

Dữ liệu vào: Ghi trong tệp văn bản Flower.inp gồm:

- Dòng đầu tiên là 2 trị k và n cách nhau một khoảng trắng.

- k dòng tiếp theo, trên mỗi dòng ghi n số v(i, j) và các số này cách nhau một khoảng trắng.

Dữ liệu ra: Ghi trong tệp văn bản Flower.out gồm:

- Dòng đầu tiên là tổng giá trị thẩm mỹ lớn nhất của phương án cắm hoa. - Từ dòng thứ hai là dãy k số hiệu lọ được chọn cho mỗi bó hoa.

Ví dụ: Flower.inp Flower.out 5 6 4 6 4 3 10 2 7 6 7 5 9 2 1 2 9 5 7 3 3 7 10 5 6 4 5 8 7 4 5 1 29 1 2 3 4 5

2.5.2. Phân tích, xử lý bài toán và lập hệ thức truy hồi

- Nếu i = j, chỉ có một cách cắm T(i, j) = v[1, 1] + v[2, 2] + … v[i, i]. - Nếu i > j, không có cách cắm hợp lý.

- Nếu i < j, có 2 trường hợp xảy ra:

+ Cắm hoa i vào lọ j. Tổng giá trị thẩm mỹ là

T(i, j) = T(i – 1, j – 1) + v(i, j)

(Bằng tổng giá trị trước khi cắm với giá trị thẩm mỹ khi cắm hoa i vào lọ j). + Không cắm hoa i vào lọ j (có thể cắm vào lọ trước j), giá trị thẩm mỹ của cách cắm là như cũ:

T(i, j) = T(i, j – 1)

2.5.3. Thuật toán

Khởi tạo mảng hai chiều V có số dòng là k + 1 và số cột là n + 1, giá trị các phần tử tương ứng là các số ở dòng k + 1 và các cột n + 1 tiếp theo được đọc từ file đầu vào.

Khởi tạo mảng hai chiều L để đánh dấu những lọ được cắm với số dòng là k + 1 và số cột là n + 1 với các phần tử đều bằng 0.

Khởi tạo mảng hai chiều T có số dòng là k + 1 và số cột là n + 1.

Vì i > j sẽ không có cách cắm nào hợp lý nên ta chỉ xét đến những phần tử nằm ở phía bên phải đường chéo chính của mảng hai chiều T và F.

Các phần tử ở mảng hai chiều T được tính như sau: - i = 0: T[i, j] = -MAX_INT

- i = j: T[i, j] = v[1, 1] + v[2, 2] + … v[i, i]. Đánh dấu L[i, j] = 1. - i < j: T[i, j] = max (T[i – 1, j – 1] + v[i, j], T[i, j – 1]).

Nếu T[i, j] = T[i – 1, j – 1] + v[i, j] thì đánh dấu L[i, j] = 1. T[k, n] chính là tổng giá trị thẩm mỹ lớn nhất.

Truy vết, trên mảng hai chiều L để tìm các lọ được cắm.

2.5.4. Thiết kế chương trình

B1: Khởi tạo mảng hai chiều value có số dòng là k + 1 và số cột là n + 1, giá

trị các phần tử tương ứng là các số ở dòng k + 1 và các cột n + 1 tiếp theo được đọc từ file đầu vào.

B2: Khởi tạo mảng hai chiều selected để đánh dấu những lọ được cắm với số

dòng là k + 1 và số cột là n + 1 với các phần tử đều bằng 0.

B3: Khởi tạo mảng hai chiều totalValue với số dòng là k + 1 và số cột là n + 1. Các phần tử được tính như sau:

For j từ 1 đến n totalValue[0][j] = - MAX_INT For i từ 1 đến k For j từ i đến n If i = j totalValue[i][j] = sum(i) Else

If totalValue[i - 1][j - 1] + value[i][j] >= totalValue[i][j – 1] totalValue[i][j] = totalValue[i - 1][j - 1] + value[i][j] selected[i][j] = 1 Else totalValue[i][j] = totalValue[i ][j - 1] B4: Truy vết tmp = n + 1 For i từ k đến 1 For j từ tmp - 1 đến i If selected[i][j] = 1 j là lọ được chọn cắm tmp = j

Ghi j vào file Flower.out Thoát khỏi for j

2.5.5. Ví dụ

Ta có các mảng hai chiều value, totalValue, selected được tính từ đề bài ví dụ ban đầu như sau:

Mảng value: Mảng totalValue (M : MAX_INT): 1 2 3 4 5 6 1 4 6 4 3 10 2 2 7 6 7 5 9 2 3 1 2 9 5 7 3 4 3 7 10 5 6 4 5 5 8 7 4 5 1 1 2 3 4 5 6 0 -M -M -M -M -M -M 1 4 4 4 4 4 4 2 10 11 11 13 13 3 19 19 19 19 4 24 25 25 5 29 29

Mảng selected:

Tổng giá trị thẩm mỹ lớn nhất là 29.

Sau khi truy vết, các lọ hoa được chọn để cắm là: 1, 2, 3, 4, 5.

1 2 3 4 5 6 0 1 1 0 0 0 0 0 2 1 1 0 1 0 3 1 0 0 0 4 1 1 0 5 1 0

CHƯƠNG 3

KẾT QUẢ ĐẠT ĐƯỢC

3.1. Bài toán di chuyển của Robot 3.1.1. Cài đặt chương trình 3.1.1. Cài đặt chương trình

B1: Tạo 2 file Robot.inp và Robot.out.

Hình 3.1. Tạo file

B2: Ghi dữ liệu vào file Robot.inp theo yêu cầu đề bài.

Hình 3.2. File Robot.inp

B3: Thực thi chương trình tìm đường đi của Robot (được viết bằng Java) và

Hình 3.3. Chương trình tìm đường đi của Robot

Hình 3.4. Truy vết đường đi của Robot và ghi vào file

Hình 3.5. File Robot.out

3.1.2. Độ phức tạp

Độ phức tạp vòng for thứ hai là O(n).

Độ phức tạp vòng for đầu tiên lồng vòng for thứ hai là O(m). Độ phức tạp là O(m.n).

3.2. Bài toán balo

3.2.1. Cài đặt chương trình

B1: Tạo 2 file Balo.inp và Balo.out.

Hình 3.6. Tạo file

Hình 3.7. File Balo.inp

B3: Thực thi chương trình chọn các mặt hàng (được viết bằng Java) và truy

vết.

Hình 3.9. Truy vết các mặt hàng được chọn và ghi vào file

B4. Kết thúc và được kết quả.

Hình 3.10. File Balo.out

3.2.2. Độ phức tạp

Độ phức tạp vòng for thứ hai là O(M).

Độ phức tạp vòng for đầu tiên lồng vòng for thứ hai là O(n). Độ phức tạp là O(M.n).

3.3. Bài toán phép nhân tổ hợp dãy ma trận 3.3.1. Cài đặt chương trình 3.3.1. Cài đặt chương trình

B1: Tạo 2 file Matrix.inp và Matrix.out.

Hình 3.11. Tạo file

B2: Ghi dữ liệu vào file Matrix.inp theo yêu cầu đề bài.

Hình 3.12. File Matrix.inp

B3: Thực thi chương trình tìm biểu thức kết hợp tối ưu của phép nhân dãy

Hình 3.13. Chương trình tìm biểu thức kết hợp tối ưu phép nhân dãy ma trận

Hình 3.14. Truy vết và ghi vào file

Hình 3.15. File Matrix.out

3.3.2. Độ phức tạp

Độ phức tạp vòng for thứ ba, trường hợp xấu nhất là O(n). Độ phức tạp vòng for thứ hai, trường hợp xấu nhất là O(n). Độ phức tạp vòng for đầu tiên là O(n).

Độ phức tạp, trường hợp xấu nhất là O(n3).

Tối ưu bằng việc sử dụng mảng 1 chiều, độ phức tạp sẽ là O(n2).

3.4. Bài toán lập lịch thuê thợ may hàng tháng 3.4.1. Cài đặt chương trình 3.4.1. Cài đặt chương trình

B1: Tạo 2 file Tailor.inp và Tailor.out.

Hình 3.16. Tạo file

B2: Ghi dữ liệu vào file Tailor.inp theo yêu cầu đề bài.

B3: Thực thi chương trình tìm số thợ may của mỗi tháng (được viết bằng

Java) và truy vết.

Hình 3.18. Chương trình tìm số thợ may của mỗi tháng

B4. Kết thúc và được kết quả.

Hình 3.20. File Tailor.out

3.4.2. Độ phức tạp

Độ phức tạp vòng for thứ ba, trường hợp xấu nhất là O(tailorMax). Độ phức tạp vòng for thứ hai, trường hợp xấu nhất là O(tailorMax). Độ phức tạp vòng for đầu tiên là O(month).

Độ phức tạp, trường hợp xấu nhất là O(month * tailorMax2) hay O(t*sMax), sMax là số thợ may của tháng cần nhiều người nhất.

Tối ưu bằng việc sử dụng mảng 1 chiều, độ phức tạp sẽ là O(n2).

3.5. Bài toán cắm hoa 3.5.1. Cài đặt chương trình 3.5.1. Cài đặt chương trình

B1: Tạo 2 file Flower.inp và Flower.out.

Hình 3.21. Tạo file

Hình 3.22. File Flower.inp

B3: Thực thi chương trình tìm cách cắm hoa (được viết bằng Java) và truy

vết.

Hình 3.24. Truy vết và ghi vào file

B4. Kết thúc và được kết quả.

Hình 3.25. File Flower.out

3.5.2. Độ phức tạp

Độ phức tạp vòng for thứ hai là O(n).

Độ phức tạp vòng for đầu tiên lồng vòng for thứ hai là O(k). Độ phức tạp là O(n.k).

KẾT LUẬN VÀ KIẾN NGHỊ

Sau một thời gian nỗ lực làm việc, các thuật toán để giải quyết các bài toán đã được hoàn tất. Tuy còn nhiều thiếu sót bởi những lý do như kinh nghiệm và thời gian hạn chế... Nhưng các thuật toán đã đạt được nhiều thành công nhất định. Qua đó, em có thể thỏa mãn đam mê sáng tạo, rèn luyện kĩ năng, thao tác lập trình và đóng góp thêm phần tài liệu bổ ích hơn cho mọi người tham khảo.

Trong tương lai, nếu có điều kiện em sẽ bổ sung thêm một số bài toán nữa và tìm ra thuật giải tối ưu hơn với những bài toán cũ.

TÀI LIỆU THAM KHẢO

Tiếng Việt

[1] http://vi.wikipedia.org/wiki/Quy_hoạch_động.

[2] Phan Thanh Tao (2007), Phân tích & Thiết kế Giải thuật. [3] Trần Quốc Chiến (2012), Cấu trúc dữ liệu và giải thuật. [4] Trần Quốc Chiến, Phân tích và thiết kế giải thuật.

Một phần của tài liệu ỨNG DỤNG PHƯƠNG PHÁP QUY HOẠCH ĐỘNG ĐỂ GIẢI CÁC BÀI TOÁN TỐI ƯU TỔ HỢP 10600755 (Trang 50)

Tải bản đầy đủ (PDF)

(70 trang)