Tải bản đầy đủ (.docx) (21 trang)

BÀI TOÁN TỐI ƯU quy hoạch động

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (581.86 KB, 21 trang )

Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

II. BÀI TOÁN TỐI ƯU quy hoạch động

1. Bài toán cái túi 0-1
Một tên trộm đột nhập cửa hàng tìm thấy n đồ vật có trọng lượng và giá trị khác
nhau. Tên trộm mang theo cái túi có trọng lượng tối đa là M, M nguyên.
Hãy chọn các đồ vật mà tên trộm có thể cho vào túi mang đi sao cho tổng giá trị
là lớn nhất.
Giải
Ký hiệu w(i) là trọng lượng vật i,
i=1..n.
v(i) là giá trị vật i, i=1..n.
Mô hình toán học của bài toán là bài toán quy hoạch tuyến tính nhị phân:
Tìm vectơ x = [x(1), …, x(n)] thỏa f(x) =
v(1).x(1)+v(2).x(2)+ … + v(n).x(n) ->max
w(1).x(1)+w(2).x(2)+ … + w(n).x(n) <=M
x(i) = 0, 1, với mọi i=1,…,n
Với các giá trị i và L: i = 0, 1, 2, ..., n và L = 0, 1, 2,..., M. Gọi F(i,L) là tổng giá
trị lớn nhất có thể chọn trong i đồ vật {1, .., i} với trọng lượng tối đa L.
• Lập công thức truy hồi
- Xác định tham số
Bài toán có 2 tham số: số đồ vật i= 0, 1, 2, ..., n và khối lượng giới hạn
L= 0, 1, 2,..., M.


- Công thức:
+ Trường hợp w(i) > L:
F(i, L) = F(i-1, L)
+ Trường hợp w(i) <= L:
Nếu đồ vật thứ i không được chọn, thì:

Chương III. Kỹ thuật quy hoạch động

III.1

Chương III. Kỹ thuật quy hoạch động

III.1


Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

F(i, L) = F(i -1, L)
Nếu đồ vật thứ i được chọn, thì:
F(i, L) = F(i -1, L – w(i)) + v(i)
 F(i, L) = max{ F(i -1, L); F(i -1, L – w(i)) + v(i)}
- Điều kiện đầu :
+


F(0,L) = 0, với mọi L=0..M

+
F(i,0) = 0, với mọi i=0..n.
• Tổ chức dữ liệu
- Lập bảng hai chiều F(i,L):
L
i
0

1

2





M

0

1

2






M

0

0

0





0

0
1
2

n
- Điền giá trị đầu
L
i

0

Chương III. Kỹ thuật quy hoạch động

III.2


Chương III. Kỹ thuật quy hoạch động

III.2


Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

1
2
:
n

0
0
:
0

- Sử dụng công thức truy hồi tính toán F(i,L) theo thứ tự i=1,2,…,n.
 Truy vết tìm phương án tối ưu
Tra bảng: F(n,M) là giá trị lớn nhất.
Bắt đầu từ ô F(n, M) trên dòng n ta dò ngược về dòng 0 theo nguyên tắc:
• Nếu F(i,L) > F(i–1,L), thì đồ vật thứ i được chọn, ta truy tiếp ô F(i1, Lw(i)).
• Nếu F(i,L) = F(i–1,L), thì đồ vật thứ i không được chọn, ta truy tiếp ô F(i1,L).

 Độ phức tạp
Ký hiệu T(n,M) là độ phức tạp để tính F(n,M) T(n,M)
= O(n.M)
 Ví dụ n = 5;
M = 13
i
w[i]
v[i]

1
3
4

2
4
5

3
5
6

4
2
3

5
1
1

Kết quả tính toán cho ở bảng sau

L
i
0 1 2 3 4 5 6 7 8

9

1
0

11 12 13

Chương III. Kỹ thuật quy hoạch động

III.3

Chương III. Kỹ thuật quy hoạch động

III.3


Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

0

1
2
3
4
5

0
0
0
0

0
0
0
0

0
0
0
0

0
4
4
4

0
4
5
5


0
4
5
6

0
4
5
6

0
4
9
9

0 0
4 4
9 9
1 11
0
0 0 3 4 5 7 8 9 1 12
0
0 1 3 4 5 7 8 9 1 12
0

0
4
9
11


0
4
9
11

0
4
9
15

0
4
9
15

13 14 15 15
13 14 15 16

Truy vết tìm phương án tối ưu

Các đồ vật được chọn là: 5, 3, 2, 1. Giá trị tối ưu F(5,13)=16.
 Thủ tục tạo bảng phương án

void TaoBang(F[0..n][0..M])
{ for (L=0; L <= M; L++) F[0, L] = 0;
for (i = 1; i <= n; i++)
for (L=0; L <= M; L++)
{
F[i, L] = F[i-1, L];

if (w[i] <= L && F[i, L] < F[i-1, L - w[i]] + v[i])
F[i, L] = F[i-1, L - w[i]] + v[i];
}
}

 Thủ tục truy vết
void TruyVet(F[0..n][0..M])

Chương III. Kỹ thuật quy hoạch động

III.4

Chương III. Kỹ thuật quy hoạch động

III.4


Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

{ //Bắt đầu từ ô F[n, M] trên dòng n i
= n; L = M;
for (i = n; i > 0; i--) if
(F[i, L] != F[i-1, L])

{
<Đồ vật thứ i được chọn: x[i]=1>;
L = L – w[i];
}
}

Chương III. Kỹ thuật quy hoạch động

III.5

Chương III. Kỹ thuật quy hoạch động

III.5


Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

2. Bài toán cái túi 0-n
Một tên trộm đột nhập cửa hàng tìm thấy n loại đồ vật có trọng lượng và
giá trị khác nhau. Tên trộm mang theo cái túi có trọng lượng tối đa là M, M
nguyên. Hãy chọn các đồ vật mà tên trộm có thể cho vào túi mang đi sao cho
tổng giá trị là lớn nhất. Mỗi loại đồ vật có thể lấy nhiều cái.
Giải

Ký hiệu w(i) là trọng lượng loại đồ vật i,
i=1..n.
v(i) là giá trị loại đồ vật i, i=1..n.
Mô hình toán học của bài toán là bài toán quy hoạch tuyến tính nguyên: Tìm
vectơ x = [x(1), …, x(n)] thỏa :
f(x) = v(1).x(1)+v(2).x(2)+ … + v(n).x(n) ->max
w(1).x(1)+w(2).x(2)+ … + w(n).x(n) <=M
x(i) >=0 và nguyên, với mọi i=1,…,n
Với các giá trị i và L: i = 0, 1, 2, ..., n và L = 0, 1, 2,..., M. Gọi F(i,L) là tổng giá
trị lớn nhất có thể chọn trong i đồ vật (1, .., i) với trọng lượng tối đa L.
 Lập công thức truy hồi
- Xác định tham số
Bài toán có 2 tham số: số loại đồ vật i=0..n và khối lượng giới hạn L=0..M.
- Công thức:
+ Trường hợp w[i] > L:
F(i, L) = F(i-1, L)
+ Trường hợp w[i] <= L:
Nếu loại đồ vật i không được chọn, thì:
F(i, L) = F(i-1, L)
Nếu có k đồ vật loại i được chọn: (1 <= k <= L/w[i])
F(i, L) = F(i-1, L – w[i]*k) + v[i]*k
Do đó:
Chương III. Kỹ thuật quy hoạch động

III.6

Chương III. Kỹ thuật quy hoạch động

III.6



Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

F(i, L) = max{F(i-1, L – w[i]*k) + v[i]*k | k thuộc [0, L/w[i]]}
Ký hiệu s(i, L), i=1..n, L=1..M, là giá trị k thuộc [0, L/w[i]] làm cho biểu
thức tính max đạt trị lớn nhất.
- Điều kiện đầu
F(0,L) = 0, với mọi L=0..M,
F(i,0) = 0, với mọi i=0..n.
 Tổ chức dữ liệu
- Lập bảng hai chiều F(i,L), s(i,L):
L
i
0

1

2






M

0
1
2
:
n
- Điền giá trị đầu: F(i, L)

Chương III. Kỹ thuật quy hoạch động

III.7

Chương III. Kỹ thuật quy hoạch động

III.7


Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

- Sử dụng công thức truy hồi tính toán F(i,L), s(i,L) theo thứ tự i=1,2,…,n.
 Truy vết tìm phương án tối ưu
Bắt đầu từ ô s(n, M) trên dòng n ta dò ngược về

dòng 1 theo nguyên tắc:
Nếu s(i, L) > 0, thì :

Loại đồ vật i được chọn với số
lượng là s(i, L)

Truy tiếp ô s(i-1, Ls(i,L)*w[i] ).
Nếu s(i, L) = 0, thì :

Loại đồ vật i không được chọn,
– Truy tiếp ô s(i-1, L).
 Độ phức tạp
Ký hiệu T(n,M) là độ phức tạp để tính F(n,M) T(n,M)
= O(n.M2)
 Ví dụ n = 5;
M = 13
i
w[i]
v[i]

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

Kết quả tính toán cho ở các bảng sau
F(i,L)
L
i

0


0 1 2 3 4 5 6 7

8

9

10 11 12 13

0 0 0 0 0 0 0 0

0

0

0

0

0

0

Chương III. Kỹ thuật quy hoạch động

III.8

Chương III. Kỹ thuật quy hoạch động

III.8



Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

1
2
3
4
5

0
0
0
0
0

0
0
0
0
1

0

0
0
3
3

4
4
4
4
4

4
5
5
6
6

4
5
6
7
7

8
8
8
9
9

8

9
9
10
10

8
10
10
12
12

12
12
12
13
13

12
13
13
15
15

12
14
14
16
16

16

16
16
18
18

16
17
17
19
19

s(i,L)
L
i
0 1 2 3 4 5 6 7 8 9
0
1
2
3
4
5

0
0
0
0
0
0

0

0
0
0
0
1

0
0
0
0
1
0

0
1
0
0
0
0

0
1
1
0
2
0

0
1
1

1
1
1

0
2
0
0
1
0

0
2
1
0
2
0

0
2
2
0
4
0

0
3
0
0
3

0

1
0
0
3
1
0
5
0

11 12 13
0
3
2
0
4
0

0
4
0
0
6
0

0
4
1
0

5
0

Truy vết tìm phương án tối ưu

Bắt đầu từ ô s(5,13) = 0, ta có x5 = 0.
Truy ngược lên ô s(5-1,13) = s(4,13) = 5, ta có x4 = 5.

Chương III. Kỹ thuật quy hoạch động

III.9

Chương III. Kỹ thuật quy hoạch động

III.9


Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

Truy ngược lên ô s(4-1,13-5*2) = s(3,3) = 0, ta có x3 = 0.
Truy ngược lên ô s(3-1,3) = s(2,3) = 0, ta có x2 = 0.
Truy ngược lên ô s(2-1,3) = s(1,3) = 1, ta có x1 = 1.
Đến đây ta nhận được phương án tối ưu:

(1, 0, 0, 5, 0) với trị tối ưu F(5,13) = 19.
 Thủ tục tạo bảng phương án
void TaoBangPhuongAn(F[0..n][0..M], s[1..n][1..M])
{ <Điền số 0 cho dòng 0 và cột 0 của bảng F[0..n][0..M]>;
for (i = 1; i <= n; i++)
for (L=1; L <= M; L++)
{ F[i, L] = F[i-1, L];
s[i, L] = 0;
if (L >= w[i])
for(k = 1; k <= L/w[i]; k++)
if (F[i, L] < F[i-1, L - w[i]*k] + v[i]*k)
{ F[i, L] = F[i-1, L - w[i]*k] + v[i]*k;
s[i, L] = k;
}
}
}

 Thủ tục truy vết
void TruyVet(s[1..n][1..M])
{
for (i=1; i<=n; i++)
x[i]=0;
i = n; L = M;
while (i > 0)
{ if (s[i, L] != 0)
{ x[i] = s[i, L];
L = L – s[i, L]*w[i];
}
i = i – 1;
}

}

Chương III. Kỹ thuật quy hoạch động

III.10

Chương III. Kỹ thuật quy hoạch động

III.10


Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

3. Bài toán dãy con chung lớn nhất
Cho X = x1, x2, …, xm và Y = y1, y2, …, yn. Hãy tìm dãy con chung lớn nhất Z
của X và Y, ký hiệu LCS(X,Y).
 Ví dụ

 Lập công thức truy hồi
- Xác định tham số
Bài toán con có 2 tham số (i, j) là các tiền tố x1, x2, …, xi, với i ≤ m và y1, y2,
…, yj, với j ≤ n của 2 dãy X và Y. Có thể phát biểu lại bài toán như sau: Hãy tìm
dãy con chung dài nhất của 2 dãy x1, x2, …, xi và y1, y2, …, yj. - Công thức

+ Với bài toán con (1, 1) nếu x1 = y1 thì độ dài dãy Z là 1, ngược lại là 0.
+ Với bài toán con (i, j) thì:
Nếu xi = yj, thì độ dài dãy Z sẽ là độ dài dãy con chung dài nhất thu được
từ bài toán con (i – 1, j -1) thêm một phần tử chung nữa.

Nếu xi ≠ yj, thì độ dài dãy Z, hoặc là độ dài dãy con chung dài nhất thu
được từ bài toán con (i – 1, j) hoặc là từ bài toán con (i, j - 1), dãy nào dài hơn

Chương III. Kỹ thuật quy hoạch động

III.11

Chương III. Kỹ thuật quy hoạch động

III.11


Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

thì ch

n.


G

i
f
(
i, j
)
là đ

dài t

i ưu c

a bài toán con (
i, j
, ta có công th
)

c sau:
Chương III. Kỹ thuật quy hoạch động

III.12

Chương III. Kỹ thuật quy hoạch động

III.12


Trần Quốc Chiến


Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

Đi

u ki



u
:

f(0,j) = 0, với mọi j=1,…,n & f(i,0) = 0, với mọi i=1,…,m.
 Tổ chức dữ liệu
- Lập bảng hai chiều f(i,j):
j
i
0 1 2 …



n

0
1
2


m
- Điền giá trị đầu

Chương III. Kỹ thuật quy hoạch động

III.13

Chương III. Kỹ thuật quy hoạch động

III.13


Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

j
i
0 1 2 … …n
0
1
2

m


0 0 0 … …0
0
0

0

- Sử dụng công thức truy hồi tính toán f(i,j) theo thứ tự dòng i=1,2,…,m.
 Truy vết tìm phương án tối ưu
Gọi x[1..m], y[1..n] là 2 dãy đầu vào.
Bắt đầu từ ô [m,n] trên dòng m ta dò ngược về dòng 0 hoặc cột 0 theo
nguyên tắc:
Nếu x[i] = y[j], thì phần tử x[i] được chọn, ta truy tiếp ô [i-1,j-1].
Ngược lại, tức x[i]0= y[j], nếu f(i,j) = f(i-1,j), thì truy đến ô [i-1,j], ngược lại,
thì truy đến ô [i,j-1].
 Độ phức tạp
Ký hiệu T(m,n) là độ phức tạp để tính f(m,n) T(m,n) =
O(m.n)
 Ví dụ m =
7; n = 6
i
1
2

Chương III. Kỹ thuật quy hoạch động

III.14

Chương III. Kỹ thuật quy hoạch động


III.14


Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

3
4
5
6
7
X
A
B
C
B
D
A
A
Y
B
D

Chương III. Kỹ thuật quy hoạch động


III.15

Chương III. Kỹ thuật quy hoạch động

III.15


Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

C
A
B
A

Kết quả tính toán cho ở bảng sau
f(i,j)
j
i

0
1
2

3
4
5
6
7

0 1 2 3 4 5

6

0
0
0
0
0
0
0
0

0
1
2
2
3
3
4
4

0
0

1
1
1
1
1
1

0
0
1
1
1
2
2
2

0
0
1
2
2
2
2
2

0
1
1
2
2

2
3
3

0
1
2
2
3
3
3
3

Truy vết tìm phương án tối ưu

Chương III. Kỹ thuật quy hoạch động

III.16

Chương III. Kỹ thuật quy hoạch động

III.16


Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật


Phân tích và thiết kế giải

Các phần tử được chọn là: x[7]=y[6]=A, x[4]=y[5]=B, x[3]=y[3]=C,
x[2]=y[1]=B. Dãy con chung dài nhất là BCBA với độ dài tối ưu f(7,6)=4.
#include <iostream>
#define MAX 100
using namespace std;
int F[MAX][MAX];
string y="ABCA";
string x="BDCA";
main()
{
taobang(x.length(), y.length());
view(x.length(), y.length());
truyvet(x.length(), y.length());
}

 Thủ tục tính giá trị f(i,j)
void createtable(int m,int n)
{
int i, j;
for (i=0;i<= m;i++)
f[i][0] = 0;
for (j=0;j<=n;j++)
f[0][j] = 0;
for (i=0;ifor (j=0;jif (x[i]==y[j])
f[i+1][j+1] = f[i][j] + 1;

else

Chương III. Kỹ thuật quy hoạch động

III.17

Chương III. Kỹ thuật quy hoạch động

III.17


Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

if (f[i][j+1] > f[i+1][j])
f[i+1][j+1] = f[i][j+1];
else
f[i+1][j+1] = f[i+1][j];
}

 Thủ tục truy vết tìm lời giải
void tracking(int m,int n)
{
int row, col, k;

row = m, col = n;
k=f[m][n]; s
while ((row>0)&&(col>0))
{
if (x[row]==y[col])
{
z[k] = x[row];
k--;
row = row - 1;
col = col - 1;
}
else
{
if (f[row][col]==f[row-1][col])
row = row - 1;
else
col = col - 1;
}
}
}

4. Bài toán đổi tiền
Cho số tiền S, và n loại tiền với các mệnh giá a[1], a[2],…, a[n], hãy tìm
phương án đổi số tiền S sao cho số tờ tiền dùng ít nhất.
Ví dụ: n = 3, S = 13
k
1
2
3
a[k]

1
2
5
Số tờ tiền ít nhất là 4: 1 tờ loại 1, 1 tờ loại 2 và 2 tờ loại 3.
 Lập công thức truy hồi

Chương III. Kỹ thuật quy hoạch động

III.18

Chương III. Kỹ thuật quy hoạch động

III.18


Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

- Xác định tham số
Gọi t[i] là số tờ tiền cần dùng ít nhất để đổi số tiền i. Vậy kết quả bài toán
cần tìm là t[S].
Bài toán con t[i] có 1 tham số i = 1, …, S.
Công thức truy hồi
Ta lập công thức tính t[i] theo các giá trị trước nó.

Giả sử i >= a[k] và chọn tờ tiền a[k] để đổi. Khi đó, rõ ràng là
t[i] <= t[i-a[k]]+1.
Suy ra
t[i] = 1 + min{t[i-a[k]] | k=1, …, n & i >=a[k]}
- Giá trị đầu: Hiển nhiên t[0] = 0.
Ngoài ra, nếu không đổi được số tiền i, thì t[i] = vô cùng.
• Tổ chức dữ liệu
Ngoài mảng t[i], ta cần mảng u[i] để lưu loại tiền được chọn khi tính min ở
công thức tính t[i]. Mảng u[i] sẽ dùng để truy vết tìm phương án đổi tiền.
- Lập bảng kép 1 chiều t[i] và u[i], i=0, 1, …,S:
i
t
u

0

1

2





S1

S-1

S


- Điền giá trị đầu
i

0

t
u

0

1

2

S

- Sử dụng công thức truy hồi tính toán t[i] và u[i] theo thứ tự i=1,2,…,S.
• Truy vết tìm phương án tối ưu

Chương III. Kỹ thuật quy hoạch động

III.19

Chương III. Kỹ thuật quy hoạch động

III.19


Trần Quốc Chiến


Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

Bắt đầu từ ô u[S] ta dò ngược về u[0] theo nguyên tắc:
Nếu u[i] = k, thì tờ tiền a[k] được chọn, ta truy tiếp ô u[ia[k]].
 Độ phức tạp
Ký hiệu T(n,S) là độ phức tạp để tinh t[S]. T(n,S) =
O(n.S)
 Ví dụ: n = 3, S = 13
k
a[k]

1
1

Kết quả tính toán cho ở bảng sau
i 0 1 2 3 4 5 6 7
t
u

0

1
1

1

2

2
1

2
2

1
3

2
1

2
2

2
2

3
5

8

9

3
1


3
2

1
0
2
3

11 12 13
3
1

3
2

4
1

Truy vết tìm phương án tối ưu

Kết quả: Số tờ tiền ít nhất là t[13] = 4: 1 tờ loại 1, 1 tờ loại 2 và 2 tờ loại 3.
• Thủ tục tính mảng t[i] và u[i], i=1..S.
void sapxep(int n)
{
for(int i=0;ifor(int j=i+1;j{
Chương III. Kỹ thuật quy hoạch động

III.20


Chương III. Kỹ thuật quy hoạch động

III.20


Trần Quốc Chiến

Phân tích và thiết kế giải thuật

Trần Quốc Chiến
thuật

Phân tích và thiết kế giải

int m=a[i];
int n=a[j];
if(m}
}
void money_change()
{
t[0] = 0 ;
for(i=1 ; i<=S ; i++)
{t[i] = +vôcug ; u[i] = 0 ;}
//t[i] = 1 + min{t[i-a[k]] | k=1, …, n & i>=a[k]}
for(i=1 ; i<=S ; i++ )
for(k=1 ;k<=n ;k++)
if ((i >= a[k]) && (1+t[i-a[k]) < t[i]))
{t[i] = 1+t[i-a[k] ; u[i] = k ;} }


• Thủ tục truy vết
void truy_vet()
{
if (t(S)!=vôcùng)
{
i=S;
while (i>0)
{
k = u[i];
<to tien k duoc chon:count[k]++>;
i = i – a[k];
}
}
}

Chương III. Kỹ thuật quy hoạch động

III.21

Chương III. Kỹ thuật quy hoạch động

III.21



×