Tải bản đầy đủ (.doc) (27 trang)

Tiểu luận môn Toán ứng dụng: BÀI TOÁN CỰC TIỂU TỔNG VÀ CỰC TIỂU TRỊ LỚN NHẤT

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 (366.42 KB, 27 trang )

MỤC LỤC
LỜI MỞ ĐẦU.......................................................................................................2
ĐẠI CƯƠNG VỀ ĐỒ THỊ...................................................................................4
1. Các khái niệm cơ bản.................................................................................4
1.1. Đồ thị vô hướng và đồ thị có hướng......................................................4
1.2. Bậc, nửa bậc vào, nửa bậc ra.................................................................5
1.3. Đường đi, chu trình, tính liên thông......................................................6
2. Biểu diễn đồ thị..........................................................................................7
2.1. Ma trận kề..............................................................................................7
2.1.1. Đồ thị vô hướng..............................................................................7
2.1.2. Đồ thị có hướng..............................................................................7
2.2. Danh sách cạnh (cung)...........................................................................8
2.3. Danh sách kề..........................................................................................9
3. Thuật toán Floyd-Warshall tìm đường đi ngắn nhất giữa mọi cặp đỉnh
trong đồ thị có trọng số................................................................................10
BÀI TOÁN CỰC TIỂU TỔNG VÀ CỰC TIỂU TRỊ LỚN NHẤT...................13
1. Bài toán cực tiểu tổng và cực tiểu trị lớn nhất.........................................13
2. Thuật toán cực tiểu tổng và cực tiểu trị lớn nhất.....................................13
2.1 Thuật toán cực tiểu tổng.........................................................................13
2.2 Thuật toán cực tiểu trị lớn nhất..............................................................13
3. Độ phức tạp thuật toán.............................................................................14
4. Ví dụ.........................................................................................................14
THIẾT KẾ VÀ CÀI ĐẶT CHƯƠNG TRÌNH...................................................16
1. Thiết kế cấu trúc dữ liệu..........................................................................16
2. Cài đặt giải thuật tìm cực tiểu tổng và cực tiểu trị lớn nhất.....................16
3. Chương trình trên C++.............................................................................18
4. Chương trình trên C#...............................................................................22
KẾT LUẬN.........................................................................................................26
TÀI LIỆU THAM KHẢO..................................................................................27



Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

LỜI MỞ ĐẦU
Trong Toán học và Tin học, lý thuyết đồ thị có vai trò rất quan trọng, nó
nghiên cứu các tính chất của đồ thị - là một tập các đối tượng được gọi là
các đỉnh (hoặc nút) nối với nhau bởi các cạnh (hoặc cung). Cạnh có thể có hướng hoặc
vô hướng, cạnh có thể được gán một con số gọi là trọng số. Đồ thị thường được vẽ
dưới dạng một tập các điểm (các đỉnh) nối với nhau bằng các đoạn thẳng (các cạnh).
Trong thực tế, đồ thị biểu diễn được rất nhiều cấu trúc. Đồ thị có thể biểu diễn
một mạng lưới giao thông, trong đó các cơ sở quan trọng là các đỉnh, đường đi giữa
chúng là các cạnh, độ dài của mỗi con đường là trọng số. Đồ thị có thể biểu diễn mạng
lưới Internet, trong đó các máy chủ là các đỉnh, đường truyền là các cạnh và trong số
có thể là thời gian di chuyển hoặc độ rộng đường truyền đó,…
Trong bài toán tìm địa điểm trung tâm để đặt các cơ sở dịch vụ (trường học,
bưu điện, phòng cháy chữa cháy, vị trí đặt máy chủ,...) sao cho kinh tế và hiệu quả
nhất có rất nhiều ứng dụng trong thực tế. Bài toán này thường được mô hình hoá
mạng lưới dạng đồ thị, trong đó các cơ sở có thể được bố trí ở một hoặc vài vị trí.
Nếu các cơ sở là các cơ quan như trường học, bưu điện thì nên đặt chúng ở
các vị trí sao cho tổng khoảng cách các vùng khác nhau đến cơ sở là nhỏ nhất. Lớp bài
toàn này gọi là Bài toán cực tiểu tổng (minsum problem).
Mặt khác, nếu các cơ sở là các cơ quan như phòng cháy chữa cháy, thì nên đặt
chúng ở các vị trí sao cho khoảng cách từ cơ sở đến điểm xa nhất của cộng đồng là
nhỏ nhất. Lớp bài toán này gọi là Bài toán cực tiểu trị lớn nhất (minmax problem).
Trong giới hạn đề tài này, chúng tôi sẽ tìm hiểu các khái niệm cơ bản nhất về
đồ thị, nghiên cứu và cài đặt thuật toán để giải quyết bài toán trên.
Chúng tôi xin chân thành cảm ơn PGS.TSKH Trần Quốc Chiến đã giảng dạy,
hướng dẫn tận tình và cung cấp tài liệu tham khảo quý báu để chúng tôi hoàn thành đề
tài này.

Nhóm học viên thực hiện
Mai Xuân Phú
Trần Hữu Phước
Huỳnh Thị Hiền Thắm
Hoàng Tiến Sơn

GVHD: PGS.TSKH Trần Quốc Chiến

Trang 2


Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

YÊU CẦU CỦA ĐỀ TÀI
ĐỀ TÀI 3: BÀI TOÁN CỰC TIỂU TỔNG VÀ CỰC TIỂU TRỊ LỚN NHẤT
1. Trình bày bài toán cực tiểu tổng và cực tiểu trị lớn nhất.
2. Trình bày thuật toán tìm cực tiểu tổng và cực tiểu trị lớn nhất.
3. Thiết kế cấu trúc dữ liệu và giải thuật tìm cực tiểu tổng và cực tiểu trị lớn nhất.
4. Viết chương trình cài đặt thuật toán tìm, cực tiểu tổng và cực tiểu trị lớn nhất bằng
ngôn ngữ C.
THÀNH VIÊN NHÓM VÀ ĐÁNH GIÁ NHẬN XÉT
T
T
1

Họ và tên
Huỳnh Thị Hiền
Thắm


2 Trần Hữu Phước

3 Hoàng Tiến Sơn

4 Mai Xuân Phú

Công việc
(theo mục lục)
- Viết chương 1
- Tổng hợp báo cáo
- Bài toán đề tài
- Chuẩn bị slide báo
cáo
- Bài toán đề tài
- Chuẩn bị slide báo
cáo
- Thiết kế và cài đặt
chương trình.
- Viết chương 3.

GVHD: PGS.TSKH Trần Quốc Chiến

Chữ ký

Nhận xét của giáo viên

Trang 3



Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

CHƯƠNG 1

ĐẠI CƯƠNG VỀ ĐỒ THỊ
1. Các khái niệm cơ bản
1.1. Đồ thị vô hướng và đồ thị có hướng
Đồ thị vô hướng G = (V,E) gồm một tập V các đỉnh và tập E các cạnh. Mỗi cạnh
e ∈ E được liên kết với một cặp đỉnh v, w (không kể thứ tự).
v
w

e

Ví dụ:

Đồ thị có hướng G = (V,E) gồm một tập V các đỉnh và tập E các cạnh có
hướng gọi là cung. Mỗi cung e ∈ E được liên kết với một cặp đỉnh (v, w) có thứ tự.
v
w
e
Ví dụ:

Cho đồ thị có hướng G=(V, E). Nếu ta thay mỗi cung của G bằng một cạnh, thì
đồ thị vô hướng nhận được gọi là đồ thị lót của đồ thị có hướng G.

Ghi chú: Đồ thị vô hướng có thể coi là đồ thị có hướng trong đó mỗi cạnh
e=(v,w) tương ứng với hai cung (v,w) và (w,v).

Cho đồ thị (có hướng hoặc vô hướng) G = (V,E).
Nếu cạnh e liên kết đỉnh v, w thì ta nói cạnh e liên thuộc đỉnh v, w, các đỉnh v,
w liên thuộc cạnh e, các đỉnh v, w là các đỉnh biên của cạnh e và đỉnh v kề đỉnh w.
Nếu chỉ có duy nhất một cạnh e liên kết với cặp đỉnh v, w , ta viết e=(v,w).
Nếu e là cung thì v gọi là đỉnh đầu và w gọi là đỉnh cuối của cung e.
Nếu có nhiều cạnh liên kết với cùng một cặp đỉnh thì ta nói đó là các cạnh song
song.
Cạnh có hai đỉnh liên kết trùng nhau gọi là khuyên.
GVHD: PGS.TSKH Trần Quốc Chiến

Trang 4


Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

Đỉnh không kề với đỉnh khác gọi là đỉnh cô lập.
Số đỉnh của đồ thị gọi là bậc của đồ thị, số cạnh hoặc số cung của đồ thị gọi là
cỡ của đồ thị.
Đồ thị hữu hạn là đồ thị có bậc và cỡ hữu hạn.
Đồ thị đơn là đồ thị không có khuyên và không có cạnh song song.
Đồ thị vô hướng đủ là đồ thị mà mọi cặp đỉnh đều kề nhau.
Đồ thị có hướng đủ là đồ thị có đồ thị lót đủ.

1.2. Bậc, nửa bậc vào, nửa bậc ra
Cho đồ thị G = (V, E).
Giả sử đỉnh v∈V có p khuyên và q cạnh liên thuộc (không phải khuyên). Khi đó
bậc của đỉnh v là 2p + q và ký hiệu là degG (v) hoặc đơn giản deg(v).
Số bậc đỉnh lớn nhất của G ký hiệu là Δ(G), số bậc đỉnh nhỏ nhất của G ký hiệu

là δ(G).
Từ định nghĩa suy ra đỉnh cô lập trong đồ thị đơn là đỉnh có bậc bằng 0.
Đỉnh có bậc bằng 1 gọi là đỉnh treo.
Cho G=(V,E) là đồ thị có hướng, v∈V. Nửa bậc ra của đỉnh v, ký hiệu là
degO(v), là số cung đi ra từ đỉnh v (v là đỉnh đầu), và nửa bậc vào của đỉnh v∈V, ký
hiệu là degI(v), là số cung đi tới đỉnh v (v là đỉnh cuối).
Ví dụ:

Trong đồ thị này ta có
deg(x1) = 6; deg(x2) = deg(x3) = 4; deg(x4) = 3; deg(x5) = 0; deg(x6) = 1
Đỉnh x1 có hai khuyên liên thuộc.
Có hai cạnh song song liên thuộc đỉnh x2 và x3.
Đỉnh x5 là đỉnh cô lập.
Đỉnh x6 là đỉnh treo.
Ví dụ:
Xét đồ thị có hướng sau:
x2

x1

GVHD: PGS.TSKH Trần Quốc Chiến

x6

x4

Trang 5


Đồ án môn học Toán ứng dụng


Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

x3

x5

Trong đồ thị có hướng này ta có
degI(x1) = 0; degO(x1) = 2; degI(x2) = 1; degO(x2) = 2;
degI(x3) = 2; degO(x3) = 1; degI(x4) = 2; degO(x4) = 2;
degI(x5) = 1; degO(x5) = 1; degI(x6) = 2; degO(x6) = 0;

1.3. Đường đi, chu trình, tính liên thông
Cho đồ thị G=(V,E).
Dây µ từ đỉnh v đến đỉnh w là tập hợp các đỉnh và cạnh nối tiếp nhau bắt đầu từ
đỉnh v và kết thúc tại đỉnh w. Số cạnh trên dây µ gọi là độ dài của dây µ.
Dây µ từ đỉnh v đến đỉnh w độ dài k được biểu diễn như sau
µ = (v, e1, v1, e2, v2, ... , vk-1, ek, w)
trong đó vi (i = 1, ..., k-1) là các đỉnh trên dây và e i (i=1,...,k-1) là các cạnh trên
dây liên thuộc đỉnh kề trước và sau nó. Các đỉnh và cạnh trên dây có thể lặp lại.
Đường đi từ đỉnh v đến đỉnh w là dây từ đỉnh v đến đỉnh w, trong đó các cạnh
không lặp lại.
Đường đi sơ cấp là đường đi không đi qua một đỉnh quá 1 lần.
Ghi chú: Trong đồ thị n đỉnh, đường đi sơ cấp giữa hai đỉnh khác nhau có
nhiều nhất n-1 cạnh.
Vòng là dây có đỉnh đầu và đỉnh cuối trùng nhau.
Chu trình là đường đi có đỉnh đầu và đỉnh cuối trùng nhau.
Chu trình sơ cấp là chu trình không đi qua một đỉnh quá 1 lần.
Ghi chú: Trong đồ thị n đỉnh, chu trình sơ cấp có nhiều nhất n cạnh.
Dây có hướng trong đồ thị có hướng là dãy các đỉnh và cung nối tiếp nhau (e 1,

e2,...,ek) thoả mãn đỉnh cuối của cung ei là đỉnh đầu của cung ei+1 , i=1, ...,k-1.
Đường đi có hướng trong đồ thị có hướng là dây có hướng, trong đó các cung
không lặp lại.
Đường đi có hướng sơ cấp là đường đi có hướng không đi qua một đỉnh quá 1
lần.
Vòng có hướng là dây có hướng có đỉnh đầu và đỉnh cuối trùng nhau.
Chu trình có hướng là đường đi có hướng có đỉnh đầu và đỉnh cuối trùng
nhau.
Chu trình có hướng sơ cấp là chu trình có hướng không đi qua một đỉnh quá 1
lần.
Đồ thị vô hướng gọi là liên thông, nếu mọi cặp đỉnh của nó đều có đường đi
nối chúng với nhau.
Đồ thị có hướng gọi là liên thông mạnh, nếu mọi cặp đỉnh (u,v) bao giờ cũng
tồn tại đường đi có hướng từ u đến v và từ v đến u.

GVHD: PGS.TSKH Trần Quốc Chiến

Trang 6


Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

Đồ thị có hướng gọi là bán liên thông, nếu với mọi cặp đỉnh (u,v) bao giờ cũng
tồn tại đường đi có hướng từ u đến v hoặc từ v đến u.
Đồ thị có hướng gọi là liên thông yếu, nếu đồ thị lót (vô hướng) của nó liên
thông.
Ghi chú. Đồ thị liên thông mạnh ⇒ Đồ thị bán liên thông ⇒ Đồ thị liên
thông yếu.


2. Biểu diễn đồ thị
2.1. Ma trận kề
2.1.1. Đồ thị vô hướng
Cho đồ thị vô hướng G=(V,E) có n đỉnh theo thứ tự v 1,v2, ..., vn. Ma trận kề của
đồ thị G là ma trận vuông A=(a ịj)nxn, trong đó aij là số cạnh (khuyên) nối vi với vj. Lưu
ý rằng khi tính bậc của đỉnh mỗi khuyên được tính hai bậc.
Từ định nghĩa suy ra rằng ma trận kề của đồ thị vô hướng luôn đối xứng qua
đường chéo chính.
Ví dụ:
v1
v2
v3
v4

v5

có ma trận kề là:
v1
0
1
0
0
1

v1
v2
v3
v4
v5


v2
1
0
1
0
1

v3
0
1
2
0
1

v4
0
0
0
0
1

v5
1
1
1
1
0

2.1.2. Đồ thị có hướng

Cho đồ thị có hướng G=(V,E) có n đỉnh theo thứ tự v 1, v2, ..., vn . Ma trận kề
của đồ thị G là ma trận vuông A=(a ịj)nxn, trong đó aij là số cung đi từ vi tới vj.
Ví dụ:
v2
v6
e1
v1

e4

e6

e3
e2

v4

e8

e5

e7

v3
Đồ thị trên có ma trận kề là:

v5

v1 v2 v3 v4 v5 v6
v1 0


GVHD: PGS.TSKH Trần Quốc Chiến

1

1

0

0

0

Trang 7


Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

v2 0

0

1

1

0


0

v3 0

0

0

1

0

0

v4 0

0

0

0

1

1

v5 0

0


0

0

0

1

v6 0

0

0

0

0

0

2.2. Danh sách cạnh (cung)
Trong trường hợp đồ thị thưa (đồ thị có n đỉnh và m cạnh hoặc cung thoả mãn
m < 6n) người ta thường dùng cách biểu diễn đồ thị dưới dạng danh sách cạnh (cung).
Trong cách biểu diễn đồ thị bởi danh sách cạnh (cung) chúng ta sẽ lưu trữ danh
sách tất cả các cạnh (cung) của đồ thị vô hướng (có hướng). Một cạnh (cung) e=(x,y)
của đồ thị sẽ tương ứng với hai biến Dau[e], Cuoi[e]. Như vậy, để lưu trữ đồ thị ta cần
sử dụng 2m đơn vị bộ nhớ. Nhược điểm của cách biểu diễn này là để xác định những
đỉnh nào của đồ thị là kề với một đỉnh cho trước chúng ta phải làm cỡ m phép so sánh
(khi duyệt qua danh sách tất cả các cạnh hoặc cung của đồ thị).
Chú ý: Trong trường hợp đồ thị có trọng số ta cần thêm m đơn vị bộ nhớ để lưu

trữ trọng số của các cạnh.
Ví dụ: Đồ thị
v1
v2
v3
v4
v5
có danh sách cạnh là
(v1, v2), (v1, v5), (v2, v3), (v2, v5), (v3, v3), (v3, v5), (v4, v5)
được lưu trữ bởi các mảng Đầu[e], Cuối[e], e=1,...7, như sau:
Cạn
h
Đầu
Cuối

1

2

3

4

5

6

7

v1

v2

v1
v5

v2
v3

v2
v5

v3
v3

v3
v5

v4
v5

Ví dụ: Xét đồ thị có hướng sau
v2
e1
v1

v6

e4
e3


e6
v4

e2

e5
v3

GVHD: PGS.TSKH Trần Quốc Chiến

e8
e7
v5
Trang 8


Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

Đồ thị có danh sách cung là
[v1, v2], [v1, v3], [v2, v4], [v2, v3], [v3, v4], [v4, v6], [v4, v5], [v5, v6]
được lưu trữ bởi các mảng Đầu[e], Cuối[e], e=1,...8, như sau:
Cung
Đầu
Cuối

1

2


3

4

5

6

7

8

v1
v2

v1
v3

v2
v4

v2
v3

v3
v4

v4
v6


v4
v5

v5
v6

2.3. Danh sách kề
Trong rất nhiều vấn đề ứng dụng của lý thuyết đồ thị, cách biểu diễn đồ thị
dưới dạng danh sách kề là cách biểu diễn thích hợp nhất.
Trong cách biểu diễn này, với mỗi đỉnh v của đồ thị chúng ta lưu trữ danh sách
các đỉnh kề với nó, mà ta sẽ ký hiệu là
Ke(v) = { u ∈ V | (v,u)∈ E}
Khi đó vòng lặp thực hiện với mỗi một phần tử trong danh sách này theo thứ tự
các phần tử được sắp xếp trong nó sẽ được viết như sau:
Với mọi u ∈ Ke(v) do <công việc>
Sau đây là các ví dụ danh sách kề liên kết.
Ví dụ: Đồ thị
1
2
3
4

5

Có danh sách kề liên kết là:

Ví dụ: Đồ thị có hướng

GVHD: PGS.TSKH Trần Quốc Chiến


Trang 9


Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

Có danh sách kề liên kết là:

3. Thuật toán Floyd-Warshall tìm đường đi ngắn nhất giữa mọi cặp đỉnh
trong đồ thị có trọng số.
Thuật toán Floyd-Warshall tìm đường đi ngắn nhất giữa mọi cặp đỉnh trong đồ thị
(có hướng) có trọng số.
◊ Đầu vào. Đồ thị G=(V,E,w), V= {1, 2, ... , n}, có trọng số với mọi cung (i,j).
◊ Đầu ra. Ma trận D=[d(i,j)]nxn, trong đó d(i,j) là chiều dài đường đi ngắn nhất
từ i đến j với mọi cặp (i,j).
Ma trận P=[p(i,j)]nxn dùng để xác định đường đi ngắn nhất.
◊ Phương pháp.
(1) Bước khởi tạo: Ký hiệu D0 là ma trận xuất phát
D0 = [d0(i,j)]
trong đó d0(i,j) = w(i,j) nếu tồn tại cung (i,j) và d 0(i,j) = +∞ nếu không tồn tại
cung (i,j) (đặc biệt nếu không có khuyên tại i thì d0(i,i) = +∞).
P0 = [p0(i,j)]
trong đó p0(i,j) = j nếu có cung từ i đến j và p 0(i,j) không xác định nếu không có
cung từ i đến j.
Gán k:=0;
(2) Kiểm tra kết thúc:
Nếu k=n, kết thúc. D=Dn là ma trận độ dài đường đi ngắn nhất, P=Pn.
Ngược lại, nếu k

(3) Tính ma trận Dk và Pk theo Dk−1 và Pk−1:
Với mọi cặp (i,j), i=1..n, j=1..n thực hiện:
Nếu dk−1(i,j) > dk−1(i,k) + dk−1(k,j), thì đặt
dk(i,j) := dk−1(i,k) + dk−1(k,j)

pk(i,j) := pk−1(i,k)
ngược lại đặt
dk(i,j) := dk−1(i,j)
GVHD: PGS.TSKH Trần Quốc Chiến

Trang 10


Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất


pk(i,j) := pk−1(i,j)
Quay lại bước (2)
◊ Phương pháp xác định đường đi ngắn nhất từ đỉnh i đến đỉnh j : Đường đi
ngắn nhất từ i đến j gồm dãy các đỉnh
i, i1, i2, i3, ..., ik, ik+1, ... , im, j
thỏa mãn
i1 = p(i,j), i2 = p(i1,j), ..., ik+1 = p(ik,j), ..., p(im,j) = j
Ví dụ. Xét đồ thị sau

Áp dụng giải thuật Floyd mở rộng ta nhận được các ma trận sau:
- Các ma trận xuất phát:
a

B
c
d
a
b
a
7
5
a
b
D0 = b
7
6
P0=
b
c
11
c
d
4
1
d
a
b

c
c
c

d


- Các ma trận cập nhật qua đỉnh a: (các giá trị mới được gạch dưới)
a
b
c
d
a
b
a
7
5
a
b
D1 = b
7
6
P1= b
c
11
c
d
4
1
9
d
a
b

c
c

c

d

- Các ma trận cập nhật qua đỉnh b: (các giá trị mới được gạch dưới)
a
b
c
d
a
b
a
7
5
13
a
b
D2 = b
7
6
P2= b
c
11
c
d
4
1
8
7
d

a
b

c
c
c

- Các ma trận cập nhật qua đỉnh c: (các giá trị mới được gạch dưới)
a
b
c
d
a
b
GVHD: PGS.TSKH Trần Quốc Chiến

d
d

d
d

a

b

d
b
d
d

b

c

d
Trang 11


Đồ án môn học Toán ứng dụng

D3 =

a
7
5
b
7
c
d
4
1
8
(không có thay đổi)

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

13
6
11
7


P3=

a
b
c
d

a

b

c
c

b

b

- Các ma trận cập nhật qua đỉnh d: (các giá trị mới được gạch dưới)
a
b
c
d
a
a
17
7
5
13

a
b
D=D4= b
10
7
7
6
P=P4= b
d
c
15
12
19
11
c
d
d
4
1
8
7
d
a

b
b
d
d
b


b
d
d
b

c
c
c
d
b

d
b
d
d
b

Cuối cùng, ta có ma trận khoảng cách ngắn nhất giữa các đỉnh D = D 4. Ta thấy
đồ thị liên thông và chứa chu trình.
Sử dụng ma trận P = P 4 , ta có thể tìm đường đi ngắn nhất giữa các đỉnh. Chẳng
hạn, để tìm đường đi từ đỉnh d đến đỉnh c ta làm như sau:
Đặt
i1 := P(d,c) = b; i2 := P(b,c) = c
Từ đó ta nhận được đường đi ngắn nhất từ d đến c:
d→b→c
với độ dài là 8.

GVHD: PGS.TSKH Trần Quốc Chiến

Trang 12



Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

CHƯƠNG 2

BÀI TOÁN CỰC TIỂU TỔNG VÀ CỰC TIỂU TRỊ LỚN NHẤT
1. Bài toán cực tiểu tổng và cực tiểu trị lớn nhất
Trong bài toán tìm địa điểm trung tâm để đặt các cơ sở dịch vụ (trường học,
bưu điện, phòng cháy chữa cháy, vị trí đặt máy chủ,...) sao cho kinh tế và hiệu quả
nhất có rất nhiều ứng dụng trong thực tế. Bài toán này thường được mô hình hoá như
mạng lưới dạng đồ thị, trong đó các cơ sở có thể được bố trí ở một hoặc vài vị trí.
Nếu các cơ sở là các cơ quan như trường học hay bưu điện thì nên đặt chúng ở
các vị trí sao cho tổng khoảng cách các vùng khác nhau đến cơ sở là nhỏ nhất. Lớp bài
toàn này gọi là Bài toán cực tiểu tổng (minsum problem).
Mặt khác, nếu các cơ sở là các cơ quan như phòng cháy chữa cháy, thì nên đặt
chúng ở các vị trí sao cho khoảng cách từ cơ sở đến điểm xa nhất của cộng đồng là
nhỏ nhất. Lớp bài toán này gọi là Bài toán cực tiểu trị lớn nhất (minmax problem).

2. Thuật toán cực tiểu tổng và cực tiểu trị lớn nhất
2.1 Thuật toán cực tiểu tổng




Đầu vào: Trọng đồ G = (V,E,c), trong đó V = {1, 2, ..., n}, với trọng số cạnh
không âm.
Đầu ra: N là cực tiểu tổng lớn nhất, và {v 1, v2,…, vm} là tập các đỉnh cực tiểu tổng

lớn nhất.
Phương pháp:
(1) Tìm D = [d(i,j)] là ma trận khoảng cách nhỏ nhất của G (bằng thuật toán FloydWarshal, d(i,i)=0, ∀i).
(2) Tìm S = [s(i)] là danh sách tổng các hàng (∀i ∈ V), trong đó s(i) là tổng các
phần tử trên hàng i của ma trận D.
(3) Kết quả:
• Cực tiểu tổng lớn nhất: N = min(s(i)), ∀i ∈ V.
• Tập các đỉnh cực tiểu trị lớn nhất: {vi | s(i) ≤ N, ∀i ∈ V}.
(4) Kết thúc.

2.2 Thuật toán cực tiểu trị lớn nhất




Đầu vào: Trọng đồ G = (V,E,c), trong đó V = {1, 2, ..., n}, với trọng số cạnh
không âm.
Đầu ra: M là cực tiểu trị lớn nhất, và {v 1, v2,…, vm} là tập các đỉnh cực tiểu trị lớn
nhất.
Phương pháp:

GVHD: PGS.TSKH Trần Quốc Chiến

Trang 13


Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất


(5) Tìm D = [d(i,j)] là ma trận khoảng cách nhỏ nhất của G (bằng thuật toán FloydWarshal, d(i,i)=0, ∀i).
(6) Tìm L = [l(i)] là danh sách độ lệch tâm (∀i ∈ V), trong đó l(i) là phần tử lớn
nhất trên hàng i của ma trận D.
(7) Kết quả:
• Cực tiểu trị lớn nhất: M = min(l(i)), ∀i ∈ V.
• Tập các đỉnh cực tiểu trị lớn nhất: {vi | l(i) ≤ M, ∀i ∈ V}.
(8) Kết thúc.

3. Độ phức tạp thuật toán
Độ phức tạp tính toán trong từng bước của thuật toán:
Bước (1): thuật toán Floyd-Warshall có độ phức tạp tính toán là O(n3) nên thuật
toán trên có độ phức tạp là O(n3), với n = |V| là số đỉnh của đồ thị.
Bước (2): tìm phần tử lớn nhất trên mỗi hàng của ma trận D, nếu sử dụng thuật
toán tìm kiếm tuần tự thông thường trên mỗi hàng thì có độ phức tạp là O(n2).
Bước (3): thực chất là tìm kiếm phần tử nhỏ nhất trong mảng L và danh sách
đỉnh thỏa mãn l(i) ≤ M nên độ thức tạp là O(n).
Như vậy, độ phức tạp thuật toán tìm cực tiểu trị lớn nhất là O(n3), với n = |V| là
số đỉnh của đồ thị.

4. Ví dụ
Tìm các đỉnh cực tiểu tổng, cực tiểu trị lớn nhất của đồ thị sau:
6
1

2

3

4


5

7
với trọng số tất cả các cạnh là 1.
Giải
Sử dụng thuật toán Floyd-Warshal tìm ma trận khoảng cách ngắn nhất của đồ
thị:
0
1

2

D = 3
4

4
4


1
0
1
2
3
3
3

2
1
0

1
2
2
2

3
2
1
0
1
1
1

4
3
2
1
0
2
2

4
3
2
1
2
0
2

4

3
2

1
2

2
0

Độ lệch tâm của các đỉnh tương ứng là L = {4, 3, 2, 3, 4, 4, 4}.

GVHD: PGS.TSKH Trần Quốc Chiến

Trang 14


Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

Từ mảng L ta tìm được giá trị nhỏ nhất là M = 2 (cực tiểu trị lớn nhất), chỉ đỉnh
3 có l(3) ≤ 2 nên đỉnh 3 là đỉnh cực tiểu độ lệch tâm duy nhất và tâm đồ thị là {3}.
Tổng các hàng tương ứng là 18, 13, 10, 9, 14, 14, 14 (N=9). Như vậy đỉnh 4 là
đỉnh cực tiểu tổng duy nhất và tập đỉnh cực tiểu tổng là {4}

GVHD: PGS.TSKH Trần Quốc Chiến

Trang 15



Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

CHƯƠNG 3

THIẾT KẾ VÀ CÀI ĐẶT CHƯƠNG TRÌNH
1. Thiết kế cấu trúc dữ liệu
Để giải quyết bài toán “Tìm cực tiểu trị tổng và cực tiểu trị lớn nhất” nhóm đề
xuất sử dụng cấu trúc dữ liệu như sau:
1. Danh sách cạnh để biểu diễn đồ thị vô hướng có trọng số không âm.
- Danh sách là mảng một chiều có m phần tử (là số cạnh của đồ thị); mỗi phần
tử của danh sách có dữ liệu bản ghi (struct) gồm 3 field dau để ghi nhận đỉnh
đầu của cạnh, cuoi để ghi nhận đỉnh cuối của cạnh, trongso để ghi nhận trọng
số của cạnh.
- Dau, cuoi có giá trị từ 1,..,n là kí hiệu của đỉnh; trongso=wij nếu có cạnh nối
từ i đến j và wij=0 nếu i=i; trongso=∞ nếu không có cạnh nối từ i đến j (i≠j)
typedef struct Canh
{
int dau;
int cuoi;
int trongso;
};
Canh C[100];
2. Mảng 2 chiều để lưu trọng số, khoảng cách đường đi và đường đi (nếu cần)
giữa các cặp đỉnh.
typedef int matran[100][100];
3. Mảng 1 chiều để lưu độ lệch tâm của các đỉnh đồ thị
typedef int dslechtam[100];


2. Cài đặt giải thuật tìm cực tiểu tổng và cực tiểu trị lớn nhất
Một số hàm cài đặt thuật toán:
Đường đi nhỏ nhất giữa các cặp đỉnh đồ thị (thuật toán Floyd_Warshall):
Từ ma trận trọng số D thông qua thuật toán ta tìm được ma trận Dn là ma trận
đường đi nhỏ nhất giữa các cặp đỉnh.
void Floyd_Warshall(matran D,matran Dn,matran duongdi,int n)
{
//KHOI TAO
for (int i=0;iGVHD: PGS.TSKH Trần Quốc Chiến

Trang 16


Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

for (int j=0;j{
Dn[i][j]=D[i][j];
duongdi[i][j]=j+1;
}
//FLOYD-WARSHALL
for (int k=0;kfor (i=0;ifor (j=0;j{
if ((Dn[i][k]!=32767)&&(Dn[k][j]!=32767)&&(Dn[i][j]>Dn[i]
[k]+Dn[k][j]))

{
Dn[i][j]=Dn[i][k]+Dn[k][j];
duongdi[i][j]=duongdi[i][k];
}
}
}
Tính độ lệch tâm của các đỉnh: độ lệch tâm của các đỉnh chính là giá trị
lớn nhất trong mỗi hàng của ma trận đường đi Dn. L[i] là độ lệch tâm của
đỉnh i (i=1,2,…,n)
void tinhdolechtam(matran Dn,dslechtam L, int n)
{
int t;
for (int i=0;i{
t=0;
for (int j=0;jif (tL[i]=t;
}
}

GVHD: PGS.TSKH Trần Quốc Chiến

Trang 17


Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất


Tìm cực tiểu trị lớn nhất và các đỉnh: giá trị nhỏ nhất trong danh sách
lệch tâm chính là giá trị cực tiểu cần tìm và các đỉnh có giá trị lệch tâm
cực tiểu chính là tâm của đồ thị.
Tìm cực tiểu tổng lớn nhất và các đỉnh: giá trị nhỏ nhất trong danh sách
tổng các hàng tương ứng của ma trận khoảng cách là giá trị cực tiểu tổng
cần tìm.
3. Chương trình trên C++
Mục đích: Xây dựng một chương trình đọc file chứa đồ thị theo cấu trúc cho
trước, giải quyết bài toán và in kết quả ra file.
#include <conio.h>
#include <stdio.h>
#include <math.h>
#define VC 32767;
typedef struct Canh
{
int dau;
int cuoi;
int trongso;
};
typedef int matran[100][100];
typedef int dslechtam[100];
void Init(Canh C[],int &n, int &m)
{
FILE *f;
f=fopen("GRAPH.INP","r");
fscanf(f,"%d%d",&n,&m);
for (int i=0;i{
fscanf(f,"%d%d%d",&C[i].dau,&C[i].cuoi,&C[i].trongso);
}

fclose(f);
}

GVHD: PGS.TSKH Trần Quốc Chiến

Trang 18


Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

void matrantrongso(Canh C[],matran D,int n,int m)
{
/*Khoi tao*/
for (int i=0;ifor (int j=0;j{if (i==j) D[i][j]=0; else D[i][j]=VC; }
for (i=0;i{
D[C[i].dau-1][C[i].cuoi-1]=C[i].trongso;
D[C[i].cuoi-1][C[i].dau-1]=C[i].trongso;
}
}
void xuatmatran(matran D,int n)
{
for (int i=0;i{for (int j=0;j{ if (D[i][j]==32767) printf(" *");
else printf("%5d",D[i][j]);

}
printf("\n");
}
}
void Floyd_Warshall(matran D,matran Dn,matran duongdi,int n)
{
//KHOI TAO
for (int i=0;ifor (int j=0;j{
Dn[i][j]=D[i][j];
duongdi[i][j]=j+1;
}
//FLOYD-WARSHALL
for (int k=0;kfor (i=0;ifor (j=0;j{

GVHD: PGS.TSKH Trần Quốc Chiến

Trang 19


Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

if ((Dn[i][k]!=32767)&&(Dn[k][j]!=32767)&&(Dn[i][j]>Dn[i][k]
+Dn[k][j]))

{
Dn[i][j]=Dn[i][k]+Dn[k][j];
duongdi[i][j]=duongdi[i][k];
}
}
}
void tinhdolechtam(matran Dn,dslechtam L, int n)
{
int t;
for (int i=0;i{
t=0;
for (int j=0;jif (tL[i]=t;
}
}
// Tinh tong hang
private void SumRows()
{
S = new int[n + 1];
int s;
for (int i = 1; i <= n; i++)
{
s = 0;
for(int j = 1; j <= n ; j++)
s += Dn[i,j];
S[i] = s;
}
}

void cuctieu(dslechtam L,int n)
{ int min=VC;
FILE *f;
f=fopen("MINMAX.OUT","w");
for (int i=0;iif (min>L[i]) min=L[i];

GVHD: PGS.TSKH Trần Quốc Chiến

Trang 20


Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

fprintf(f,"%d\n",min);
for (i=0;iif (L[i]==min) fprintf(f,"%5d",i+1);
fclose(f);
}
void xuatketqua(dslechtam L,int n)
{
int min=VC;
for (int i=0;iif (min>L[i]) min=L[i];
printf("Cuc tieu tri lon nhat la: %d\n",min);
printf("Danh sach cac dinh cuc tieu: ");
for (i=0;iif (L[i]==min) printf("%5d",i+1);

}
void main()
{
int n,m;
matran D,Dn,duongdi;
dslechtam L;
Canh C[100];
Init(C,n,m);
clrscr();
matrantrongso(C,D,n,m);
Floyd_Warshall(D,Dn,duongdi,n);
tinhdolechtam(Dn,L,n);
cuctieu(L,n);
xuatketqua(L,n);
getch();
}

GVHD: PGS.TSKH Trần Quốc Chiến

Trang 21


Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

4. Chương trình trên C#
◊ Mục đích: Xây dựng một chương trình mô phỏng trực quan đồ thị và giải
quyết bài toán, đồng thời có thể đọc đồ thị từ file và in kết quả ra file.
◊ Giao diện:


◊ Chức năng của chương trình:
• Vẽ đồ thị đơn trực quan, bao gồm vẽ đỉnh, vẽ cạnh và trọng số. Hỗ trợ vẽ đồ
thị vô hướng, có hướng và hỗn hợp. Hiển thị danh sách cạnh sắp xếp theo
thứ tự đỉnh đầu và đỉnh cuối.
• Cho phép lưu đồ thị đã vẽ trên vùng làm việc vào file và mở lại đồ thị từ file
đã lưu trước đó.

GVHD: PGS.TSKH Trần Quốc Chiến

Trang 22


Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

• Giải bài toán Cực tiểu trị lớn nhất cho đồ thị đang hiển thị tại vùng làm
việc.
◊ Hướng dẫn sử dụng:
• Vẽ đỉnh: nhấn chuột lên vùng làm việc để vẽ một đỉnh.
• Vẽ cạnh:
o Bước 1: Chọn loại cạnh
hoặc
o Bước 2: Lần lượt nhấn chọn đỉnh đầu và đỉnh cuối của cạnh, sau đó
nhập trọng số cho cạnh.
• Xóa đồ thị: khi vẽ sai có thể xóa đồ thị để vẽ lại, khi đó nhấn
để xóa toàn bộ đồ thị trên vùng làm việc.
• Giải bài toán: nhấn nút
. Nếu giải

được bài toán thì chương trình sẽ hiển thị kết quả gồm ma trận đường đi
ngắn nhất giữa các cặp đỉnh (ma trận D), danh sách độ lệch tâm (ma trận L),
cực tiểu trị nhỏ nhất (M) và danh sách các đỉnh cực tiểu (tâm đồ thị).

GVHD: PGS.TSKH Trần Quốc Chiến

Trang 23


Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất

Ngược lại, chương trình sẽ xuất hiện thông báo sau khi không giải được bài
toán (trường hợp đồ thị không liên thông).

• Lưu đồ thị ra file: Nhấn nút
sổ chọn tên tập tin và thư mục để lưu.

GVHD: PGS.TSKH Trần Quốc Chiến

, chương trình sẽ xuất hiện cửa

Trang 24


Đồ án môn học Toán ứng dụng

Bài toán cực tiểu tổng và cực tiểu trị lớn nhất


• Mở đồ thị từ file: Nhấn nút
, chương trình sẽ xuất hiện cửa
sổ chọn tập tin để mở. Lưu ý rằng các tập tin này phải đúng cấu trúc do
chương trình xuất ra.

GVHD: PGS.TSKH Trần Quốc Chiến

Trang 25


×