Professional Documents
Culture Documents
CHƯƠNG 5
BÀI TOÁN TỐI ƯU
1
NỘI DUNG BÀI HỌC
5.4 Bài toán lập lịch và gia công trên hai máy
Sau khi học xong bài này, các bạn sẽ nắm được các vấn
đề sau:
- Nắm vững được lí thuyết về bài toán tối ưu
- Các phương pháp để giải bài toán tối ưu
- Áp dụng các phương pháp để giải bài tập về bài toán tối
ưu
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à wj
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?
Trên cơ sở các thuật toán liệt kê tổ hợp tiến hành duyệt từng
phương án của bài toán
Đối với mỗi phương án tính giá trị hàm mục tiêu tại nó, sau đó
so sánh giá trị hàm mục tiêu tại tất cả các phương án được liệt
kê để tìm ra phương án tối ưu.
Phương pháp xây dựng theo nguyên tắc như vậy có tên gọi là
phương pháp duyệt toàn bộ
c j ,
wj, b là các số nguyên dương, j=1,2,…, n.
Cần có thuật toán liệt kê các phần tử của D
5.3.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.
Nhận thấy rằng, các bài toán vừa trình bày ở mục 1 đều có thể mô
tả dưới dạng bài toán trên.
Yêu cầu về mô tả của tập D là để có thể sử dụng thuật toán quay lui
để liệt kê các phương án của bài toán.
Bài toán
max {f(x): x D}
là tương đương với bài toán
min {g(x): x D}, trong đó g(x) = -f(x)
Do đó ta có thể hạn chế ở việc xét bài toán min.
Quá trình phân nhánh được thực hiện nhờ thuật toán quay
lui: () D
1 n1
a
1 a 2
1 ... a 1
Như vậy ta có thể đặt tương ứng mỗi phương án bộ phận (a1, a2, ...,
ak) với một tập con các phương án của bài toán:
D(a1,..., ak)= { xD: xi = ai , i = 1,..., k }.
Ở bước tổng quát của thuật toán quay lui ta sẽ làm việc với phương
án bộ phận (a1, a2, ..., ak) và xét các cách tiếp tục phát triển phương
án này.
Điều đó tương đương với việc phân hoạch tập D ra thành các tập
con nhỏ hơn.
1
a
k 1
2
a
k 1 ... akp1
D(a1 ,..., ak , a1k 1 )
Ta có phân hoạch: p
D(a1 ,..., ak ) U D (a1 ,..., ak , aki 1 )
i 1
Bất đẳng thức (*) có nghĩa là giá trị của hàm g tại phương
án bộ phận (a1, a2, ..., ak) là không vượt quá giá trị nhỏ nhất
của hàm mục tiêu của bài toán trên tập con các phương án
D(a1,..., ak)= { xD: xi = ai , i = 1,..., k },
Hay nói một cách khác, g(a1, a2, . . . , ak) là cận dưới của giá
trị hàm mục tiêu trên tập D(a1, a2, ..., ak).
Và lúc đó, hàm g được gọi là hàm cận dưới, và giá trị g(a1,
a2, . . . , ak) được gọi là cận dưới của tập D(a1, a2, ..., ak).
Do có thể đồng nhất tập D(a1,..., ak) với phương án bộ phận
(a1,..., ak), nên ta cũng gọi giá trị g(a1,..., ak) là cận dưới của
phương án bộ phận (a1,..., ak).
Giả sử đã có hàm g. Ta xét cách sử dụng hàm này để giảm bớt khối
lượng duyệt trong quá trình duyệt tất cả các phương án theo thuật toán
quay lui.
Trong quá trình liệt kê các phương án có thể đã thu được một số phương
án của bài toán. Gọi x là phương án với giá trị hàm mục tiêu nhỏ nhất
trong số các phương án đã tìm được, ký hiệuf = f(x ).
Ta sẽ gọi
x là phương án tốt nhất hiện có,
còn f là kỷ lục.
void Branch(k)
(* Phát triển phương án bộ phận (x1, x2, ..., xk-1) *)
{
for (akAk )
if (akSk )
{
xk := ak;
if (k = n) < Cập nhật kỷ lục>
else
if g(x1,..., xk) f Branch(k+1)
}
}
void BranchAndBound()
{
f := +;
(* Nếu biết p/ánx nào đó thì đặtf = f(x ) *)
Branch(1);
if (f < +)
<f là giá trị tối ưu,x là p/án tối ưu >
else < bài toán không có phương án >;
}
Chú ý rằng nếu trong thủ tục Branch ta thay câu lệnh
if (k = n) < Cập nhật kỷ lục>
else
if (g(a1,..., ak) f ) Branch(k+1)
bởi
if (k = n) < Cập nhật kỷ lục>
else Branch(k+1)
thỡ ta thu được thuật toán duyệt toàn bộ.
Việc xây dựng hàm g phụ thuộc vào từng bài toán tối ưu tổ hợp cụ
thể. Thông thường ta cố gắng xây dựng nó sao cho:
Việc tính giá trị của g phải đơn giản hơn việc giải bài toán tối ưu tổ
hợp ở vế phải của (*).
Giá trị của g(a1,..., ak) phải sát với giá trị của vế phải của (*).
Rất tiếc là hai yêu cầu này trong thực tế thường đối lập nhau.
Có n loại đồ vật.
Đồ vật loại j có
trọng lượng wj 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.
j 1 j 1
• Để 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* = c1b /a1.
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.
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.
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.
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) = 10x1 + 5x2 + 3x3 + 6x4 max,
5x1 + 3x2 + 2x3 + 4x4 8,
xj Z+ , j =1, 2, 3, 4.
Á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. 9x1 + x2 + 5x3 + x4 -> max
7x1 + 2x2 + 4x3 + x4 ≤ 8
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.
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).
Giải bài toán người du lịch với ma trận chi phí sau:
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
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.
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
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 ∞
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
Toán rời rạc Chương 5: Bài toán tối ưu 49
Giải bài toán cái túi sau:
7 x1 + 3x2 + 2x3 + x4 -> max,
5x1 + 3x2 + 6 x3 + 4 x4 <= 12,
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)
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:
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
• Tên bài: Các khái niệm cơ bản của thuật toán Đồ thị
• Các nội dung cần chuẩn bị:
• Khái niệm và các thuật ngữ cơ bản về đồ thị;
• Đường đi, chu trình, đồ thị liên thông
• Một số dạng đồ thị đặc biệt
• Biểu diễn đồ thị trên máy tính
59