Sơ đồ các tuyến đường giao thông từ nhà máy đến nhà kho Giải bài toán Cách 1: Giải bằng cách vẽ hình Quan sát Hình 0.1, chúng ta thấy rằng nút nằm gần nút gốc nút 1-nhà máy sản xuất nh
Trang 1CHƯƠNG 5 BÀI TOÁN ĐƯỜNG ĐI VÀ BÀI TOÁN PHÂN CÔNG
5.1 Bài toán tìm đường đi ngắn nhất
5.1.1 Giới thiệu bài toán
Bài toán tìm đường đi ngắn nhất là bài toán tìm lô ̣ trình di chuyển (của người, xe máy hay
hàng hóa) từ mô ̣t đi ̣a điểm này đến mô ̣t đi ̣a điểm khác trên hê ̣ thống nhiều đường giao thông có sẵn sao cho tổng chiều dài đường đi là ngắn nhất Nói cách khác, nó tìm đường đi ngắn nhất xuất phát từ mô ̣t điểm nguồn ban đầu đến mô ̣t chuỗi các điểm đích khác nhau Ví du ̣ như:
+ Tìm đường đi ngắn nhất từ nhà máy cung cấp bê tông tươi đến các công trường xây dựng + Tìm đường đi ngắn nhất để vâ ̣n chuyển công nhân, máy móc thiết bi ̣ từ công ty xây dựng đến các công trường xây dựng
+ Tìm đường đi nhắn nhất từ mô ̣t thành phố này đến mô ̣t thành phố khác trên hê ̣ thống đường giao thông
+ Tìm đường đi ngắn nhất từ nhà máy sản xuất đến nhà kho chứa hàng
+ Tìm đường đi ngắn nhất (thời gian ít nhất) từ nhà máy sản xuất đến nơi tiêu thu ̣ sản phẩm Thế vị của 1 nút: là khoảng cách bé nhất từ nút đầu (Nút 1) đến nút đó
Trong đó: j min i ij
i
u u d
uj - Khoảng cách ngắn nhất từ nút 1 đến nút j với u1 = 0
ui - Khoảng cách ngắn nhất từ nút 1 đến nút i
dij - Khoảng cách giữa nút j và nút i trước nó
5.1.2 Phương pháp giải
5.1.2.1 Phương pháp giải thuật tiến
Bước 1: Tìm nút nằm gần nút gốc (nút xuất phát/ nút nguồn) nhất Ghi giá tri ̣ (khoảng cách,
thờ i gian, chi phí) từ nút xuất phát đến nút gần nhất đó Lă ̣p la ̣i bước này với n = 1, 2, 3… cho đến khi nút thứ n nằm gần nhất là nút đích
Bước 2: Thành lâ ̣p tâ ̣p nút đã khảo sát gồm nút gốc và nút gần nút gốc nhất đã xác đi ̣nh ở bước
1
Bước 3: Xác đi ̣nh tất cả các nút chưa khảo sát nằm gần tâ ̣p nút đã khảo sát
Tập nút đã khảo sát được nối trực tiếp đến 1 hoă ̣c nhiều nút chưa khảo sát nào đó sẽ cung cấp
1 ứ ng viên cho nút gần nhất thứ n
Bước 4: tìm nút nằm gần tâ ̣p nút đã khảo sát, và ghi khoảng cách ngắn nhất đến nút này từ nút
gố c (giá tri ̣ này go ̣i là thế vi ̣ của gốc)
Lưu ý: với mỗi nút đã khảo sát và các ứng viên của nó, cô ̣ng khoảng cách giữa chúng và
Trang 2khoảng cách ngắn nhất từ nút gốc đến nút đã khảo sát đó Nút nào có khoảng cách ngắn nhất sẽ
là nút gần nhất thứ n và tuyến đường ngắn nhất sẽ là tuyến đường ta ̣o ra khoảng cách này
Bước 5: lă ̣p la ̣i bước 3 và bước 4
+ Tiếp tục lă ̣p la ̣i quá trình xác đi ̣nh thế vi ̣ của các nút trong ma ̣ng (bằng cách cô ̣ng thế vi ̣ của
nú t gần nhất và khoảng cách giữa 2 nút) theo công thức: j min i ij
i
u u d
+ Giá tri ̣ thế vi ̣ ghi ở nút cuối cùng chính là khoảng cách ngắn nhất từ nút xuất phát đến nút cuối
cù ng
Ví dụ minh họa: Công ty sản xuất nội thất
Hàng ngày công ty phải vận chuyển các sản phẩm nội thất (bàn, ghế, tủ, …) từ nhà máy sản xuất đến nhà kho chứa hàng Giám đốc công ty, muốn tìm đường đi ngắn nhất từ nhà máy sản xuất (nút 1) đến nhà kho (nút 6) Cho biết sơ đồ mạng lưới đường giao thông được thể hiện như trong hình dưới (với chiều dài tuyến đường tính theo đơn vị km)
Hình 0.1 Sơ đồ các tuyến đường giao thông từ nhà máy đến nhà kho
Giải bài toán
Cách 1: Giải bằng cách vẽ hình
Quan sát Hình 0.1, chúng ta thấy rằng nút nằm gần nút gốc (nút 1-nhà máy sản xuất) nhất là nút 2, với khoảng cách là 100 km Như vậy, chúng ta có thể nối nút 1 và nút 2 và ghi vào giá trị
100 Khi đó nút 2 sẽ là nút vào tập đã khảo sát
Hình 0.2 Vòng lặp thứ nhất Tiếp theo, phải xác định tất cả các nút xuất phát từ tập nút đã khảo sát (nút 1 và nút 2) Đó chính là nút 3, 4 và 5
Chúng ta sẽ xác định đường đi ngắn nhất từ tập nút đã khảo sát (nút 1 và nút 2) đến nút 3, 4, 5
1
6
Nhµ m¸y
Nhµ kho
200 100
100
50
200
40
150
100 100
1
6
Nhµ m¸y
Nhµ kho
200 100
50
200
40
150 100
100 100
100
Trang 3Có một đường đi xuất phát từ nút 1 là tuyến đường 1-3; và 3 đường đi xuất phát từ nút 2 là tuyến đường 2-3, tuyến đường 2-4 và tuyến đường 2-5 Đường đi có khoảng cách ngắn nhất theo tuyến đường 1-2-3 (100+50 = 150 km) Vì vậy, nút 3 sẽ trở thành nút vào trong tập nút đã khảo sát Và ta ghi giá trị 150 là thế vị của nút 3
Hình 0.3 Vòng lặp thứ hai Tương tự, lặp lại quá trình để xác định thế vị cho nút 4 và 5 Tập nút đã khảo sát lúc này gồm nút 1, 2 và 3 Tiếp theo, ta phải xác định nút tiếp theo vào trong tập nút đã khảo sát Lúc này, nút
4, 5 là các nút nằm gần tập nút đã khảo sát (xuất phát từ nút 2 và nút 3) Có 3 đường đi xuất phát
từ tập nút đã khảo sát (nút 1, 2, và 3) đến các nút 4 và nút 5 là các tuyến đường 2-4, 2-5 và 3-5 Khoảng các ngắn nhất là lộ trình 1-2-3-5 (150+40=190 km) Vì vậy, nút 5 sẽ là nút tiếp theo vào trong tập nút đã khảo sát
Hình 0.4 Vòng lặp thứ ba Tập nút đã khảo sát lúc này gồm các nút 1, 2, 3 và 5 Tiếp theo, ta phải xác định nút tiếp theo vào trong tập nút đã khảo sát Lúc này, nút 4 và nút 6 là các nút nằm gần tập nút đã khảo sát Có
3 tuyến đường đi xuất phát từ tập nút đã khảo sát (nút 1, 2, 3 và 5) đến các nút 4 và 6 là các tuyến đường 2-4, 5-4 và 5-6 Khoảng cách ngắn nhất là lộ trình 1-2-3-5-6 (190+100=290 km) Vì vậy, nút 6 sẽ là nút tiếp theo vào trong tập nút đã khảo sát
Như vậy, đường đi có khoảng cách ngắn nhất từ nút 1 đến nút 6 là 290 km theo tuyến đường 1-2-3-5-6
1
6
Nhµ m¸y
Nhµ kho
200
100
50
150
100 100 100
150
100
1
6
Nhµ m¸y
Nhµ kho
200 100
50
200
40
150
100
100
100
100
Trang 4]=’’
kk,.,/p’ơ0;0
Hình 0.5 Vòng lặp thứ tư (cuối cùng)
Cách 2: Giải bằng cách lập bảng
n
Tập nút đã khảo
sát nối trực tiếp
với nút chưa khảo
sát
Nút chưa khảo sát
Tuyến đường khảo sát
Tổng khoảng cách (thế vị nút chưa khảo sát)
Khoảng cách ngắn nhất
Nút gần nhất thứ n
Đoạn nút nối
1
{1}
1
1
2
3
1-2 1-3
100
200
2
{1, 2}
1
2
2
2
3
3
4
5
1-3 2-3 2-4 2-5
200
150
300
200
3
{1, 2, 3}
.l.2
2
3
4
5
5
2-4 2-5 3-5
100+200=300
200 150+40=190
2
{1, 2, 3, 5}
2
5
5
4
4
6
2-4 5-4 5-6
300 190+150=340 190+100=290
5.1.2.2 Giải bằng thuật toán Dijkstra
• Giới thiệu
Giải thuật Dijkstra được sử dụng để tìm đường đi ngắn nhất từ nút nguồn và các nút khác trong mạng, dùng cho cả bài toán có hay không có mạch vòng Giải thuật có thể áp dụng cho các bài toán mạng có vòng
• Giải thuật Dijkstra
Bước 1: Biểu diễn sơ đồ lên bảng
Bước 2: Tiến hành giải thuật
1 (Khởi đầu) Đánh dấu màu nút i
1
6
Nhµ m¸y
Nhµ kho
200
100
50
150
100 100 100
290
100
Trang 5Đặt v(i)=0 và đối với mỗi nút j khác so với nút i thì đặt v(j) bằng khoảng cách từ nút i tới j
2 (Dừng thuật toán): Nếu tất cả các nút đều được đánh dấu màu
3 Ngược lại, giữa các nút không được đánh màu, chọn một nút k trong đó v(k) là nhỏ
nhất.đánh dấu màu nút k đó Ở các nút không được đánh màu j, so sánh v(j) và v(k)+c(k,j) sau đó chọn giá trị nhỏ hơn ghi để thay thế v(j)
Bước 3: Dựa vào các nút đã được đánh màu tìm đường đi ngắn nhất từ nút i đến tất cả các nút khác j
Ví dụ minh họa: Công ty sản xuất nội thất
Từ sơ đồ ta chuyển lên bảng như sau
Như vậy ta có
1
6
Nhµ m¸y
Nhµ kho
200
100
10 0
50
40
150
100
3 2
6
5
300
150
100
5 6
4
Trang 65.1.2.3 Giải bằng Quy hoạch tuyến tính nhị phân
Bài toán tìm đường đi ngắn nhất có thể được xem như là một dạng đặc biệt của bài toán trung chuyển với một nguồn có cung bằng 1, và một đích có cầu bằng 1, và một số điểm trung chuyển Bài toán này có thể được mô hình hóa và giải bằng QHTT nhị nguyên
Các biến quyết định trong bài toán sẽ cho biết tuyến đường nào được lựa chọn trong sơ đồ mạng lưới với mục tiêu là cực tiểu khoảng cách (chi phí)
Các ràng buộc sẽ xác định số lượng đơn vị (0 hoặc 1) đi vào một nút bằng với số đi ra khỏi nút
đó
Các biến được định nghĩa như sau:
xij – phương án lựa chọn tuyến đường từ nút i đến nút j
i = 1, 2, 3, 4, 5 ; j = 2, 3, 4, 5, 6
xij – 1 nếu tuyến đường ij được lựa chọn và ngược lại xịj = 0 nếu tuyến đường ij không được lựa
• Mô hình QHTT của bài toán:
Các biến:
Binary
ij
x
Hàm mục tiêu:
Các ràng buộc
Bởi vì điểm khởi đầu là nút 1, chúng ta sẽ không tính các biến đi từ nút 2 hoặc nút 3 trở về nút
1 Tương tự như vậy, bởi vì nút 6 là nút cuối, chúng ta sẽ không kể đến các biến bắt đầu tại nút 6 Khi xem nó là bài toán trung chuyển, nút nguồn gốc (nút 1) phải có một đơn vị vận chuyển ra
từ nó Do đó, ta có ràng buộc: x12x131
Nút đến cuối cùng (nút 6) phải có một đơn vị vận chuyển đến nó, do đó ta có ràng buộc:
x x
Mỗi nút trung gian sẽ có một ràng buộc là lượng đi vào nút phải bằng lượng đi ra khỏi nút đó Đối với nút 2, điều này sẽ là: x12 x32 x23x24x25
Hay:x12x32x23x24x250
Các ràng buộc ở nút khác được xây dựng tương tự
Ràng buộc tại nút 3:x13x23x32x350
Trang 7Ràng buộc tại nút 4:x24 x54x42x45x46 0
Ràng buộc tại nút 5:x25x35x45x52 x53x54x56 0
LINGO
Lời giải của bài toán: x12 x23 x35 x56 1
Vậy lộ trình ngắn nhất là: 1-2-3-5-6 với khoảng cách = 290km
5.2 Bài toán phân công
5.2.1 Giới thiệu bài toán
Bài toán phân công là mô ̣t da ̣ng đă ̣c biê ̣t của bài toán vâ ̣n tải và bài toán quy hoa ̣ch tuyến tính
Bài toán phân công đươ ̣c dùng để phân bố nhân sự cho dự án, phân công cán bô ̣ giám sát đến
từ ng công trường, giao hơ ̣p đồng cho các nhà thầu, phân công lao đô ̣ng… sao cho tổng chi phí hay thờ i gian thực hiê ̣n công viê ̣c là ít nhất, tổng tiền lời hay số lượng sản phẩm làm ra là nhiều nhất Đặc điểm quan tro ̣ng của bài toán phân công là chỉ có mô ̣t công viê ̣c hay mô ̣t người được phân công cho một máy, mô ̣t công trường hay mô ̣t dự án duy nhất
Mỗi bài toán phân công có mô ̣t ma trâ ̣n chi phí (giờ công/ tiền lời hay số lượng sản phẩm) gồ m m dòng và n cô ̣t Có m bô ̣ phâ ̣n đươ ̣c phân công (i = 1… m tương ứng với số dòng) và n đối tươ ̣ng cần được thực hiê ̣n (j = 1… n tương ứng với số cô ̣t) Mỗi bô ̣ phâ ̣n i được phân công thực
hiện mô ̣t đối tươ ̣ng j với chi phí (giờ công/ tiền lời hay số lượng sản phẩm) là cij
5.2.2 Phương pháp giải
5.2.2.1 Phương pháp giải Hungarian
Thuật toán Hungarian của bài toán phân công được áp du ̣ng cho trường hợp cực tiểu hàm mu ̣c tiêu (tổng chi phí hay thời gian thực hiê ̣n công viê ̣c nhỏ nhất) và ma trâ ̣n chi phí hay giờ công có số dòng bằng số cô ̣t (m = n)
Thuật toán Hungarian của bài toán phân công dựa trên tính chất rút giảm ma trâ ̣n là khi trừ đi hay cộng thêm các giá tri ̣ thích hợp vào các phần tử ma trâ ̣n chi phí ta sẽ có mô ̣t ma trâ ̣n chi phí
Trang 8cơ hô ̣i Chi phí cơ hô ̣i là giá tri ̣ thiê ̣t ha ̣i khi có sự phân công chưa phải là tối ưu Nếu ta có thể
rú t giảm ma trâ ̣n đến khi có các phần tử có giá tri ̣ không (“0”) ở mỗi dòng và cô ̣t thì có thể đa ̣t đươ ̣c sự phân công tối ưu vào các ô có giá tri ̣ không (“0”) đó
Thuật toán Hungarian của bài toán phân công được thực hiê ̣n qua các bước sau:
Bước 1: Xác đi ̣nh ma trâ ̣n chi phí cơ hô ̣i bằng cách:
a- Trừ giá tri ̣ chi phí của mo ̣i phần tử trong mỗi dòng cho giá tri ̣ chi phí nhỏ nhất trong dòng ấy
b- Trừ giá tri ̣ chi phí của mo ̣i phần tử trong mỗi cô ̣t cho giá tri ̣ chi phí nhỏ nhất trong cô ̣t ấy
Bước 2: Kiểm tra điều kiê ̣n tối ưu: vẽ mô ̣t số tối thiểu các đường thẳng trên dòng hay cô ̣t đi qua
mọi số không (“0”) của bảng Nếu như số đường thẳng ít hơn số dòng/ cô ̣t, thực hiê ̣n bước 3 Nếu như số đườ ng thẳng bằng với số dòng/cô ̣t thì có thể thực hiê ̣n sự phân công tối ưu như sau: a- Kiểm tra các dòng và các cô ̣t có duy nhất mô ̣t giá tri ̣ không (“0”) Thực hiê ̣n sự phân công cho các ô đó
b- Loại bỏ dòng và cô ̣t có chứa số không (“0”) đã phân phối và tiếp tu ̣c trở la ̣i tìm kiếm các
dòng và cô ̣t có duy nhất mô ̣t giá tri ̣ không “(0”) để thực hiê ̣n sự phân công
Bước 3: Xây dựng ma trâ ̣n chi phí cơ hô ̣i mới: cho ̣n giá ti ̣ nhỏ nhất chưa nằm trên đường thẳng
Trừ giá tri ̣ chi phí của mo ̣i phần tử không nằm trên các đường thẳng cho giá tri ̣ nhỏ nhất ấy và
cộng giá tri ̣ nhỏ nhất ấy với giá tri ̣ nằm trên giao điểm của hai đường thẳng Trở la ̣i Bước 2
Ví dụ 1:
Một xưởng gia công cốp pha có 4 người thợ được phân công làm 4 viê ̣c Tiền công để làm xong từ ng viê ̣c của mỗi người thơ ̣ như trong Bảng 0.1 Đề nghi ̣ phân công sao cho tổng chi phí lao đô ̣ng là nhỏ nhất
Bảng 0.1Tiền công khi phân công từng người thợ thực hiện từng phần việc (ngàn đồng)
trong hàng
Sử du ̣ng thuâ ̣t toán Hungarian để giải bài toán như sau:
Bước 1: Xác đi ̣nh ma trâ ̣n chi phí cơ hô ̣i
Trừ giá trị chi phí của mọi phần tử cho giá trị nhỏ nhất trong dòng (hàng)
Giải thích: Giả sử ta quyết đi ̣nh phân công người thợ A1 làm công viê ̣c B4 Bảng 0.1 cho thấy chi phí nhân công chi sự phân công ấy là 14 ngàn đồng Đây không phải là sự phân phối tốt nhất
Trang 9vì người thơ ̣ A1 có thể làm viê ̣c B3 chỉ với chi phí 8 ngàn đồng Vâ ̣y, sự phân công người thơ ̣ A1 làm viê ̣c B3 có chi phí cơ hô ̣i là 6 = 14 – 8 (ngàn đồng), đây là số tiền tổn thất vì sự phân công này thay vì cho ̣n sự phân công tiết kiê ̣m nhất Tương tự, do người thợ A1 làm viê ̣c B3 là
sự phân phối tốt nhất nên chi phí cơ hô ̣i cho sự phân công này là 8 – 8 = 0 (ngàn đồng) Kết quả
là ta đã tính được chi phí cơ hô ̣i cho mo ̣i phần tử của mỗi dòng như trong Bảng 0.2
Bảng 0.2Chi phí cơ hội tính theo dòng (ngàn đồng)
Giá trị nhỏ nhất
Trừ giá trị chi phí của mọi phần tử cho giá trị nhỏ nhất trong cột
Giải thích: Đố i vớ i người thơ ̣ A1 thì tốt nhất là làm viê ̣c B3 nhưng đối với viê ̣c thực hiê ̣n công việc B3 đây không phải là sự phân công kinh tế nhất vì người thợ A3 có thể làm viê ̣c này với chi phí chỉ là 7 (ngàn đồng) Hay nói cách khác, nếu chúng ta xem xét cách thức phân công theo công việc thay vì theo người thì sẽ tính được chi phí cơ hô ̣i cho mo ̣i phần tử của mỗi cô ̣t
Bảng 0.3Chi phí cơ hội tính theo cột (ngàn đồng)
Như vâ ̣y, để thực hiê ̣n bước 1 của thuâ ̣t toán phân công thì phải xác lâ ̣p ma trâ ̣n chi phí cơ hô ̣i tổng thể là ma trâ ̣n chi phí theo dòng và cô ̣t Thực hiê ̣n phần b của bước 1 bằng cách lấy các giá trị chi phí trong mỗi cô ̣t trừ cho giá tri ̣ chi phí nhỏ nhất trong cô ̣t đó (Bảng 0.3) Cô ̣t 1, 2 và 3 của
bảng Bảng 0.3 giống như bảng Bảng 0.2 vì giá tri ̣ nhỏ nhất trong cô ̣t là không (“0”)
Bước 2 Kiểm tra điều kiê ̣n tối ưu
Nhìn vào Bảng 0.3, ta thấy có đến sau sự phân công có chi phí cơ hô ̣i bằng không (“0”) Vẽ
các đường thẳng ngang và đứng đi qua tất cả các giá tri ̣ không (“0”) này thì cần đến 4 đường thẳng (Bảng 0.4) Như vậy số đường thẳng bằng với số dòng của ma trâ ̣n và Bảng 0.4 thỏa mãn
Trang 10điều kiê ̣n tối ưu
Bảng 0.4Kiểm tra điều kiện tối ưu
Bắ t đầu thực hiê ̣n sự phân công với dòng hay cô ̣t chỉ có mô ̣t số (“0”) duy nhất Dòng thứ nhất
vớ i giá tri ̣ không (“0”) duy nhất nằm ở cô ̣t công viê ̣c B3 Thực hiê ̣n sự phân phối vào ô (A1B3)
này và vẽ những đường thẳng loa ̣i bỏ dòng và cô ̣t đã có sự phân phối Từ các dòng và cô ̣t chưa đươ ̣c loa ̣i bỏ la ̣i tiếp tu ̣c tìm kiếm dòng thứ 3 có mô ̣t số không (“0”) duy nhất để thực hiê ̣n sự phân phố i vào ô (A3B2) Cứ thế tiếp tu ̣c cho đến khi phân công mỗi người mô ̣t viê ̣c
Bảng 0.5Bảng phân công
Chi phí nhân công tổng cô ̣ng cho sự phân công này đươ ̣c tính toán từ bảng ma trâ ̣n chi phí ban đầu như sau:
Bảng 0.6Bảng phân công và chi phí
Phân công người thợ Làm việc Tiền công
A1 A2 A3 A4
B3 B4 B2 B1
8
8
8
6 Tổng tiền công (ngàn đồng) 22
Ví dụ 2:Một công ty xây dựng có 3 kỹ sư được phân công phu ̣ trách 3 dự án Chi phí để thực hiện từng dự án của mỗi kỹ sư như Bảng 0.7 Đề nghi ̣ phân công sao cho tổng chi phí ít nhất
Bảng 0.7Chi phí khi phân công từng kỹ sư
An Cư An Điền An Hòa