Báo cáo Thí Nghiệm Kỹ Thuật Ra Quyết Định: Giải Bài Toán Luồng Cực Đại (Max Flow)Trên Excel Và Matlab.Trình bày đầy đủ các bước giải bài toán max flow bằng thuật toán đánh nhãn, các bước thực hiện trên Excel và Matlab.Giải các ví dụ thực tế trên công cụ Excel và Matlab, sau đó kiểm chứng và nhận xét kết quả của 2 cách giải này
Trang 1ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA ĐIỆN – ĐIỆN TỬ
BÁO CÁO THÍ NGHIỆM KỸ THUẬT RA
QUYẾT ĐỊNH
BÀI 3: GIẢI BÀI TOÁN LUỒNG CỰC ĐẠI BẰNG
EXCEL VÀ MATLAB
GVHD: Th.S Hồ Thanh Phương
Nhóm: 4
TP.HCM, Tháng 8 Năm 2018
Trang 2MỤC LỤC
I Phương pháp giải bài toán luồng cực đại (Max Flow):……….… 1
II Các bước thực hiện giải bài toán max flow trên Excel và Matlab:……… 2
1 Các bước giải trên Excel:………2
2 Các bước giải trên Matlab: ……… ………5
III Một số ví dụ và kết quả: ………8
1 Ví dụ 1: ……… ………8
2 Ví dụ 2: ……… ………11
3 Ví dụ 3: ……….………14
Trang 3I Phương pháp giải bài toán luồng cực đại (Max Flow):
Mục đích chính của bài toán max flow là tìm lưu lượng tối đa cho phép giữa nút nguồn (source) và nút đích (sink) Thuật toán để giải quyết bài toán max flow bao gồm các bước sau:
Bước 1: Bắt đầu với một luồng khả thi;
Bước 2: Sử dụng quy trình đánh nhãn để tìm đường tăng luồng;
Bước 3: Xác định giá trị lớn nhất cho luồng tăng cực đại trên tất cả các cung đi tới
(forward arcs) hoặc cho luồng giảm cực đại trên tất cả các cung đi lùi (backward arcs)
Bước 4: Tiếp tục sử dụng quy trình đánh nhãn để tìm đường tăng luồng kế tiếp Nếu
không tồn tại đường này thì đi đến kết luận Ngược lại, nếu tồn tại đường tăng luồng thì quay lại bước 3
Quy trình đánh nhãn (Labeling Procedure):
+ Bước 1: Bắt đầu với nút s (nút nguồn);
+ Bước 2: Nút nhãn j cho rằng nút i chỉ được đánh nhãn khi:
i) Hoặc tồn tại một arc(i,j) – cung (i, j) và
fij < kij ii) Hoặc tồn tại mội arc(j,i) – cung (j, i) và
fij > 0 + Bước 3: Nếu j = t thì dừng, ngược lại quay lại bước 2
fij: lưu lượng hiện tại của arc(i,j);
kij: lưu lượng cực đại hay sức chứa tối đa của arc(i,j)
Trang 4II Các bước thực hiện giải bài toán max flow trên Excel và Matlab:
Xét ví dụ sau:
Tìm luồng cực đại (max flow) từ nút S đến nút T
1 Các bước giải trên Excel:
Dựa vào luồng trên ta có các cung (arc) sau: SA, SB, SC, AC, AD, BC, BE,
CD, CE, CT, DT, ET Tiến hành thiết kế trên Excel như sau:
Cột Flow từ ô D3 đến ô D14 là lưu lượng chảy qua cung đường tương ứng (From – To) cần tìm Lưu lượng này luôn ≤ giá trị tương ứng trong cột Capacity, là sức chứa tối
đa của cung đường (arc) đó
Ta gộp từ ô B3 đến ô B14 đặt tên là From (như hình trên), tương tự cho ô C3 đến ô C14 đặt là To, gộp từ ô D3 đến ô D14 đặt tên là Flow và từ ô F3 đến F14 là Capacity.
S A
A
B
C
D
E
T
Trang 5Hàm SUMIF làm hàm tính toán lưu lượng thuần của mỗi nút trong luồng.
Tại ô I3 nhập =SUMIF(From,H3,Flow) với H3 có giá trị là S.
Tại ô I4 nhập =SUMIF(From,H4,Flow)-SUMIF(To,H4,Flow), sao đó click chuột
phải chọn Copy (hoặc ctrl + V) và kéo chuột từ ô I4 đến ô I8 để thay giá trị H4 lần lượt
là H5, H6, H7, H8 cho các ô I5, I6, I7, I8 tương ứng
Cuối cùng, ở ô I9 nhập =-SUMIF(To,H9,Flow)
Cột Supply/Demand, từ ô K4 đến ô K8 nhập giá trị 0
Hàng Max Flow, tại ô I11 nhập =I3, đây là kết quả luồng cực đại cần tìm.
Trang 6Cấu hình công cụ Solver Parameters như sau:
Set Objective: $I$11
To: tích chọn Max
By Changing Variable Cells: Flow
Subject to the Constraints: $I$4:$I$8 = $K$4:$K$8 và Flow <= Capacity
Select a Solving Method: Simplex LP
Sau đó click Solve, tiếp tục tích vào Keep Solver Solution và click OK, ta có kết quả như hình sau:
Kết quả ta được luồng cực đại (Max Flow) là 12 và bảng lưu lượng qua các cung đường như các giá trị tìm được ở cột Flow
S
A
A
B
C
D
E
T
Trang 72 Các bước giải trên Matlab:
Để giải bài toán luồng cực đại trên Matlab, ta sẽ nhập lệnh trên Command Window theo các bước sau (thực hiện lại ví dụ trên):
+ Qui các nút S, A, B, C, D, E, T lần lượt về 1, 2, 3, 4, 5, 6, 7 sau đó nhập hai ma trận s (cột From trên Excel) và ma trận t (cột To trên Excel) như sau:
s = [1 1 1 2 2 3 3 4 4 4 5 6]
t = [2 3 4 4 5 4 6 5 6 7 7 7]
+ Để vẽ ra giản đồ với tên các nút là S, A, B,… thay vì là 1, 2, 3,… thì ta nhập thêm lệnh sau:
nodes = {'S' 'A' 'B' 'C' 'D' 'E' 'T'}
Trang 8+ Nhập ma trận sức chứa tối đa của mỗi cung đường (cột Capacity trên Excel):
weights = [4 2 8 5 2 6 9 1 3 4 7 5]
+ Dùng lệnh sau để tạo giản đồ luồng:
G = digraph(s,t,weights,nodes)
+ Tiến hành vẽ giản đồ bằng lệnh plot như sau:
plot(G,'EdgeLabel',G.Edges.Weight,'Layout','layered')
Trang 9+ Để tìm luồng cực đại (mf) và dung lượng mỗi cung đường (GF), ta dùng hàm maxflow theo cú pháp sau:
[mf GF] = maxflow(G,1,7)
+ Kết quả ta tìm được max flow là 12 (như giải trên Excel)
+ Để vẽ ra giản đồ dung lượng mỗi cung đường, ta cũng dùng lệnh plot như sau: plot(GF,'EdgeLabel',GF.Edges.Weight,'Layout','layered')
Trang 10III Một số ví dụ và kết quả:
1 Ví dụ 1:
Giải bài toán max flow cho trong hình sau:
Giải trên Excel:
+ Tiến hành lập bảng Excel như hình, từ ô I3 đến ô I8 theo thứ tự nhập các lệnh sau:
=SUMIF(From,H3,Flow)
=SUMIF(From,H4,Flow)-SUMIF(To,H4,Flow)
Trang 11=SUMIF(From,H6,Flow)-SUMIF(To,H6,Flow)
=SUMIF(From,H7,Flow)-SUMIF(To,H7,Flow)
=SUMIF(To,H8,Flow)
+ Cấu hình Solver Parameters như sau:
Trang 12+ Kết quả ta tìm được max flow là 23 và dung lượng qua các cung đường như hình:
Giải trên Matlab:
Trang 13+ Lần lượt nhập các lệnh sau lên Command Window:
s = [1 1 2 2 3 3 4 4 5 5];
t = [2 3 3 4 2 5 3 6 4 6];
weights = [16 13 10 12 4 14 9 20 7 4];
G = digraph(s,t,weights);
[mf GF] = maxflow(G,1,6);
plot(GF,'EdgeLabel',GF.Edges.Weight,'Layout','layered');
(Do lệnh digraph chỉ hỗ trợ các nút từ 1 trở đi nên ở bài này ta qui nút 0 về 1, nút
1 về 2,… tương tự cho các nút còn lại)
+ Kết quả cũng thu được max flow là 23 như Excel:
Trang 142 Ví dụ 2:
Giải bài toán max flow cho trong hình sau:
Giải trên Excel:
Trang 15+ Tiến hành lập bảng Excel như hình
+ Cấu hình Solver Parameters như sau:
Trang 16Giải trên Matlab:
+ Lần lượt nhập các lệnh sau lên Command Window:
s = [1 1 2 2 3 3 4 5];
t = [2 3 4 5 4 5 6 6];
weights = [5 10 4 5 5 5 8 10];
G = digraph(s,t,weights);
[mf GF] = maxflow(G,1,6);
plot(GF,'EdgeLabel',GF.Edges.Weight,'Layout','layered');
+ Kết quả cũng thu được max flow là 15 như Excel:
Trang 17+ Lệnh plot để vẽ hàm GF, chính là lưu lượng qua các arc:
3 Ví dụ 3:
Giải bài toán max flow cho trong hình sau:
Giải trên Excel:
+ Dựa vào hình trên, ta có các cung đường (arc) như sau: SA, SC, AC, AB, BT, CD,
DB, DT
+ Thực hiện lập bảng trên Excel và nhập các lệnh SUMIF như hình dưới:
Trang 18+ Cấu hình Solver Parameters như sau:
Trang 19+ Kết quả ta tìm được max flow là 15 và dung lượng qua các cung đường như hình:
Giải trên Matlab:
+ Do hàm maxflow của Matlab chỉ hỗ trợ các nút dạng số bắt đầu từ 1, nên đối với bài này phải qui đổi S, A, B, C, D, T lần lượt về 1, 2, 3, 4, 5, 6
+ Lần lượt nhập các lệnh sau lên Command Window:
s = [1 1 2 2 3 4 5 5];
t = [2 4 4 3 6 5 3 6];
weights = [10 8 2 5 7 10 8 10];
G = digraph(s,t,weights);
[mf GF] = maxflow(G,1,6);
plot(GF,'EdgeLabel',GF.Edges.Weight,'Layout','layered');
+ Kết quả cũng thu được max flow là 15 như Excel:
Trang 20+ Dung lượng qua các cung đường như hình: