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

Tiểu luận môn toán ứng dụng trong công nghệ thông tin Bài toán chọn địa điểm

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

Toán ứng dụng Bài toán chọn địa
điểm
MỤC LỤC
Tiểu luận nhóm 2
1
Toán ứng dụng Bài toán chọn địa
điểm
GIỚI THIỆU
Lý thuyết đồ thị là một lĩnh vực đã có từ lâu và có nhiều ứng dụng
hiện đại. Những tư tưởng cơ bản của lý thuyết đồ thị được đề xuất vào
những năm đầu của thế kỹ 18 bởi nhà toán học lỗi lạc người Thụy Sỹ
Lenhard Eurle. Chính ông là người đã sử dụng đồ thị để giải bài toán nổi
tiếng về các cái cầu ở thành phố Konigsberg.
Đồ thị được sử dụng để giải các bài toán trong nhiều lĩnh vực khác
nhau. Chẳng hạn, dùng đồ thị của mạng máy tinh có thể sử dụng để xác
định hai máy tính trong mạng có thể trao đổi thông tin được với nhau hay
không. Đồ thị có trọng số trên các cạnh có thể sử dụng để giải các bài toán
như: Tìm đường đi ngắn nhất giữa hai thành phố trong mạng giao thông.
Chúng ta cũng còn sử dụng đồ thị để giải các bài toán về lập lịch, thời khóa
biểu, và phân bố tần số cho các trạm phát thanh và truyền hình… và rất
nhiều lĩnh vực khác.
Trong tiểu luận này nhóm chúng tôi trình bày “Bài toán chọn địa
điểm”.
Tiểu luận nhóm 2
2
Toán ứng dụng Bài toán chọn địa
điểm
ĐỀ TÀI:
Bài toán chọn địa điểm.
NHÓM: 05 người
STT Họ tên


Công việc
(theo mục lục)
Chữ ký
Nhận xét của
giáo viên
1. Trần Lương Vương
2. Lê Công Vượng
3. Đặng Ngọc Tuấn
4. Nguyễn Nương Quỳnh
5. Lê Nam Trung
Tiểu luận nhóm 2
3
Toán ứng dụng Bài toán chọn địa
điểm
CHƯƠNG I
ĐẠI CƯƠNG VỀ ĐỒ THỊ
I. Các khái niệm cơ bản về đồ thị
- Đồ thị vô hướng G = (V,E) gồm một tập V các đỉnh và tậo 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ự).
- Đồ 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ự.
Cho đồ thị có hướng G=(V, E). Nếu 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 G.
Đồ 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), (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 đỉ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 co 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.
Tiểu luận nhóm 2
4
Toán ứng dụng Bài toán chọn địa
điểm
- Cạnh có hai đỉnh liên kết trung nhau gọi là khuyên.
- Đỉ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ị.
- Bậc của đỉnh v∈V là tổng số cạnh liên thuộc với nó và ký hiệu là
d(v). Nếu đỉnh có khuyên thì mỗi khuyên được tính là 2 khi tính bậc.
Từ định nghĩa trên suy ra đỉnh cô lập trong đồ thị đơn là đỉnh có bậc
bằng 0. Đỉnh treo là đỉnh có bậc bằng 1
- Cho G=(V,E) là đồ thị có hướng, v ∈ V. Nửa bậc ra của đỉnh v, ký
hiệu là d
O
(v), là số cung đi ra từ đỉnh v (v là đỉnh đầu), và nửa bậc vào của
đỉnh v, ký hiệu là d
I
(v), là số cung đi tới đỉnh v (v là đỉnh cuối).
II. Đườ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à dãy 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 n được biểu diễn như sau:

µ = (v, e
1
, v
1
, e
2
, v
2
, , v
n-1
, e
n
, w)
Trong đó vi (i = 1, ,n-1) là các đỉnh trên dãy và ei (i = 1, ,n) 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.
- 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 khoonh đi qua một đỉnh quá một lần.
- 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
, e
2
, , e
n
) thỏa mãn đỉnh cuối của cung e

i
là đỉnh đầu của cung
e
i+1
, i = 1, ,n-1.
Tiểu luận nhóm 2
5
Toán ứng dụng Bài toán chọn địa
điểm
- Đườ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ị có hướng được 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 của nó
đều có đường đi có hướng nối chúng với nhau.
- Đồ 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.
- Đồ 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ị con:
Cho đồ thị G=(V,E). Đồ thị G'=(V',E') gọi là đồ thị con phủ của G nếu
V' ⊂ V & E' ⊂ E

Nếu V’ = V, thì G’ gọi là đồ thị con phủ của G.
Đồ thị con G'=(V',E') của đồ thị (có hướng) G=(V,E) gọi là thành
phần liên thông (mạnh) của đồ thị G, tức là không tồn tại đồ thị con liên
thông (mạnh) G”=(V”,E”) ≠ G’ của G thỏa V’ ⊂ V”, E’ ⊂ E”.
III. Biểu diễn đồ thị
1. Ma trận kề
* Đồ thị vô hướng
Cho đồ thị vô hướng G=(V,E) có n đỉnh theo thứ tự v
1
, v
2
, , v
n
. Ma
trận kề của đồ thị G là ma trận vuông A=(a
Þj
)
nxn
, trong đó a
ij
là số cạnh nối
v
i
với v
j
. Lưu ý rằng mỗi khuyên được tính là 2 cạnh.
Tiểu luận nhóm 2
6
Toán ứng dụng Bài toán chọn địa
điểm

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ụ. Xét đồ thị vô hướng
v
1
v
2
v
3
v
4
v
5
có ma trận kề là
v
1
v
2
v
3
v
4
v
5
v
1
0 1 0 0 1
v
2
1 0 1 0 1

v
3
0 1 2 0 1
v
4
0 0 0 0 1
v
5
1 1 1 1 0
* Đồ thị có hướng
Cho đồ thị có hướng G=(V,E) có n đỉnh theo thứ tự v
1
, v
2
, , v
n
. Ma
trận kề của đồ thị G là ma trận vuông A=(a
ij
)
nxn
, trong đó a
ij
là số cung đi từ
v
i
tới v
j
.
Ví dụ. Xét đồ thị có hướng

v
2
v
6

e
1
e
4
e
6
v
1
e
3
v
4
e
2
e
8
e
5
e
7
v
3
v
5
có ma trận kề là

v
1
v
2
v
3
v
4
v
5
v
6
v
1
0 1 1 0 0 0
v
2
0 0 1 1 0 0
v
3
0 0 0 1 0 0
v
4
0 0 0 0 1 1
v
5
0 0 0 0 0 1
v
6
0 0 0 0 0 0

2. Ma trận liên thuộc
Tiểu luận nhóm 2
7
Toán ứng dụng Bài toán chọn địa
điểm
* Đồ thị vô hướng
Cho đồ thị G=(V,E) có n đỉnh, V={v
1
, v
2
, , v
n
} và m cạnh E={e
1
,
e
2
, , e
m
}. Ma trận liên thuộc của đồ thị G là ma trận A=(a
Þj
)
nxm
thỏa mãn
1, nếu đỉnh v
i
liên thuộc cạnh e
j
a
ij

=
0, nếu đỉnh v
i
không liên thuộc cạnh e
j
Ví dụ. Xét đồ thị v
1
e
1
v
2
e
3
e
4
e
2
e
5
v
3
e
7
v
4
e
6
v
5
có ma trận liên thuộc là

e
1
e
2
e
3
e
4
e
5
e
6
e
7
v
1
1 1 0 0 0 0 0
v
2
1 0 1 1 0 0 0
v
3
0 0 0 1 1 0 1
v
4
0 0 0 0 0 1 0
v
5
0 1 1 0 1 1 0
* Đồ thị có hướng

Cho đồ thị có hướng không khuyên G=(V,E) có n đỉnh, V={v
1
, v
2
, ,
v
n
} và m cung E={e
1
, e
2
, , e
m
}. Ma trận liên thuộc của đồ thị G là ma trận
A=(a
ij
)
nxm
thỏa mãn1, nếu đỉnh v
i
là đỉnh đầu của cung e
j
a
Þj
= -1, nếu đỉnh v
i
là đỉnh cuối của cung e
j
0, nếu đỉnh v
i

không liên thuộc cung e
j
Ví dụ. Xét đồ thị có hướng
v
2
v
6
e
1
e
4
e
6
v
1
v
4
e
3
e
8
e
2

e
5
e
7
v
3

v
5
có ma trận liên thuộc là
e
1
e
2
e
3
e
4
e
5
e
6
e
7
e
8
v
1
1 1 0 0 0 0 0 0
v
2
-1 0 1 1 0 0 0 0
Tiểu luận nhóm 2
8
Toán ứng dụng Bài toán chọn địa
điểm
v

3
0 -1 -1 0 1 0 0 0
v
4
0 0 0 -1 -1 1 1 0
v
5
0 0 0 0 0 0 -1 1
v
6
0 0 0 0 0 -1 0 -1
3. 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
thỏa 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).
Cách biểu diễn đồ thị bằng danh sách cạnh (cung) 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 dồ 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 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ị).
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ụ. Xét đồ thị vô hướng:
v
1
v
2
v

3
v
4
v
5
Có danh sách cạnh là:
(v
1
, v
2
), (v
1
, v
5
), (v
2
, v
3
), (v
2
, v
5
), (v
3
, v
3
), (v
3
, v
5

), (v
4
, v
5
)
Được lưu trữ bởi các mảng dau[e], cuoi[e] với e = 1, ,7 như sau
Cạnh 1 2 3 4 5 6 7
Đầu V
1
V
1
V
2
V
2
V
3
V
3
V
4
Cuối V
2
V
5
V
3
V
5
V

3
V
5
V
5
Ví dụ. Xét đồ thị có hướng:
v
2
v
6
e
1
e
4
e
6
v
1
v
4
e
3
e
8
Tiểu luận nhóm 2
9
Toán ứng dụng Bài toán chọn địa
điểm
e
2



e
5
e
7
v
3
v
5
có danh sách cung là
(v
1
, v
2
), (v
1
, v
3
), (v
2
, v
3
), (v
2
, v
4
), (v
3
, v

4
), (v
4
, v
5
), (v
4
, v
6
), (v
5
, v
6
)
Được lưu trữ bởi các mảng dau[e], cuoi[e] với e = 1, ,8 như sau
Cung 1 2 3 4 5 6 7 8
Đầu V
1
V
1
V
2
V
2
V
3
V
4
V
4

V
5
Cuối V
2
V
3
V
3
V
4
V
4
V
5
V
6
V
6
4. 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ó, ta ký hiệu là
Ke(v) = {u ∈ V | (v,u )∈ E}
Khi đó vòng lặp thực hiện với mỗi 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>
Ví dụ: Xét đồ thị vô hướng:
v
1

v
2
v
3
v
4
v
5
có danh sách kề là:
Ke[1]
Ke[2]
Ke[3]
Ke[4]
Tiểu luận nhóm 2
2 5 nil
5 nil
1 3 5 nil
2 3 5 nil
1 2l 3 4 nil
10
Toán ứng dụng Bài toán chọn địa
điểm
Ke[5]
Tiểu luận nhóm 2
11
Toán ứng dụng Bài toán chọn địa
điểm
Ví dụ: Xét đồ thị có hướng:
v
2

v
6
e
1
e
4
e
6
v
1
v
4
e
3
e
8
e
2


e
5
e
7
v
3
v
5
có danh sách kề là:
Ke[1]

Ke[2]
Ke[3]
Ke[4]
Ke[5]
Ke[6] = nil
Tiểu luận nhóm 2
2 3 nil
4 nil
3 4 nil
5 6 nil
6 nil
12
Toán ứng dụng Bài toán chọn địa
điểm
CHƯƠNG II
THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT TRÊN ĐỒ THỊ
I. Thuật toán tìm đường đi ngắn nhất
1. Bài toán tìm đường đi ngắn nhất
Bài toán tìm đường đi ngắn nhất là bài toán quan trọng trong Lý
thuyết đồ thị, nó được áp dụng để giải quyết rất nhiều bài toán trong thực tế
như điều khiển tối ưu, giao thông vận tải, mạng viễn thông
Phát biểu bài toán:
Cho đồ thị có trọng số G = (V,E,w). Ký hiệu w(i,j) là trọng số của
cạnh (i,j). Độ dài đường đi μ = v0 → v1→ v2 →…→ vn-1 → vn
Là tổng các trọng số L(μ) =

=

n
i

ii
vvw
1
1
),(
Cho hai đỉnh a và z của đồ thị. Bài toán đặt ra là tìm đường đi ngắn
nhất từ a đến z.
2. Thuật toán Dijkstra
Thuật giải tìm đường đi ngắn nhất từ đỉnh a đến đỉnh z trong đồ thị có
trọng số. Trọng số của cạnh (i,j) là w(i,j) > 0 và đỉnh x sẽ mang nhãn L(x).
Khi kết thúc thuật giải L(z) chính là chiều dài ngắn nhất từ a đến z.
Thuật toán:
Đầu vào: Đồ thị G = (V,E,w) có trọng số w(i,j) > 0 với mọi cạnh (i,j),
đỉnh a và z.
Đầu ra: L(z) chiều dài đường đi ngắn nhất từ a đến z, và đường đi
ngắn nhất (nếu có).
Phương pháp:
B1. Khởi tạo: Gán L(a) = 0. Với mọi đỉnh x ≠ a gán L(x) := ∞. Đặt
T := V.
B2. Tính m = min{L(u)| u

T}
Nếu m = +∞, kết thúc, kết luận không có đường đi từ a đến z.
Ngược lại, nếu m < +∞, chọn v

T sao cho L(v) = m.
Đặt T := T – {v}
Tiểu luận nhóm 2
13
Toán ứng dụng Bài toán chọn địa

điểm
B3. Nếu z = v, kết thúc, L(z) là chiều dài đường đi ngắn nhất từ a đến
z.
Từ z lần ngược theo đỉnh được ghi nhớ ta có đường đi ngắn nhất.
Ngược lại, nếu z ≠ v, sang bước 4.
B4. Với mỗi x

T kề sau v, nếu L(x) > L(v) + w(v,x), thì gán
L(x) := L(v) + w(v,x)
Và ghi nhớ đỉnh v cạnh đỉnh x để sau này xây dựng đường đi ngắn
nhất. Quay về bước 2.
Chứng minh:
Ký hiệu lần lượt các đỉnh v chọn ở Bước 2 là v
0
= a, v
1
, ,v
m
= z. Ta
chứng minh bằng quy nạp rắng L(v
i
) chính là độ dài đường đi ngắn nhất từ
a đến v
i
, i = 1, ,m.
- Bước cơ sở: Hiển nhiên L(v
1
) là độ dài ngắn nhất từ a đến v
1
.

- Bước quy nạp: Giả thiết L(v
i
) chính là độ dài đường đi ngắn nhất từ a
đến v
i
với mọi i < k. Ta chứng minh rằng L(v
k
) là độ dài đường đi ngắn
nhất từ a đến v
k
.
Gọi P là đường đi ngắn nhất từ a đến v
k
có độ dài l(P). Các đỉnh trên P
trừ v
k
phải thuộc
S = {v
1
, v
2
, , v
k-1
}
Giả sử, ngược lại, gọi u là đỉnh đầu tiên trên P không thuộc S và v
thuộc S là đỉnh trước u. Hiển nhiên
L(u) ≤ L(v) + w(v,u) < L(v
k
)
Nên u phải bị loại khỏi T ở bước 2 trước v

k
, tức u thuộc S. Đây là điều
mâu thuẫn.
Gọi v
h
là đỉnh trước vk trên P. Theo cách tính lại nhãn ta có
L(v
k
) ≤ L(v
h
) + w(v
h
,v
k
) = l(P)
Suy ra, L(v
k
) là độ dài đường đi ngắn nhất từ a đến v
k
.
2. Thuật toán Floyd-Warshall
Thuật toán tìm đường đi ngắn nhất giữa mọi cặp đỉnh trong đồ thị (có
hướng) có trọng số.
Thuật toán:
Tiểu luận nhóm 2
14
Toán ứng dụng Bài toán chọn địa
điểm
Đầ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)], 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).
Phương pháp:
B1. Khởi tạo: Ký hiệu D
0
là ma trận xuất phát
D
0
= [d
0
(i,j)]
Trong đó d
0
(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ì d
0
(i,j) = +∞).
P
0
= [p
0
(i,j)]
Trong đó p
0
(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.
B2. Kiểm tra kết thúc:
Nếu k = n, kết thúc. D = D
n
là ma trận độ dài đường đi ngắn nhất, P =
P
n
.
Ngược lại, nếu k < n, tăng k lên 1 đơn vị và sang bước 3.
B3. Tính ma trận D
k
và P
k
theo D
k-1
và P
k-1
:
Với mọi cặp (i,j), i = 1 n, j = 1 n thực hiện:
Nếu d
k-1
(i,j) > d
k-1
(i,k) + d
k-1
(k,j) thì đặt
d
k
(i,j) = d
k-1

(i,k) + d
k-1
(k,j)
và p
k
(i,j) = p
k-1
(i,k)
ngược lại đặt d
k
(i,j) = d
k-1
(i,j) và p
k
(i,j) = p
k-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, i
1
, i
2
, i
3
, …, i
k
, i
k+1

,…, i
m
, j
Thỏa mãn
i
1
= p(i,j), i
2
= p(i
1
,j),…, i
k+1
= p(i
k
,j), …,j = p(i
m
,j)
Chứng minh:
* Chứng minh D là ma trận độ dài đường đi ngắn nhất.
Tiểu luận nhóm 2
15
Toán ứng dụng Bài toán chọn địa
điểm
Ta chứng minh, bằng quy nạp theo k, mệnh đề sau:
d
k
(i,j) là chiều dài đường đi ngắn nhất trong những đường nối đỉnh i
đến j qua các đỉnh trung gian {1, 2, …, k}.
- Bước cơ sở: Hiển nhiên mệnh đề đúng với k = 0.
- Bước quy nạp: Giả sử mệnh đề đúng với k-1. Xét d

k
(i,j)
Sẽ xảy ra một trong hai trường hợp sau:
a) Trong các đường nối đỉnh I với j qua các đỉnh trung gian {1, 2,
…,k-1, k} có chiều dài ngắn nhất, tồn tại một đường p không qua đỉnh k.
Khi đó p cũng là đường ngắn nhất nối đỉnh I với j qua các đỉnh trung gian
{1, 2, …, k-1}, nên theo giả thiết quy nạp
d
k-1
(i,j) = d(p) <= d
k-1
(i,k) + d
k-1
(k,j)
Do đó theo cách tính dk ta có d
k
(i,j) = d
k-1
(i,j) = d(p) là độ dài đường đi
ngắn nhất từ I đến j qua các đỉnh trung gian {1, 2, …,k-1, k}.
b) Mọi đường nối đỉnh I với j qua các đỉnh trung gian {1, 2, …,k-1, k}
có chiều dài ngắn nhất đều qua đỉnh k. Gọi p = (i,…,k,…,j) là một đường
ngắn nhất nối đỉnh i với đỉnh j qua các đỉnh trung gian {1,2,…,k-1,k}. Khi
đó đoạn (i,…k) và (k,…j) cũng phải là các đường đi ngắn nhất qua các đỉnh
trung gian {1,2,…,k-1}. Ta có:
d
k-1
(i,k) + d
k-1
(k,j) = d(p) < d

k-1
(i,j)
Do đó, theo cách tính d
k
ta có d
k
(i,j) = d
k-1
(i,k) + d
k-1
(k,j) = d(p) là độ
dài đường đi ngắn nhất từ I đến j qua các đỉnh trung gian {1,2,…,k-1,k}.
* Bây giờ ta cần chứng mình thêm rằng phương pháp xây dựng đường
đi theo ma trận P như ở thuật toán thực sự cho đường đi ngắn nhất.
Với mỗi cặp đỉnh (i,j) có d
k
(i,j) < +∞ , ký hiệu:
m
k
(i,j) = (i, i
1
, i
2
, i
3
, …, i
h
, i
h+1
, …, i

m
, j)
là đường đi từ đỉnh i đến j được xây dựng trên cơ sở ma trận P
k
như
sau:
i
1
= pk(i,j), i
2
= p
k
(i
1
,j), …, i
h+1
= p
k
(i
h
,j), …, p
k
(i
m
,j) = j
Tiểu luận nhóm 2
16
Toán ứng dụng Bài toán chọn địa
điểm
Tiểu luận nhóm 2

17
Toán ứng dụng Bài toán chọn địa
điểm
CHƯƠNG III
BÀI TOÁN CỰC TIỂU TỔNG, CỰC TIỂU TRỊ LỚN NHẤT
TRÊN ĐỒ THỊ
Bài toán tìm địa điểm đặt cơ sở dịch vụ trong cộng đồng (trường học,
bưu điện, phòng cháy chữa cháy, ) sao cho kinh tế và hiệu quả nhất có
nhiều ứng dụng trong thực tế. Bài toán này thường được mô hình hóa 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.
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.
I. Bài toán tìm cực tiểu tổng, cực tiểu trị lớn nhất trên đồ thị
1. Bài toán cực tiểu tổng trên đồ thị
Một dự án xây dựng khu đô thị mới X bao gồm N-1 khu chung cư và
01 trường học tại N địa điểm xây dựng. Các địa điểm xây dựng được đánh
số từ 1 đến N. Giữa các địa điểm xây dựng đều có đường đi hai chiều nối
với nhau.
Yêu cầu: Tìm địa điểm để xây xựng trường học trong N địa điểm sao
cho Tổng khoảng cách từ N-1 khu dân cư đến trường học là bé nhất.
2. Bài toán cực tiểu trị lớn nhất trên đồ thị
Một dự án xây dựng khu đô thị mới Z bao gồm N-1 khu chung cư và
01 Trung tâm phòng cháy chữa cháy tại N địa điểm xây dựng. Các địa điểm
xây dựng được đánh số từ 1 đến N. Giữa các địa điểm xây dựng đều có

đường đi hai chiều nối với nhau.
Tiểu luận nhóm 2
18
Toán ứng dụng Bài toán chọn địa
điểm
Yêu cầu: Tìm địa điểm để xây xựng Trung tâm phòng cháy chữa cháy
trong N địa điểm sao cho khoảng cách xa nhất từ Trung tâm phòng cháy
chữa cháy đến một khu chung cư bất kỳ là nhỏ nhất.
3. Dữ liệu vào ra cho cả hai bài toán cực tiểu tổng và cực tiểu trị
lớn nhất trên đồ thị
Dữ liệu vào: Cho trong file văn bản GRAPH.INP có cấu trúc như sau:
Dòng 1: Ghi 2 số nguyên dương N, M, trong đó N là số đỉnh, M là số
cạnh.
M dòng tiếp theo: Mỗi dòng ghi 3 số i, j, t, trong đó i là đỉnh đầu, j là
đỉnh cuối và t là độ dài đường đi trực tiếp từ đỉnh i đến đỉnh j (trọng số).
Dữ liệu ra: Ghi ra file văn bản MINSUM.OUT theo cấu trúc:
Dòng 1: Ghi giá trị S là tổng giá trị đường đi đường đi ngắn nhất giữa
N - 1 khu dân cư đến vị trí xây dựng trường học.
Dòng 2: Ghi v
1
,v
2
, ,v
k
, Các vị trí có thể xây dựng trường học (các
đỉnh cực tiểu tổng).
Dòng 3: Ghi giá trị M là khoảng cách xa nhất từ Trung tâm phòng
cháy chữa cháy đến một khu chung cư bất kỳ là ngắn nhất (Cực tiểu trị lớn
nhất).
Dòng 4: Ghi v

1
,v
2
, ,v
m
, Các vị trí có thể xây dựng Trung tâm phòng
cháy chữa cháy (các đỉnh cực tiểu trị lớn nhất).
II. Thuật toán tìm cực tiểu tổng, cực tiểu trị lớn nhất trên đồ thị
1. Thuật toán tìm cực tiểu tổng trên đồ thị
Gọi ma trận A[N, N] là ma trân trọng số lưu khoảng cách từ địa điểm
xây dựng i đến địa điểm xây dựng j (1<= i, j <= N; 1 < N <= 100).
Ta dùng thuật toán Floyd-Warshall để tìm cực tiểu tổng trên đồ thị:
{Xây dựng ma trận đường đi ngắn nhất}
For k:=1 to N do
For i:=1 to N do
For j:=1 to N do
if (A[i,j] > A[i,k] + A[k,j]) then
A[i,j]:=A[i,k] + A[k,j];
Tiểu luận nhóm 2
19
Toán ứng dụng Bài toán chọn địa
điểm
{Tìm cực tiểu Tổng}
Min:=+∞;
For i:=1 to N do
Begin
Tong :=0;
For j:= 1 to N do
If i <> j then
Tong:= Tong + A[i, j];

If Min > Tong then
Begin
Min := Tong;
PosSave := i;
End;
End;
Writeln(f,Min);
For i:=1 to N do
Begin
Tong :=0;
For j:= 1 to N do
If i <> j then
Tong:= Tong + A[i, j];
If Min = Tong then Write(f,i, ' ');
End;
2. Thuật toán tìm cực tiểu trị lớn nhất trên đồ thị
Gọi ma trận A[N, N] là ma trân trọng số lưu khoảng cách từ địa điểm
xây dựng i đến địa điểm xây dựng j (1<= i, j <= N; 1 < N <= 100).
Ta dùng thuật toán Floyd-Warshall để tìm cực tiểu tổng trên đồ thị:
{Xây dựng ma trận đường đi ngắn nhất}
For k:=1 to N do
For i:=1 to N do
For j:=1 to N do
if (A[i,j] > A[i,k] + A[k,j]) then
A[i,j]:=A[i,k] + A[k,j];
{Tìm cực tiểu trị lớn nhất}
Min:=+∞;
For i:=1 to N do
Begin
Tiểu luận nhóm 2

20
Toán ứng dụng Bài toán chọn địa
điểm
Max :=-∞;
For j:= 1 to N do
If Max < A[i, j] then
Max := A[i, j];
If Min > Max then
Begin
Min := Max;
PosSave := i;
End;
End;
Writeln(f,Min);
For i:=1 to N do
Begin
Max :=-∞;
For j:= 1 to N do
If Max < A[i, j] then
Max := A[i, j];
If Min = Max then Write(f,i,' ');
End;
Tiểu luận nhóm 2
21
Toán ứng dụng Bài toán chọn địa
điểm
CHƯƠNG IV
THIẾT KẾ VÀ CÀI ĐẶT CHƯƠNG TRÌNH
I. Thiết kế cấu trúc dữ liệu và giải thuật tìm cực tiểu tổng, cực tiểu
trị lớn nhất.

Sử dụng ma trận A kích thước N x N để lưu trữ dữ liệu vào (Độ dài
đường đi giữa các địa điểm xây dựng).
Sử dụng luôn ma trận A kích thước N x N để lưu trữ kết quả đường đi
ngắn nhất khi chạy thuật toán Floyd - Warshall.
Sử dụng ma trận L kích thước N x N để lưu trữ các đỉnh trung gian
trong đường đi ngắn nhất của thuật toán Floyd - Warshall.
II Cài đặt chương trình
Program Floyd_Warshall;
Const fi='GRAPH.INP';
fo='MINSUM.OUT';
MaxN=101;
VC=2147483647;
Type mmc=Array[0 MaxN] of Longint;
mhc=Array[0 MaxN] of mmc;
Var A:mhc;L:^mhc;
N,M,Top:Byte;
Procedure Read_Data;
Var f:Text; k,i,j:Byte; t:Longint;
Begin
Assign(f,fi);
Reset(f);
Fillchar(A,Sizeof(A),0);
Readln(f,N,M);
For k:=1 to M do
Begin
Tiểu luận nhóm 2
22
Toán ứng dụng Bài toán chọn địa
điểm
Readln(f,i,j,t);

A[i,j]:=t;
A[j,i]:=t;
End;
For i:=1 to N do
For j:=1 to N do
If A[i,j] = 0 then A[i,j] := VC;
Close(f);
End;
Procedure Solution;
Var i,j,k:Byte;
Begin
New(L);
fillchar(L^,sizeof(L^),0);
For K:=1 to N do
For i:=1 to N do
For j:=1 to N do
if (A[i,k] < VC) and (A[k,j] < VC) then
if (A[i,j] > A[i,k] + A[k,j]) then
Begin
A[i,j]:=A[i,k] + A[k,j];
L^[i,j]:=k;
End;
End;
Procedure Write_Data;
Var f:Text;i,j:Byte;
Min,Max,Tong:Longint;
MinPos,MaxPos,PosSave:Byte;
Begin
Assign(f,fo);
Rewrite(f);

Tiểu luận nhóm 2
23
Toán ứng dụng Bài toán chọn địa
điểm
{Tim cuc tieu Tong}
Min:=VC;
For i:=1 to N do
Begin
Tong :=0;
For j:= 1 to N do
If i <> j then
Tong:= Tong + A[i, j];
If Min > Tong then
Begin
Min := Tong;
PosSave := i;
End;
End;
Writeln(f,Min);
For i:=1 to N do
Begin
Tong :=0;
For j:= 1 to N do
If i <> j then
Tong:= Tong + A[i, j];
If Min = Tong then Write(f,i, ' ');
End;
Writeln(f);
{Tim cuc tieu tri lon nhat}
Min:=VC;

For i:=1 to N do
Begin
Max :=-VC;
For j:= 1 to N do
If Max < A[i, j] then
Tiểu luận nhóm 2
24
Toán ứng dụng Bài toán chọn địa
điểm
Max := A[i, j];
If Min > Max then
Begin
Min := Max;
PosSave := i;
End;
End;
Writeln(f,Min);
For i:=1 to N do
Begin
Max :=-VC;
For j:= 1 to N do
If Max < A[i, j] then
Max := A[i, j];
If Min = Max then Write(f,i,' ');
End;
Close(f);
End;
BEGIN
Read_Data;
Solution;

Write_Data;
END.
Tiểu luận nhóm 2
25

×