You are on page 1of 63

P1- LÝ THUYẾT TỔ slogan

“ Add your company HỢP ”

CHƯƠNG 5.
BÀI TOÁN TỐI ƯU

LOGO
1
5.1. Giới thiệu bài toán
 Bài toán yêu cầu lựa chọn trong số các
cấu hình tổ hợp chấp nhận được một
cấu hình có giá trị sử dụng tốt nhất.
Các bài toán như vậy chúng ta sẽ gọi là
bài toán tối ưu tổ hợp.
 1. Bài toán tổng quát
 2. Bài toán người du lịch
 3. Bài toán cái túi
 4. Bài toán lập lịch gia công trên 2 máy
2
5.1. Giới thiệu bài toán
 Dạng tổng quát bài toán tối ưu tổ
hợp có thể phát biểu như sau:
Tìm cực tiểu (hay cực đại) của hàm
f(x) = min (max)
với điều kiện: x  D
(trong đó D là tập hữu hạn các phần
tử).

3
Các thuật ngữ
 f(x) - hàm mục tiêu của bài toán,
 D - tập các phương án của bài toán.
 x  D - phương án
 Thông thường tập D được mô tả như là
tập các cấu hình tổ hợp thoả mãn một số
tính chất cho trước nào đó.
 Phương án x*  D đem lại giá trị nhỏ nhất
(lớn nhất) cho hàm mục tiêu được gọi là
phương án tối ưu, khi đó giá trị f* = f(x*)
được gọi là giá trị tối ưu của bài toán.
4
1. Bài toán người du lịch- TSP
(Traveling Salesman Problem – TSP)
 Một người du lịch muốn đi tham quan n
thành phố T1, T2, ..., Tn.
 Hành trình là cách đi xuất phát từ một thành
phố nào đó đi qua tất cả các thành phố còn
lại, mỗi thành phố đúng một lần, rồi quay trở
lại thành phố xuất phát.
 Biết cij là chi phí đi từ thành phố Ti đến thành
phố Tj (i, j = 1, 2,..., n),
 Tìm hành trình với tổng chi phí là nhỏ nhất.
5
2. Bài toán cái túi (Knapsack Problem)

 Một nhà thám hiểm cần đem theo một cái túi
có trọng lượng không quá b.
 Có n đồ vật có thể đem theo. Đồ vật thứ j
có:
 Trọng lượng là aj
 Giá trị sử dụng là cj (j = 1, 2,..., n).
 Hỏi rằng nhà thám hiểm cần đem theo các
đồ vật nào để cho tổng giá trị sử dụng của
các đồ vật đem theo là lớn nhất?
6
Bài toán cái túi
Một phương án đem đồ của nhà thám hiểm có
thể biểu diễn bởi vector nhị phân độ dài n:
x = (x1, x2,..., xn),
Trong đó xj =1 nếu đồ vật thứ j được đem theo
và xj = 0 nếu trái lại.
Với phương án x, giá trị đồ vật đem theo là
n
f ( x)   c j x j ,
j 1

tổng trọng lượng đồ vật đem theo là


n
g ( x)   a j x j
j 1
7
Bài toán cái túi

 Bài toán cái túi có thể phát biểu dưới


dạng bài toán tối ưu tổ hợp sau:
 Trong số các vector nhị phân độ dài n
thoả mãn điều kiện g(x)  b, hãy tìm
vectơ x* cho giá trị lớn nhất của hàm
mục tiêu f(x):
max { f(x): xBn, g(x)  b }.

8
5.2. THUẬT TOÁN NHÁNH CẬN

1. Bài toán cái túi


2. Bài toán người du lịch
3. Bài toán lập lịch gia công trên 2 máy

9
1. Sơ đồ chung
 Thuật toán bao gồm hai thủ tục:
 Phân nhánh (Branching Procedure)
 Tính cận (Bounding Procedure)
 Phân nhánh: Quá trình phân hoạch tập các
phương án ra thành các tập con với kích thước
càng ngày càng nhỏ cho đến khi thu được phân
hoạch tập các phương án ra thành các tập con
một phần tử
 Tính cận: Cần đưa ra cách tính cận cho giá trị
hàm mục tiêu của bài toán trên mỗi tập con A
trong phân hoạch của tập các phương án.
10
1. Bài toán cái túi

 Có n loại đồ vật.
 Đồ vật loại j có
 trọng lượng aj và
 giá trị sử dụng là cj (j = 1, 2,..., n) .
 Cần chất các đồ vật này vào một cái túi có
trọng lượng là b sao cho tổng giá trị sử
dụng của các đồ vật chất trong túi là lớn
nhất.

20
Bài toán cái túi (KP)

 Đưa vào biến số


xj – số lượng đồ vật loại j được chất vào túi,
j=1,2, ..., n
 Mô hình toán học của bài toán có dạng
sau: Tìm
n n
f *  max { f ( x)   c j x j :  a j x j  b, x j  Z  , j  1, 2,..., n }
j 1 j 1

trong đó Z+ là tập các số nguyên không âm.

21
Bài toán cái túi (KP)

 Ký hiệu D là tập các phương án của bài


toán:
n
D  {x  ( x1 ,..., xn ) :  a j x j  b, x j  Z  , j  1, 2,..., n }
j 1

 Giả thiết rằng các đồ vật được đánh số


sao cho bất đẳng thức sau được thoả mãn

c1 /a1  c2 / a2  . . .  cn / an
(có nghĩa là các đồ vật được xếp theo thứ tự
không tăng của giá trị một đơn vị trọng lượng)
Xây dựng hàm cận trên
 Để xây dựng hàm tính cận trên, cùng với bài
toán cái túi ta xét bài toán cái túi biến liên tục
(KPC) sau đây: Tìm
n n
g  max { f ( x)   c j x j :  a j x j  b, x j  0, j  1, 2,..., n }
*

j 1 j 1

 Mệnh đề: Phương án tối ưu của bài toán KPC


là vectơx = (x1 ,x2 , ...,xn ) với các thành
phần được xác định bởi công thức:
x1 = b / a1 , x2 = x3 = . . . = xn = 0.
và giá trị tối ưu là g* = c1*b /a1.
23
Tính cận trên

 Vậy: ta có thể tính cận trên cho phương án


bộ phận (u1, u2, ..., uk) bởi công thức
g(u1, u2,..., uk) = k + ck+1 / ak+1 * bk

 Chú ý: Khi tiếp tục xây dựng thành phần thứ k+1
của lời giải, các ứng cử viên cho xk+1 sẽ là 0, 1, ...,
[bk / ak+1 ].
 Do có kết quả của mệnh đề, khi chọn giá trị cho
xk+1 ta sẽ duyệt các ứng cử viên theo thứ tự giảm
dần.
24
Tính cận trên
 Ta có
max{ f ( x) : x  D, x j  u j , j  1, 2,..., k}
n n
 max { k  cx :ax
j  k 1
j j
j  k 1
j j  bk , x j  Z  , j  k  1, k  2,..., n}

n n
  k  max {  c j x j :  a j x j  bk , x j  0, j  k  1, k  2,..., n}
j  k 1 j  k 1

  k  ck 1bk / ak 1.
 Vậy ta có thể tính cận trên cho phương án
bộ phận (u1, u2, ..., uk) bởi công thức
g(u1, u2,..., uk) = k + ck+1 bk / ak+1.
25
Bài toán cái túi

 Chú ý: Khi tiếp tục xây dựng thành phần


thứ k+1 của lời giải, các ứng cử viên cho
xk+1 sẽ là 0, 1, ..., [bk / ak+1 ].
 Do có kết quả của mệnh đề, khi chọn giá
trị cho xk+1 ta sẽ duyệt các ứng cử viên
theo thứ tự giảm dần.

26
Lưu ý khi giải bài toán cái túi:

Yêu cầu: c1 /a1  c2 / a2  . . .  cn / an


- : giá trị các đồ vật đang chất trong túi
- w: trọng lượng còn lại của túi
- g: cận trên. gk = k + ck+1 / ak+1 * wk
- Chú ý: Khi tiếp tục xây dựng thành phần thứ
k+1 của lời giải, các ứng cử viên cho xk+1 sẽ
là 0, 1, ..., [bk / ak+1 ].

27
Ví dụ

 Giải bài toán cái túi sau theo thuật toán


nhánh cận vừa trình bày
f(x) = 5x1 + 10x2 + 3x3 + 6x4  max,
3x1 + 5x2 + 2x3 + 4x4  8,
xj  Z+ , j =1, 2, 3, 4.

 Sắp xếp theo chiều giảm dần:


c1 /a1  c2 / a2  . . .  cn / an
5/3>= 10/5 >= 3/2 >=6/4
28
Ví dụ

 Sau khi sắp xếp:


f(x) = 10x1 + 5x2 + 3x3 + 6x4  max,
5x1 + 3x2 + 2x3 + 4x4  8,
xj  Z+ , j =1, 2, 3, 4.

 Sắp xếp theo chiều giảm dần:


c1 /a1  c2 / a2  . . .  cn / an
5/3>= 10/5 >= 3/2 >=6/4

29
f(x) = 10x1 + 5x2 + 3x3 + 6x4  max,
5x1 + 3x2 + 2x3 + 4x4  8,
xj  Z+ , j =1, 2, 3, 4.
Tính:
x1 = Giá trị túi chứa được / trọng lượng x1
= b/a1
= 8/5 ~ 1, 0 (Túi có thể chứa 0, hoặc 1 đồ)
Với x1 =1
 = 10
w = 8-5*1= 3 ( Vì túi có 1 đồ x1)
g = k + ck+1 / ak+1 * wk = 10 + 5/3 *3 = 15 30
f(x) = 10x1 + 5x2 + 3x3 + 6x4  max,
5x1 + 3x2 + 2x3 + 4x4  8,
xj  Z+ , j =1, 2, 3, 4.
x1 = Giá trị túi chứa được / trọng lượng x1
= b/a1
= 8/5 ~ 1, 0 (Túi có thể chứa 0, hoặc 1 đồ)
Với x1 =0
=0
w = 8 ( Vì túi có 0 đồ x1)
g = k + ck+1 / ak+1 * wk = 0 + 5/3 *8 = 40/3
31
32
f(x) = 10x1 + 5x2 + 3x3 + 6x4  max,
5x1 + 3x2 + 2x3 + 4x4  8,
xj  Z+ , j =1, 2, 3, 4.
 Tính x2
x2= wk /a2 = 3/3 ~ 1,0
Với x2 =1
 = 15
w = 0 ( Vì túi có 1 đồ x1, 1 đồ x2)
g = k + ck+1 / ak+1 * wk = 15 + 3/2 *0 = 15

33
f(x) = 10x1 + 5x2 + 3x3 + 6x4  max,
5x1 + 3x2 + 2x3 + 4x4  8,
xj  Z+ , j =1, 2, 3, 4.
 Tính x2
x2= wk /a2 = 3/3 ~ 1,0
Với x2 =0
 = 10
w = 3 ( Vì túi có 1 đồ x1)
g = k + ck+1 / ak+1 * wk = 10 + 3/2 *3 = 14.5
=> loại vì g=14.5 <kỷ lục (15)
34
f(x) = 10 x1 + 5 x2 + 3 x3 + 6 x4  max,
5 x1 + 3 x2 + 2 x3 + 4 x4  8,
xj  Z+ , j =1, 2, 3, 4.

35
f(x) = 10x1 + 5x2 + 3x3 + 6x4  max,
5x1 + 3x2 + 2x3 + 4x4  8,
xj  Z+ , j =1, 2, 3, 4.
 Tính x3
x3= wk /a3 = 0/2 ~ 0
Với x3 =0
 = 15
w = 0 ( Vì túi có 1 đồ x1, 1 đồ x2, 0 đồ x3)
g = k + ck+1 / ak+1 * wk = 15 + 6/4 *0 = 15

36
37
f(x) = 10x1 + 5x2 + 3x3 + 6x4  max,
5x1 + 3x2 + 2x3 + 4x4  8,
xj  Z+ , j =1, 2, 3, 4.
 Tính x4
x4= wk /a4 = 0/4 ~ 0
Với x4 =0
 = 15
w = 0 ( Vì túi có 1 đồ x1, 1 đồ x2, 0 đồ x3, 0 đồ x4)
g = k + ck+1 / ak+1 * wk = 15

38
gk = k + ck+1 / ak+1 * wk
f(x) = 10 x1 + 5 x2 + 3 x3 + 6 x4  max,
5 x1 + 3 x2 + 2 x3 + 4 x4  8,
xj  Z+ , j =1, 2, 3, 4.

39
 Kết thúc thuật toán, ta thu được:
 Phương án tối ưu: x* = (1, 1, 0, 0),
 Giá trị tối ưu: f* = 15.

40
Bài tập

 Áp dụng thuật toán nhánh cận để giải bài


toán cái túi sau đây, chỉ rõ kết quả mỗi
bước:
 1. 5x1 + x2 + 4x3 + 6x4 -> max
4x1 + 2x2 + 3x3 + 3x4 ≤ 10

 2. 9x1 + x2 + 5x3 + x4 -> max


7x1 + 2x2 + 4x3 + x4 ≤ 8

41
 3. 7x1 + 3x2 + 2x3 + x4 -> max
5x1 + 3x2 + 6x3 + 4x4 ≤ 10

42
2. Bài toán người du lịch

 Cố định thành phố xuất phát là T1, bài toán


người du lịch dẫn về bài toán:
 Tìm cực tiểu của hàm
f(1,x2,..., xn) =
c[1,x2]+c[x2,x3]+...+ c[xn,1]  min
 với điều kiện (1, x2, x3, ..., xn) là hoán vị của
các số 1,2, ..., n.

43
Hàm cận dưới

 Ký hiệu
cmin = min { c[i, j ]; i, j = 1, 2, ..., n, i  j }
là chi phí đi lại nhỏ nhất giữa các thành phố.
 Cần đánh giá cận dưới cho phương án bộ
phận (1, u2, ..., uk) tương ứng với hành trình
bộ phận qua k thành phố:
T1  T(u2)  . . .  T(uk-1)  T(uk).

44
Hàm cận dưới

 Chi phí phải trả theo hành trình bộ phận


này là
 = c[1,u2] + c[u2, u3] + ... + c[uk-1, uk]
 Để phát triển thành hành trình đầy đủ, ta
còn phải đi qua n-k+1 đoạn đường nữa,
mỗi đoạn có chi phí không ít hơn cmin, nên
cận dưới cho phương án bộ phận (1, u2,
..., uk) có thể tính theo công thức
g(1, u2, ..., uk) =  + (n-k+1) *cmin
45
Ví dụ

 Giải bài toán người du lịch với ma trận chi


phí sau:
∞ 3 14 18 15
3 ∞ 4 22 20
C= 17 9 ∞ 16 4
9 20 7 ∞ 18
9 15 11 5 ∞

46
 Ta có cmin = 3. Quá trình thực hiện thuật
toán được mô tả bởi cây tìm kiếm lời giải.
 Thông tin được ghi trong các ô trên hình
vẽ theo thứ tự sau:
 các thành phần của phương án,
  là chi phí theo hành trình bộ phận
 g - cận dưới.
g(1, u2, ..., uk) =  + (n-k+1) *cmin

47
G =  + (n-k+1) *cmin
= 3 + (5-2+1)*3= 15
0 3 14 18 15
G =14 + (5 -2+1)*3= 26 3 0 4 22 20
C = 17 9 0 16 4
G =18 + (5 -2+1)*3= 30 9 20 7 0 18
9 15 11 5 0
G =15 + (5 -2+1)*3= 27

48
 = 3+ 4 =7
G =  + (n-k+1) *cmin
= 7 + (5-3+1)*3= 16

 = 25 0 3 14 18 15
3 0 4 22 20
G = 25 + (5 -3+1)*3= 34
C = 17 9 0 16 4
 = 23 9 20 7 0 18
G= 23 + (5 -3+1)*3= 32 9 15 11 5 0
49
 = 7 + 16 = 23 0 3 14 18 15
G =  + (n-k+1) *cmin 3 0 4 22 20
= 23 + (5-4+1)*3= 29 C = 17 9 0 16 4
 = 7+ 4 =11 9 20 7 0 18
G= 11 + (5 -4+1)*3= 17 9 15 11 5 0
50
0 3 14 18 15
3 0 4 22 20
C = 17 9 0 16 4
9 20 7 0 18
9 15 11 5 0

51
Kết quả

 Kết thúc thuật toán, ta thu được phương


án tối ưu (1, 2, 3, 5, 4, 1) tương ứng với
hành trình
T1  T2  T3  T5  T4  T1 ,
 Chi phí nhỏ nhất là 25.

52
Phương pháp rút gọn ma trận

 Các bước thực hiện rút gọn ma trận chi


phí trong giải bài toán người du lịch
 Bước 1: Trừ mỗi phần tử của các dòng
cho các hằng số nhỏ nhất trong từng dòng
đó.
 Bước 2: Ma trận mới thu được lại tiếp tục
trừ các phần tử của các cột cho hằng số
nhỏ nhất trong từng cột.

53
Phương pháp rút gọn ma trận
 Bước 3: Tính tổng các hằng số rút gọn ở
trên. Ta thu được cận dưới cho tất cả các
hành trình
 Bước 4: Phân tập các phương án của bài
toán bằng phương án phân nhánh.
 Chọn cạnh phân nhánh bằng cách tìm số 0
nào trong ma trận mà khi thay nó bởi ∞ sẽ
cho ta tổng hằng số rút gọn theo dòng và cột
chứa nó là lớn nhất.
 Ma trận sau đó thu được sẽ rút gọn đi một
bậc
54
Phương pháp rút gọn ma trận

 Bước 5: Sau khi chọn được cạnh theo yêu


cầu như ở bước trên. Cần kiểm tra tập
các cạnh thu được để không tạo thành
hành trình con
 Bước 6: Thuật toán sẽ dừng khi thu được
ma trận có dạng sau:
0 ∞ hoặc ∞ 0
∞ 0 0 ∞

55
Giải bài toán người du lịch với phương
pháp rút gọn ma trận chi phí sau:
∞ 5 9 20
7 ∞ 10 12
15 8 ∞ 21
5 10 27 ∞

56
1 2 3 4
Min
1 ∞ 5 9 20 5
2 7 ∞ 10 12 7
3 15 8 ∞ 21 8
4 5 10 27 ∞ 5

∞ 0 4 15
Rút gọn ma trận chi
phí theo hàng sau: 0 ∞ 3 5
7 0 ∞ 13
0 5 22 ∞
57
∞ 0 4 15
0 ∞ 3 5
7 0 ∞ 13
0 5 22 ∞
Min 0 0 3 5
∞ 0 1 10
Rút gọn ma trận chi
phí theo cột sau: 0 ∞ 0 0
7 0 ∞ 8
G = 5+7+8+5+0+0+3+5 = 33 0 5 19 ∞
58
1 2 3 4
1 ∞ 0 (1) 1 10
2 0 (0) ∞ 0 (1) 0 (8)
3 7 0 (7) ∞ 8
4 0 (5) 5 19 ∞

Chọn vị trí số 0 (2,4) vì có giá trị cao nhất.


Ta có hành trình mới: (2,4) ; G= 33
(4,2) -> ∞

59
Rút gọn ta được ma trận cấp 3
1 2 3
∞ 0 1
1
3 7 0 ∞
4 0 ∞ 19
Min 0 0 0

Rút gọn ma trận chi 1 2 3


phí theo cột ta có:
1 ∞ 0 0
G = 33+ 1= 34
3 7 0 ∞
4 0 ∞ 18
60
1 2 3
1 ∞ 0 (0) 0(18)
3 7 0 (7) ∞
4 0 (25) ∞ 18

Chọn vị trí số 0 (4,1) vì có giá trị cao nhất.


Ta có hành trình mới: (2,4) , (4,1) ; G= 34
(1,4) -> ∞

61
Rút gọn ta được ma trận cấp 2

2 3
1 0 0
3 0 ∞

Ta có hai hành trình mới: (3,2), (1,3)


Hành trình tổng quát: (2,4) , (4,1), (3,2), (1,3)
Sắp xếp hành trình đầy đủ: (1,3,2,4,1) ; G = 34

62
Ví dụ

 Giải bài toán người du lịch với phương


pháp rút gọn ma trận chi phí sau:
.

 25 45 14 32 24 
 
 9  16 2 34 23 
 22 11  33 7 0
 
 23 14 27  20 21 
14 44 29 46  3 

 25  
 3 4 7 8
63
 Giải bài toán cái túi sau:
7 x1 + 3x2 + 2x3 + x4 -> max,
5x1 + 3x2 + 6 x3 + 4 x4 <= 12,

64
3. Bài toán lập lịch gia công trên 2 máy

Xét bài toán:


 Mỗi một chi tiết trong số n chi tiết D1, D2, …, Dn
cần phải được lần lượt gia công trên 2 máy
A&B.
 Thời gian gia công chi tiết Di trên máy A là ai,
trên máy B là bi (i = 1, 2, …, n)
 Hãy tìm lịch (trình tự gia công) các chi tiết trên
2 máy sao cho việc hoàn thành gia công tất cả
các chi tiết sớm nhất có thể được?

65
Thuật toán Johnson

Bước1: Chia các chi tiết thành 2 nhóm:

 N1 gồm các chi tiết Di thỏa mãn ai < bi


 N2 gồm các chi tiết Di thỏa mãn ai > bi
 Các chi tiết Di thỏa mãn ai = bi xếp vào
nhóm nào cũng được
Chi tiết
D1 D2 D3 D4 D5
Máy
A 3 4 6 5 6
B 3 3 2 7 3 66
Thuật toán Johnson

Bước 2: Sắp xếp các chi tiết:


 N1 theo chiều tăng của các ai
 N2 theo chiều giảm của các bi

Bước 3: Nối N2 vào đuôi N1. Dãy thu được


sẽ là lịch gia công tối ưu (đọc từ trái sang
phải)

67
Ví dụ

 Xét bài toán lập lịch khi n = 5. Thời gian


gia công chi tiết trên các máy được cho
trong bảng sau:

Chi tiết
D1 D2 D3 D4 D5
Máy
A 3 4 6 5 6
B 3 3 2 7 3

68
Ví dụ

 Chia nhóm:
 N1 = {D1, D4}
 N2 = {D2, D3, D5}
 Sắp xếp:
 N1 = {D1, D4}
 N2 = {D2, D5, D3}
 Nối N2 vào đuôi N1, ta được lịch gia công
tối ưu:
= (D1, D4, D2, D5, D3)
với thời gian T() = 26
69
Sơ đồ Gantt cho lịch gia công chi tiết
Máy

B D1 D4 D2 D5 D3

A D1 D4 D2 D5 D3

Chi tiết
D1 D2 D3 D4 D5
Máy
A 3 4 6 5 6
B 3 3 2 7 3
70
Bài tập

Chi tiết
D1 D2 D3 D4 D5
Máy

A 8 5 6 7 2

B 5 7 5 8 4

71
Questions?

72

You might also like