| BO GIAO DUC VA DAO TAO
TRUONG DAI HOC VINH
PHAN DUC DUNG
BAI TOAN TIM DUONG DI NGAN NHAT GIUA
HAI DINH TRONG DA GIAC DON DIEU
LUAN VAN THAC Si TOAN HOC
VINH - 2009
Trang 2
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC VINH
PHAN ĐỨC DŨNG
BÀI TỐN TÌM ĐƯỜNG ĐI NGẮN NHẤT GIỮA HAI DINH TRONG DA GIAC DON DIEU
CHUYEN NGANH: HINH HOC - TOPO
MA SO: 60 46 10
LUAN VAN THAC Si TOAN HOC
Người hướng dẫn khoa học:
PGS TS PHAN THÀNH AN
VINH - 2009
Trang 3MỤC LỤC
Trang
„70001 1
CHƯƠNG I KIẾN THỨC CƠ SỞ - 2: 2£©£+EEE+2EE£+EEE2+EEz+Evzeee 3
1.1 Độ phức tạp của thuật tOán - 5+ + +e£sk+kkekerekekeeerereereree 3 1.2 _ Đa giác đơn, đường gấp khúc đơn điệu và đa giác đơn điệu 8
1.3 Tập lồi, bao lồi và điểm cực biên - + ++s+++z+x+xexexezerererxr+ 9
1.4 _ Thuật toán tăng đần + +2 ++ + x+e SE ++tEEekrerrrrersrreerereeree 11 1.5 Ly thuryét d6 thie ee eeeeecseeeeeeesscseeeeeneceeeetseeesesesseseeeeeeaeaes 12
1.6 Tam gidc phan da giấc ƠH - <6 «+ vvvvrrvcree 17 1.6.1 Định nghĩa và tính Chất - - 5+ +++£++xE+eEeetesereereereserrersee 17
1.6.2 Thuật toán tam giác phân đa giác đơn - - «+ «=+s=+sx++ee+xe 18
CHƯƠNG II THUẬT TỐN TÌM ĐƯỜNG ĐI NGẮN NHẤT GIỮA
HAI ĐIỂM TRONG ĐA GIAC DON CUA LEE VA PREPARATA 21
2.1 Thuật toán tìm hình ống tay . - 5+ «5+ ++e£+x++x+eeeexeeeerrerers 21
2.2 Thuật toán phễu - ¿2+ +++E++**E+k+E++EeEeEeEEkrxrerrkrrerereree 22 2.2.1 Khái niệm phễu -¿- ¿+ +5 ++++E+E*#E*E+E+E++EeEekerkrxrerrerrerersree 22 2.2.2 Thuật toán phu -¿- + 5 2+3 SE SE£E£E£E+SEeEeEeEEkrxrkrrrrerereree 23
2.3 Thuat todin Chimh 24
CHUONG III THUAT TOAN DUNG BAO LOI LAM DINH HUONG TÌM ĐƯỜNG NGẮN NHẤT GIỮA HAI ĐỈNH TRONG ĐA GIÁC DON DIEU
3.1 Thuật toán con tìm bao lồi tiền vi phạm . 55555 +ssssss++ 27 3.1.1 Mô tả bao lồi tiền vi phạm ¿+ tt eveerereeerreresee 27 3.1.2 Thuật toán con tìm bao lồi tiền vi phạm . 555555 ++s5ss+s++ 28
3.2 Thuật toán con tìm linK «s9 vn ve 28
Trang 5Hình I: Hình 2: Hình 3: Hình 4: Hình 5: DANH SÁCH HÌNH VẼ
Minh họa thuật toán tìm tiếp tuyếnn -++s>++++x+ex+e+es+ 11
Minh hoa thuật toán Dijkstra
Minh họa đường đi ngắn nhất giữa hai đỉnh trong đa giác đơn điệu 26 Minh họa thuật toán FQ(‹ ,Y ) tìm bao lồi tiền vi phạm
Trang 6MỞ ĐẦU
Hình học tính toán là lĩnh vực nghiên cứu để tìm ra các thuật toán hiệu
quả và thực thi trên máy tính cho những bài toán tối ưu hình học Đường đi
ngắn nhất Euclidean giữa hai điểm trong đa giác đơn là vấn đề cơ bản trong hình học tính toán Năm 1984, trong [13] và [17], Lee và Preparata đã đưa ra một thuật toán tìm đường đi ngắn nhất giữa hai điểm trong đa giác đơn có độ phức tạp thuật toán là @(z) bằng cách sử dụng tam giác phân đa giác Nam
2008, trong [9] và [10], Phan Thành An không cần quá trình tam giác phân đa giác tìm đường đi ngắn nhất giữa hai đỉnh trong đa giác đơn điệu Một số chi tiết bài toán đường đi ngắn nhất giữa hai đỉnh trong đa giác đơn điệu được
trinh bay trong [5]
Trong luận văn này chúng tôi nghiên cứu “Bài toán tìm đường đi ngắn
nhất giữa hai đỉnh trong đa giác đơn điệu”, cụ thể trình bày chỉ tiết hai thuật toán của Lee và Preparata và của Phan Thành An dùng bao lồi làm định hướng
(được trình bày lần đầu tiên trong [9] và [10]) tìm đường ngắn nhất giữa hai
đỉnh trong đa giác giác đơn điệu Luận văn gồm ba chương
Chương I: Kiến thức cơ sở
Trong chương này chúng tôi nêu hệ thống một số kiến thức và một thuật toán về tìm bao lồi của tập hữu hạn điểm, tam giác phân đa giác đơn, đường đi ngắn nhất trong đồ thị trọng số, .để làm cơ sở cho các chương sau
Chương II: Thuật toán tìm đường đi ngắn nhất giữa hai điểm trong đa giác đơn của Lee va Preparata
Trong chương này chúng tơi trình bày thuật tốn tìm hình ống tay và thuật toán phễu của Lee và Preparata tìm đường đi ngắn nhất giữa hai điểm
trong đa giác đơn nhưng có sự cải tiến của Guibas, Hershberger, Leven,
Trang 7Chương III: Thuật toán dùng bao lôi làm định hướng tìm đường đi
ngắn nhất giữa hai đỉnh trong đa giác đơn điệu
Trong chương này chúng tơi trình bày thuật tốn tìm bao lồi tiền vi phạm, thuật toán tìm Link của bài toán tìm đường đi ngắn nhất giữa hai đỉnh trong đa giác đơn điệu dùng bao lồi làm định hướng Dựa vào một số tính chất đơn điệu của đa giác, bao lồi tiền vi phạm, .trong [5], trình bày thuật toán chính sử
dụng bao lồi làm định hướng để giải bài toán tìm đường đi ngắn nhất giữa hai
đỉnh trong đa giác đơn điệu
Luận văn được hoàn thành dưới sự hướng dẫn tận tình của thầy giáo PGS TS Phan Thành An Tác giả xin được bày tỏ lòng biết ơn sâu sắc tới Thầy, người đã hướng dẫn, giúp đỡ tác giả trong quá trình thực hiện đề tài
Tác giả xin chân thành cảm ơn các Thầy PGS TS Nguyễn Hữu Quang, PGS TS Phạm Ngọc Bội, TS Nguyễn Duy Bình là những người hết sức quan
tâm giảng dạy cũng như động viên tác giả trong quá trình học tập
Tác giả xin chân thành cảm ơn đến các Giáo sư, phó Giáo sư, Tiến sĩ Khoa Đào tạo Sau Đại học Trường Đại học Vinh, Viện Toán học, những người
đã tham gia quản lý, giảng dạy, giúp đỡ và hướng dẫn tác giả trong suốt quá trình học tập, nghiên cứu
Tác giả xin cảm ơn anh Dương Quốc Nam, anh Đoàn Văn Thanh (Khoá 14) và gia đình, bạn bè, đồng nghiệp đã động viên khích lệ và giúp đỡ tác giả trong quá trình học tập cũng như hoàn thành luận văn này
Mặc dù rất cố gắng trong quá trình học tập, nghiên cứu nhiều tài liệu cũng như tham khảo nhiều ý kiến trong quá trình viết và hoàn thành luận văn, nhưng luận văn khó tránh khỏi những thiếu sót, rất mong nhận được ý kiến đóng góp của của hội đồng chấm luận văn Thạc sĩ Toán - Trường Đại học Vinh, những ý kiến trao đổi của đồng nghiệp về nội dung luận văn này
Vĩnh, tháng 12 năm 2009
Trang 8Chương I
KIẾN THỨC CƠ SỞ
1.1 Độ phức tạp của thuật toán 1.1.1 Các định nghĩa và tính chất
Độ phức tạp của thuật toán là những thước đo để so sánh tính hiệu quả của thuật toán Một thước đo hiệu quả đó là thời gian máy tính sử dụng để
giải bài toán theo thuật toán đang xét, khi các giá trị đầu vào có một kích
thước xác định Một thước đo thứ hai đó là bộ nhớ đồi hỏi thực hiên thuật
toán đó khi giá trị đầu vào có kích thước cho trước Gắn liên với thời gian
tính toán của thuật toán là độ phức tạp thời gian Biết được độ phức tạp thời gian cho một thuật toán rất quan trọng, vì khi đó ta biết được thời gian là một
phút, một năm, một ti năm để thực hiện thuật toán đó
Để tính toán độ phức tạp của thuật toán ta chỉ xét những hàm thực #N ¬>R xác định trên tập số nguyên dương và hầu như dương làm công cụ do Nghĩa là tồn tại một số nguyên dương n, sao cho fin) > 0 véi moi n > nạ Kí hiệu F là tập hợp tất cả các hàm như vậy
Định nghĩa 1.1.1 (Xem [2]) Cho ham s6 g(n)eF, ta dinh nghia O(g(n))
1a mot tap hgp tat ca cdc ham f(n)eF cé tinh chat: T6n tai hang s6 c va ny sao
cho v6i moi n>n, thi f(n) <c.g(n)
Néu f(1) € O(g(n)), thì ta nói rằng ƒ(n) là Ô lớn của g(n)
Những hàm thuộc Ó thường dùng như bị chặn dưới của hàm thực hiện
tính toán trong thuật toán để giải một bài toán
Người ta dùng kí hiệu ƒ{n) = g(n)+O(h(n)), nghĩa là ƒ(n)-g(n) = O(h0)) Định nghĩa 1.1.2 (Xem [2]) Cho hàm số s(¡) 6F, ta định nghĩa Ø(e())
là tập hợp tất cả các hàm ƒ{n) F có tính chất: Tồn tại hằng số c¡, c; và nạ sao
Trang 9Định nghĩa 1.1.3 (Xem [2]) Cho hàm số g(n)eF, ta dinh nghĩa O(g())
là tập hợp tất cả các hàm ƒ{z)eE có tính chất: Tồn tại hằng số dương c và nụ
sao cho v6i moi n>nNp thi c.g(n) <f(n)
Nếu ƒn) e O(e(n)), thì ta ndi rang f(7) 1a Ô mê ga lon cua g(n)
Mệnh đề 1.1.1 (Xem [2]) Néu f,(n)eO(g,(n)) va f(n)€O(g,(n)) thi
filn)+f(n)<O(g,(n)+2,(n))
Mệnh đề 1.1.2 (Xem [2]) Néu f,(n)eO(g,(n)) va f,(n)€O(g(n)) thi
#@)+/20) < O(max[{ g,(1),8,(7)})
Mệnh đề 1.1.3 (Xem [2]) Nếu ƒ@)eO(g,0)) và #(ñ)eO(g;()) thì
Fin) Am) <O(,0).s;(n))
Ménh dé 1.1.4 (Xem [2]) Cho P(n) = a'+a,.n''!+ +an+dy là đa thức
bac k, a,> 0 Khi d6 P(n) Ø0)
1.1.2 Cách tính độ phức tạp của thuát toán
Ta sử dụng 7(<khối mã>) cho độ phức tạp tính toán của một toán tử riêng cũng như một đoạn mã chương trình Khi mã chương trình được tách biệt rõ ràng thì ta kí hiệu 7) là độ phức tạp tính toán là hàm biến số 0 với n là số phép toán cơ sở Độ phức tạp tính toán được đo bằng hàm Ó( ) là chính
Vì vậy để tính độ phức tạp tính toán của thuật toán tức là ta đi xác định ham T(n) € O( ) cho đoạn mã chương trình đó
Các phép toán được dùng để đo độ phức tạp thời gian có thể là phép so
sánh các số nguyên, phép cộng, phép trừ, nhân, chia các số nguyên hoặc bất kỳ một phép toán sơ cấp nào khác
Định nghĩa 1.1.4 (Xem [2]) Pháp tính cơ sở là phép cộng, trừ, nhân,
chia và các hàm lượng giác, hàm mũ, hàm logarit hoặc bất kì một phép toán
Trang 10Tuy nhiên khi thực hiện tính toán với những số lớn thì phép nhân và các hàm trên cũng không là phép tính cơ sở nữa Vì phép nhân các số lớn, các hàm
được thực hiện tính toán trên các dãy
Độ phức tạp thời gian của dãy liên tiếp các phép tính xác định bởi độ phức tạp cao nhất trong chúng Tức là, giả sử toán tử s, có độ phức tạp Ƒ), s;
có độ phức tạp F; Khi đó:
T(s,)<OŒ)); T(s;)<Ó(Œ,) =T(s¡, s;)emax{@Œ,);OŒ,)}
Để dễ dàng cho việc phân tích thuật toán ta kết hợp những kí hiệu độ đo
phức tạp và phân tích trong trường hợp xấu nhất để biết được thời gian thực hiện những thuật toán trong thời gian xấu nhất là bao nhiêu?
Người ta định ra độ phức tạp của các phép toán trong trường hợp xấu
nhất là:
(1) Phép gán có độ phức tap O(1)
(2) Phép nhập vào thủ tục có độ phức tạp Ó(1)
(3) Phép ra khỏi thủ tục có độ phức tạp Ó(1)
(4) Mệnh đề if<điều kiện> độ phức tạp là thời gian so sánh cộng với O(max cua hai nhánh)
(5) Vòng lặp (While) có độ phức tạp thời gian là tổng tất cả vòng lặp với thời gian của mỗi vòng lặp đó
Thứ bậc trong tập hàm số (Xem [3])
Trong phân tích thuật toán người ta thường hay dùng các hàm sau đây
1, logn, Vn, n, nlogn, n°, n°, 2", n2", n!
Những hàm này tạo ra một dây xích thứ bậc tăng như sau:
Ø()c=O(ogn)cO(5 )cO@) cO(logn)cO(?)cO())CO(2")CO(12")CO(1)) Các hàm như 2", z2", ø", ø! được gọi là hàm loại mũ Một giải thuật mà
Trang 11Các hàm như logn, VJn,n, nlogn, n,n duoc gọi là các hàm loại đa thức Giải
thuật với thời gian thực hiện có cấp hàm đa thức thì thường chấp nhận được Ví dụ 1.1.1 (Xem [2]) Phân tích độ phức tạp của vòng for 1: fact:= 1; 2 for i:=1 ton do; 3: fact:= fact + i; 4 end for
- Dòng 1: Phép gán cố định mất thời gian là hằng s6, kf hiéu 1a a
- Dòng 2: Với phép toán gán ¡ := 1, kiểm tra ¡ < úó và ¡ := i+l cũng chiếm thời gian là hằng số, lần lượt kí hiệu là b; c; d
- Dòng 3: Cũng đòi hỏi thời gian là hằng số e
Khi đó thời gian (độ phức tạp) để thực hiện chương trình trên là:
T(n) = a+b+n(c+đ)+n(e) = n(c+d+e)+a+b Suy ra T(n)s< Ó(1)
Trang 12- Vòng lặp từ dòng 1 đến dòng 7 có độ phức tạp ÓC» ¡ )
i=l
(nó thực hiện nhiều nhất ø - ¡ lần)
Do đó độ phức tạp để thực hiện của thuật toán là
T(n) = ¥ (ni) = (nol) - $i) Suy ra T(n) OW’)
Vi du 1.1.3 (Xem [2]) Phân tích độ phức tạp của thuật toán tìm số ø đầu
tiên có mặt trong khoá A gồm 0 số A;, A;, , A„„ nếu không có trả về kết quả 0 nh 1 for ¡ := I to ø do 2 if a = A, then 3: return(A,) 4 end for 5 return(0) end
Việc phân tích độ phức tạp thời gian của thuật toán tìm kiếm tuyến tính
này được cụ thể như sau:
Số các phép so sánh được dùng trong thuật toán này sẽ được xem như thước đo độ phức tạp thời gian của nó Ở mỗi bước của vòng lặp trong thuật toán, có hai phép toán so sánh được thực hiện: một để xem đã tới cuối bảng chưa và một để so sánh phần tử ø với một số hạng của dãy Cuối cùng còn một phép so sánh nữa làm ở ngoài vòng lặp Do đó nếu z = A, thì đã có 2k +1 phép so sánh được sử dụng Số phép so sánh nhiều nhất 2 + 2 đòi hỏi phải được sử dụng khi phần tử z không có mặt trong bảng Trong trường hợp đó, 2ø phép so sánh được dùng để xác định z không phải là A, đối với k = I, 2, , ø; một
phép so sánh nữa được dùng để ra khỏi vòng lặp
Như vậy khi ø không có mặt trong bảng, tổng số các phép so sánh đã sử
dụng là 2ø + 2
Trang 131.2 Đa giác đơn, đường gấp khúc đơn điệu và đa giác đơn điệu
Trước khi nêu các khái niệm ta quy ước đường thẳng zb là đường thẳng
đi qua hai điểm phân biệt ø và b theo hướng ab
Định nghĩa 1.2.1 (Xem [14]) Giả sử, trong mặt phẳng Oxy cdc diém
a(xi,yi): P(x;„y¿); c(x¿„y¿) Kí hiệu S(ø,b,c) là điện tích đại số của tam giác abc, khi đó diện tích đại số được xác định như sau:
S(a,b.c) = IDI) Oe WIT Khi đó ta gọi: - Điểm c nằm bên trái đường thẳng ab (ki hiéu Left(a,b,c)) khi va chi khi S(a,b,c) > 0 - Diém c nam bén phdi duéng thang ab(ki hiệu Righf(a,b,c)) khi và chỉ khi S(a,b,c) < 0
- Điểm c nằm trên đường thẳng ab khi va chi khi S(a,b,c) = 0
Định nghĩa 1.2.2 (Xem [14]) Đa giác là miền phẳng được giới hạn bởi
một đường gấp khúc khép kín những đoạn thẳng trong mặt phẳng Những
đoạn thẳng được gọi là cạnh của đa giác và những điểm chung của hai đầu đoạn thẳng gọi là đỉnh của đa giác
Đa giác đơn là đa giác mà hai cạnh bất kì của nó hoặc là không giao nhau, hoặc là giao nhau tại điểm chung duy nhất là đỉnh
Định nghĩa 1.2.3 (Xem [13]) Một đường gấp khúc đa giác < Dạ pị - D.>
là một dãy những điểm p, (= 0, I, , k) mà trong đó mọi cặp những điểm kề nhau
p, và p,., biểu thị một đoạn thẳng v6i moi i = 0, 1, ., & và không có hai đoạn nào không liên tiếp cắt nhau Khi đó ta còn gọi là đường gấp khúc không tự cắt
Định nghĩa 1.2.4 Cho đa giác đơn gồm ø đỉnh <p,, ., Dy 5 Dy >:
Trang 14ngược chiêu kim đồng hồ nếu va chỉ nếu tiếp giáp với phần bên trái cạnh [p„ p,.,Ì Vi=1,n—1 là phần trong đa giác
Trong trường hợp ngược lại, ta nói các đỉnh p, của đa giác sắp xếp theo
thứ tự cùng chiêu kim đông hồ
Định nghĩa 1.2.5 (Xem [14]) Đường gấp khúc P là đường gấp khúc đơn
điệu nếu tồn tại một đường thẳng L sao cho mọi đường thẳng vuông góc với L thì hoặc không cắt P, hoặc cắt P theo một điểm, hoặc cắt P theo một đoạn
thẳng Và khi đó ta cũng nói đường gấp khúc Ð _ là đơn điệu theo phương L Một đa giác được gọi là đa giác đơn điệu nếu nó là đa giác đơn và biên của nó được hợp thành từ hai đường gấp khúc đơn điệu theo cùng một phương Định nghĩa 1.2.6 (Xem [14]) Một đa giác đơn được gọi là y-đơn điệu
nếu nó đơn điệu đối với trục Óy
Trong luận văn này, chúng tôi không xét trường hợp đường gấp khúc đơn điệu có cạnh nằm trên đường thẳng vuông góc với phương đơn điệu
Nhận xét 1.2.1 (Xem [5]) Đường gấp khúc Y =< ứạ, đ¡ , đ„> đơn điệu theo phương L khi chỉ khi tồn tại một hệ trục toạ độ dé các vuông góc
OÓxy có trục hoành cùng phương với L sao cho hoành độ x, của các điểm 4,
thoả mãn x,<+,,¡ với mọi ¡= 0,m—I
1.3 Tập lôi, bao lôi và điểm cực biên
Định nghĩa 1.3.1 (Xem [12]) Một tập «Z trong mặt phẳng được gọi là
tập lôi nếu Vxị, x; e cZ thì [x¡, x;]={ 2x,+(1-2)x;:0 < 2 < lhc
Định nghĩa 1.3.2 (Xem [12]) Một tổ hợp lôi của các điểm x,, x, trong mat
phẳng là một tổng có dạng 2 ,x,+2„x„, với V 4¡„24„ >0, sao cho 4¡ +4; = l Định nghĩa 1.3.3 (Xem [12]) Cho tập <Z trong mặt phẳng
- Giao của tất cả các tập lồi chứa «Z gọi là bao lồi của «Z, Kí hiệu là
Trang 1510
- Giao của tất cả các tập lồi đóng chứa ‹Z gọi là bao déng cha &
Kí hiệu là convzZ
Nhận xét 1.3.1 (Xem [12])
(i) conveZ là tập lồi nhỏ nhất chứa <⁄ (ii) cZ là tập lồi ©conveZ=zZ
(iii) convzZ là tập đóng nhỏ nhất chứa «Z
Mệnh đề 1.3.1 (Xem [12]) Tập <Z lồi khi và chỉ khi «Zchứa tất cả các tổ
hợp lồi của nó
Định nghĩa 1.3.4 (Xem [12]) Cho tập lồi M trong mat phang
Điểm x eM được gọi là điểm cực biên của tập hợp M nếu x e|x,„x;,],
+, 1; M thì x =x, hoặc x =x;¿
Một số dấu hiệu nhận dạng điểm cực biên của bao lồi của tập S hữu hạn
điểm trong mặt phẳng, (Xem [12]):
- Ta gọi điểm cao nhất của tập Š là điểm có tung độ lớn nhất Trong các
điểm cao nhất điểm có hoành độ lớn nhất và điểm có hoành độ nhỏ nhất là các điểm cực biên của convS
- Ta gọi điểm thấp nhất của tập S là điểm có tung độ nhỏ nhất Trong các điểm thấp nhất điểm có hoành độ lớn nhất và điểm có hoành độ nhỏ nhất là các điểm cực biên của convS
- Ta gọi điểm xa nhất về bên phải của tập Š là điểm có hoành độ lớn nhất Trong các điểm xa nhất về bên phải điểm có tung độ lớn nhất và điểm có
tung độ nhỏ nhất là các điểm cực biên của convS
- Ta gọi điểm xa nhất về bên trái của tập Š là điểm có hoành độ nhỏ nhất Trong các điểm xa nhất về bên trái điểm có tung độ lớn nhất và điểm có
Trang 1611 1.4 Thuật toán tăng dân
1.4.1 Thuật toán tổng quát
Cho § ={pạ, p, , p„.,} là một tập hợp ø điểm trong mặt phẳng Gọi Ó,.,
là bao lồi của {pạ, p¡, j?,¡} các điểm của S
Ta tìm bao lồi Q,= conv{Ó,,Y {p,}} từ i = 3, 4, , n-1 được gọi là tim bao lồi theo thuật toán tăng dân, (Xem [14]) Thuật toán 1.4.1 Đặt Ó; c conv{po,Ði.D;} For i=3ton-1 Q;<— conv{Q;, Y {p;}}
1.4.2 Thuật toán tìm tiếp tuyến
Bài toán: Trong mặt phẳng cho đa giác lồi @ có ø đỉnh {pạ, pạ 0„¡}
được đánh số theo thứ tự ngược chiều kim đồng hồ và p là một điểm nằm
ngoài Ó Hãy tìm thuật toán xác định đường thẳng tiếp tuyến từ p tới Ó Thuật tốn được mơ tả cụ thể như sau, Xem [14]:
Tìm điểm p, sao cho hai điểm p,„, ø,¡ đều nằm bên phải pp, thì pp, là tiếp tuyến bên trái của Q Ngược lại, nếu có điểm p, sao cho hai điểm p,¡, P¡,¡
Trang 1712
Thuát toán 1.4.2
for ¡= 1 to n do
if p, p,,¡ nằm bên phải pp, then
Dp, là tiếp tuyến bên trái end if;
Ïp,¡„ p,., nằm bên trái pp, then
pp, là tiếp tuyến bên phải end ïf;
end for
Độ phức tạp của thuật toán tìm tiếp tuyến
Trong vòng lặp for có cấu trúc tuần tự là hai cấu trúc rẽ nhánh if nên theo cách đánh giá độ phức tạp thuật toán thì trường hợp xấu nhất ¡ chạy đến cuối vòng lặp for mới xác định được tiếp tuyến còn lại
Từ đó ta suy ra độ phức tạp thuật toán tìm tiếp tuyến là Ó(n)
Nhận xét 1.4.1 Nếu X =< pạ.p¡ p„, > là đường gấp khúc đơn điệu thì việc đi tìm bao lồi Ó, theo thuật toán tăng dần của X_, tương ứng với đi tìm hai tiếp tuyến trái và phải p;?„ p,p, của Ó,, xuất phát từ đỉnh p, Bởi vì p, £Ó,.,
1.5 Lý thuyết đô thị
1.5.1 Đồ thị và đường đi trong đồ thị
Trang 1813
Định nghĩa 1.5.3 (Xem [4]) Đồ thị chỉ chứa các cạnh vô hướng được gọi là đồ thị vô hướng, còn đồ thị chỉ chứa các cạnh có hướng được gọi là đồ thị
có hướng
Định nghĩa 1.5.4 (Xem [4]) Đồ thị G =(V, E) mà mỗi cặp đỉnh được nối
nhau bởi không quá một cạnh được gọi là đơn đồ thị (thường gọi tắt là dé thi) còn nếu đồ thị có những cặp đỉnh được nối với nhau nhiều hơn một cạnh thì được gọi là đa đồ thị
Định nghĩa 1.5.5 (Xem [4])
1 Hai đỉnh của đồ thị G được gọi là /én thông, nếu trên đồ thị có đường đi vô hướng nối chúng với nhau
2 Đồ thị được gọi là liên thông nếu mọi cặp đỉnh của đồ thị đều liên thông với nhau
Định nghĩa 1.5.6 (Xem [4]) Bác của một đỉnh đồ thị là số cạnh kê với
đỉnh đó
Định nghĩa 1.5.7 (Xem [4]) Đường đi trong đồ thị là một dãy các đỉnh:
(ẤN; Xzy .v Ấy Äjzp; cà Ấz ky Ấy )
sao cho mỗi đỉnh trong dãy (không kể đỉnh đầu tiên) kể với đỉnh trước nó
bằng một cạnh nào đó, nghĩa là: V¿ = 2, 3, , k-1, k: (,¡, x)eE
Định nghĩa 1.5.8 (Xem [4]) Đồ thị G được gọi là đồ thị có trọng số nếu mỗi cạnh (¡,/) của đồ thị được gán một số nguyên không âm C()
e Nhdn C(i,j) trén cạnh (,/) của đồ thị thường biểu diễn “chi phí” thực tế đi qua cạnh này
©_ Đường đi có trọng số bé nhất:
- Độ dài của đường đi trong đồ thị có trọng số bằng tổng các trọng số của các cạnh trên đường đi đó
Trang 1914
- Nếu không có đường đi từ ø đến b thi ta đặt khoảng cách bằng œ Định lý 1.5.1 (Xem [4]) Giả sử đồ thị G có ø đỉnh Tồn tại đường đi từ đỉnh z đến đỉnh ? trên đồ thị G khi chỉ khi tồn tại một đường đi từ ø đến b trên
đồ thị này với độ dài không vượt quá ø - 1
Định lý 1.5.2 (Xem [4]) Tổng tất cả các bậc của các đỉnh trong một đồ
thị bằng hai lần số cạnh của đồ thị đó
1.5.2 Thuat todn Dijkstra
Nam 1959, Dijkstra đưa ra một thuật toán rất hiệu quả giải bài toán tìm đường đi ngắn nhất giữa hai đỉnh trong đồ thị có trọng số với độ phức tạp là
O(n’), (Xem [3])
Bai toán 1.5.1 Cho dé thi c6 n dinh cé trong s6 G = (V, E) va hai dinh a, b € G Hãy tìm đường đi có trọng số bé nhất (nếu có) đi từ đỉnh z đến đỉnh b
Hình 2: Minh họa đường di ngắn nhất từ đỉnh I đến đỉnh 6
se Mô tả thuật toán
Thuật toán thực hiện việc gán và giảm giá trị nhãn đ() tại mỗi đỉnh ¡ của đồ thị G
1 Với đỉnh xuất phát z, gán nhãn d(a) := 0
2 Nếu có canh (i,j) mà đỉnh ¡ được gán nhãn và đỉnh j chưa được gán nhãn hoặc đỉnh 7 đã được gán nhãn nhưng
d(i) + Ki.) < d(j) thi giam nhan đ) := d0) + ij)
Trang 2015
Khi đó tại đỉnh b giá trị gán nhãn đ(b) cuối cùng (nếu có) chính là độ dài đường đi ngắn nhất từ đỉnh z đến đỉnh b (Xem [4])
i,j) khỉ (LJj)<E
Ta xây dựng ma trận trọng số: 7{[¡, j]= 4% khi (i.j)# E
0 khi i=j
Từ tập hợp động S, ban dau § = ø, sau đó nhập đỉnh ø vào được S = {đ]} Trong các đỉnh ngoài Š, ta chọn đỉnh y có nhãn đ(v) bé nhất, bổ sung vào S Tập S được mở rộng thêm một đỉnh, khi đó ta cần cập nhật lại các nhãn đ cho
phù hợp Thuật toán kết thúc khi đỉnh b được bổ sung vào ®$ #„øc[v] ghi nhận
đỉnh đi trước y trong đường ngắn nhất từ ø đến b Tính đúng đắn của thuật toán (Xem [3])
Ta gọi thuật toán của Dijkstra tìm đường đi ngắn nhất giữa hai đỉnh ø và
b trong đồ thị G là DLJKSTRA(G, a, b) (xem Thuật toán 1.5.1, trang 16 ) e Độ phức tạp thuật toán
Đánh giá độ phức tạp của thuật toán DIJKSTRA(G, a, ở) như sau:
- Mỗi bước lặp để tìm ra đỉnh có độ phức tạp là O(n)
- Việc gán lại nhãn có độ phức tạp là O(n)
Thuật toán thực hiện ø - I bước lặp vì vậy độ phức tạp của thuật toán
Dijkstra la O(n’)
Để giảm bớt khối lượng tính toán trong việc xác định đỉnh ở mỗi bước
lặp, có thể sử dụng thuật toán sắp xếp Heapsort (xem [3], rang 221) trên đồ
thị cho bởi danh sách kể Khi đó ta có thể thu được thuật toán Dijkstra với độ
Trang 2116
Thuật toán 1.5.1 (DIJKSTRA (G, a, b))
Cho: D6 thi c6 trong s6 khong 4m G = (V, E) với n đỉnh; a, beV
Tìm: Đường di ngan nhat tir a dén ở for veV do d(v) := ~; d(a) :=0; S:= ¢; truoc[v] := 4; end for While b¢S do Begin := đỉnh không thuộc Š có nhãn d(u) nhỏ nhất; S:=S Y{u}; for veV\S do if d(u) + I(u,v) < d(v) then d(v) := d(u) + lu,v); truoc[v] := ; end if; end for; end;
Ví dụ minh họa thuật toán Dijkstra tìm đường đi ngắn nhất từ đỉnh 1
đến đỉnh 6 cho bởi Hình 2 được thực hiện như sau:
Ta quy ước viết hai thành phần của nhãn theo thứ tự : đ[v], truoc[v] va
Trang 2217 Khi đó ta xây dựng bảng: Bước lặp s Dinh Đỉnh | Đỉnh | Đỉnh | Đỉnh | Đỉnh | Dinh được chọn 1 2 3 4 5 6 Khởi tạo ó 0.1 112 | ø,1 2,1 o,1 | 0,1 1 1 2 0 - 6,2 21° wo, 1 8,2 2 1,2 4 0 - 34 - 6,4 8,2 3 1,2,4 3 0 - - - 6.4 43”
Bảng kết quả tính toán theo thuật toán DỤkstra của ví dụ cho bởi Hình 2
Trong ví dụ này, thuật toán dừng ở bước thứ 3 của vòng lặp While vì xác định đỉnh 6 là nhãn
Vậy đường đi ngắn nhất từ đỉnh 1 đến đỉnh 6 là 1 - 4 - 3 - 6 và có độ dài
bằng 4
Trong Chương 2 của luận văn, chúng tôi sử dụng phép tam giác phân
cho đa giác đơn bất kỳ và chi tiết phép tam giác phân vào đa giác đơn điệu 1.6 Tam giác phân đa giác đơn
1.6.1 Định nghĩa và tính chất
Một đa giác đơn chia mặt phẳng ra thành phần trong, biên và phần ngoài Giả sử đa giác đơn P_ = <vwạ, vị, , v„¡> Hai đỉnh không kê nhau y, và v, với ¿ < j thì đoạn thang vy, nối hai đỉnh này nằm trong miền của đa giác
đơn gọi là đường chéo
Định nghĩa 1.6.1 (Xem [14]) Tam giác phân một đa giác là dùng những đường chéo không giao nhau của đa giác để chia phần trong của đa giác thành các tam giác
Định lý 1.6.1 (Xem [14]) Mọi phép tam giác phân đa giác nø đỉnh cần sử
Trang 2318
Từ định nghĩa đa giác y - đơn điệu (xem Mục 1.2), ta định nghĩa đỉnh lùi phía trong của đa giác đơn
Định nghĩa 1.6.2 (Xem [14]) Một đỉnh v của đa giác đơn được gọi là đỉnh lài phía trong nếu góc bên trong tại v lớn hơn Z và hai đỉnh kề bên nó có tung độ lớn hơn hoặc nhỏ hơn tung độ của v
Chúng tôi trình bày ở đây thuật toán tam giác phân đa giác đơn có độ phức tạp Ó(logø) với ý tưởng phân chia đa giác đơn thành các đa giác đơn
điệu, sau đó tam giác phân đa giác đơn điệu 1.6.2 Thuật toán tam giác phân đa giác đơn
Bài toán 1.6.2 Cho đa giác đơn P có ø đỉnh Tìm phép tam giác phân
đa giác đơn P
Để giải bài toán, ta cần thực hiện hai thuật toán
se Thuật toán phân chia đa giác đơnP thành các đa giác đơn điệu (Xem [14], trang 48)
Thuật toán dựa vào các đường thẳng nằm ngang đi qua các đỉnh đa giác
với giả thiết không có hai đỉnh nằm trên một đường nằm ngang Trong mỗi
hình thang đó chính xác hai đỉnh (đỉnh hộ trợ), một đỉnh nằm ở cạnh trên và
một đỉnh nằm ở cạnh dưới Nếu một đỉnh hộ trợ nằm giữa cạnh của hình thang
thì nó là điểm lùi phía trong Mọi đỉnh hộ trợ được nối với đỉnh đối điện của
hình thang: nối xuống với điểm “lùi xuống”, và nối lên cho điểm lùi “hướng
lên” thì các đường chéo nay sé phan chia thành các đa giác đơn điệu theo
phương thẳng đứng Khi đó các điểm lùi trong được loại bỏ, do đó các đa giác
này là các đa giác y - đơn điệu
Trang 2419
Thuát toán I.6.I MNT(P ) (Xem [14])
Bước 1 Phân loại các đỉnh bởi tung độ y giảm dần
Bước 2 Kẻ các đường thẳng theo phương trục Óx lần lượt qua các đỉnh của đa giác
Bước 3 Phân chia đa giác thành các đa giác đơn điệu bởi việc
nối từ các điểm lùi phía trong
se Thuật toán tam giác phan đa giác đơn điệu TGPI(P )
Đa giác đơn điệu xác định bởi hai đường gấp khúc có các đỉnh phân loại bởi tung độ y Ta gọi đường gấp khúc phải của đa giác P là đường gấp khúc gồm các đỉnh lấy theo chiều kim đồng hồ từ đỉnh có tung độ cao nhất đến điểm có tung độ thấp nhất của P, đường gấp khúc còn lại là đường gấp khúc trái của đa giác đó
Trang 2520 Thuật toán 1.6.2 TGPI(P ) (Xem [LI])
1 Kết hợp các đỉnh đường gấp khúc trái và đường gấp khúc phải của P vào một dãy dựa trên việc giảm tung độ y các đỉnh
Giả sử > „ > > u„ biểu thị dãy các đỉnh của P 2 Khởi tạo Stack S = ø, đẩy u,, u, vao S
3 for j=3 ton- 1
4 do if u, va dinh cua S nam trén hai dudng gap khtic
5 then day ra tất cả các đỉnh từ S
6 Chèn vào trong /) một đường chéo từ ; đến mỗi
đỉnh đã được đẩy ra từ S, trừ đỉnh cuối cùng 7 Day u;., va u; vao S
8 Else đẩy ra một đỉnh từ S
9 Đẩy ra những đỉnh khác từ S với điều kiện những
đường chéo từ , tới các dinh dé nam trong P
Chèn những đường chéo này vào trong D
Đẩy đỉnh cuối cùng mà đã được đưa ra sau vào Š 10 Đẩy u; vao S
11 Thêm những đường chéo từ u,, dén tat cả các đỉnh của S và trừ đi đỉnh đầu tiên và đỉnh cuối cùng đã được đẩy ra từ S
Thuật toán tam giác phân đa giác đơn
Ta kí hiệu thuật toán tam giác phân đa giác đơn P là TGP(P ) Thuật toán 1.6.3 TGP(P )
Cho: Đa giác đơn P
Tìm: Một phép tam giác phân đa giác đơn P Bước 1 ïif P là đa giác đơn điệu then
Thực hiện TGPI(P ) Bước 2 else Thực hiện MNT(P )
Trang 2621
Chương II
THUẬT TỐN TÌM ĐƯỜNG ĐI NGÁN NHẤT GIỮA HAI ĐIỂM TRONG ĐA GIÁC ĐƠN CỦA LEE VÀ PREPARATA
Từ thuật toán tam giác phân đa giác đơn, thuật toán tìm đường đi ngắn nhất giữa hai điểm trong đa giác đơn của Lee và Preparata (Xem [17]) dựa
vào các thuật toán Dijkstra trên đồ thị, thuật toán tìm hình ống tay và thuật
tốn phếu
Chúng tơi trình bày các kiến thức liên quan và thuật toán chính 2.1 Thuật toán tìm hình ống tay
Định nghĩa 2.1.1 (Xem [13], rang 395) Cây đối ngẫu của một phép
tam giác phân đa giác đơn P_ là một đồ thị G = (V, E) mà trong đó mỗi nốt của V tương ứng là một tam giác của phép tam giác phân và mỗi cạnh của # là đoạn nối hai nốt của V khi chỉ khi hai tam giác có một cạnh chung là đường chéo của P Đường chéo của P va cạnh trong G được gọi là đối ngẫu
Định nghĩa 2.1.2 (Xem [13], rang 395) Một đa giác gọi là hình ống fay nếu cây đối ngẫu của phép tam giác phân đa giác đó là một dãy những cạnh
của đồ thị (cây đối ngẫu) nối tiếp nhau mà mỗi điểm nối là đầu mút của vừa đúng hai cạnh của đồ thị đó (trừ điểm đầu và điểm cuối) Khi đó, nếu dãy đó
có điểm đầu là z và điểm cuối là b thì ta nói hình ống tay đó xác định bởi
điểm a va b
Theo phép tam giác phân đa giác đơn và định nghĩa hình ống tay, ta có
hình ống tay là một đa giác đơn
Bài toán 2.1.1 Cho đa giác đơn Z, s và / là hai điểm trong miền đa giác P.- Tìm thuật toán xác định hình ống tay xác định bởi s và ¿
Trang 2722 Thuật toán 2.1.1 (SLEEVE(Œ ))
Cho: Một phép tam giác phân T đa giác đơnP Tìm: Một đa giác đơn Ð ˆ là hình ống tay
Bước 0 Tạo ra cây đối ngẫu Ớ = (V, E) của phép tam giác phân
đa giác đơn P, se A (s), £eA() với A(s),A()<V
Bước 1 Thực hiện DLJKSTRA(G,A(s),A()) (xem Thuật toán 1.5.1)
Đặt P “= UA, A, là các đỉnh của đường đi ngắn nhất
từ A(s) đếnA (7) (¡= 1,)
Độ phức tạp thuật toán tạo hình ống tay là ÓŒ¡ˆ)
2.2 Thuật toán phéu 2.2.1 Khái niệm phêu
Giả sử P 14 mot đa giác đơn có ø đỉnh; s, v là hai điểm thuộc đa giác P
Ký hiệu đường đi ngắn nhất từ s tới y trong#_ là [](œ.v)và U [| [(.v) Giả
sử đ = „w là một đường chéo hay một cạnh của P và ø là điểm mà hai đường
[][@ và [ [(a.w) rẽ ra Khi đó ] [(z.z), [ [(a.w) là các đường lồi ngoài, tức là: với Œ là miền trong giới hạn bởi | [(.z) | ](a.w) và đoạn uw, khi đó:
conv(] ](a,w))1 C= ¢, conv([ ](a,w))1 C= ¢
Dinh nghia 2.2.1 (Xem [17], trang 211) Hop cua céc đường Il@
[][.) v6i d = uw goi la Phéu F Khi đó, a gọi là đỉnh của phễu (điểm sâu
nhất của phếu), ki hiéu: CUSP(F_ ) = a
Đối với phễu “_ và đường chéo ww của ta có hai trường hợp xác định
phéu mới được nối trực tiếp từ w” đến z (phéu co rút lại) hay tiếp tuyến từ w°đến
] l(á.¿) hoặc [ [(a.w) (đỉnh phễu dịch chuyển, đuôi mở rộng, phễu co rút lại)
Bài toán 2.2.1 Cho hình ống tay P ˆ, xác định bởi s và / Hãy tìm thuật
Trang 2823
Chúng tôi trình bày thuật toán Phễu của Lee và Preparata nhưng có sự cải tiến của Guibas, Hershberger, Sharir và Tarjan (Xem [17]) để giải bài này
2.2.2 Thuật toán phễu
Giả sử đ = uw là một đường chéo của P ˆ, với phễu hiện thời F= F,, 1a
một danh sách phân loại [ư, w,;„ , đ, wạ, .,„], ở đây ø = „ạ= wạ là đỉnh của
£', J |(a.,)= [mọ, ., m], | [(a.w)= [a, ., w,] và tụ = u, w, = w Ching ta kí hiệu trong thuật toán đỉnh của cái phếu hiện tại là CUSP(Z' )
Thuật toán bắt đầu từ s với CUSP(F ) = s và tiếp tục một cách đệ quy như sau: Thuật todn 2.1.2 (FUNNEL(F_ )) (xem[13], trang 212) Cho: Đa giác P ˆ là hình ống tay Tìm: Các đỉnh y = CUSP(Z)
Giả sử ¡„ w là điểm đầu tiên và điểm cuối cùng của 7, và a= CUSP(F) (nhu vay '=[ [(a.u)U[ |(a.w) )
Giả sử Auwx là tam giác trong phép tam giác phân T cua
đa giác P ˆ với đường chéo w là một cạnh của tam giác
(a) — Tìm kiếm phần tử v của 7', sao cho vx là một tiếp tuyến của 7 tại y (nếu đường thẳng ax không cắt Z thì y = a) Viéc tìm kiếm hoàn toàn tương tự như việc tìm kiếm một tiếp tuyến của đa giác
lồi từ một điểm bên ngồi (heo Thuật tốn 1.4.2), Chia F Ux thành hai phễu mới 7= [u, , v, x] và ?;= [x, v, w] Nếu
ve [ [(a.z) thì đặt CUSP()) := v, CUSPŒ;) := a Mặt khác, nếu ve [](.w)thì CUSP(F,) := a, CUSP(E,) := v (b) Dat [](s.x) := [ [(.v) Uv+ (c) Nếu ux là đường chéo của P ‘ thi goi FUNNEL(F,) mot cach đệ quy (d) Nếu wx là đường chéo của P ˆ thì gọi FUWNEL(Z,) một cách đệ quy
(e) Nếu / nằm trong Awx thì ta chon f := x
Kết quả thuật toán cho ta đường đi ngắn nhất Z từ s đến ¿ với
2 = [s=v,, V5, ., v„„ /]J Trong đó v,, ¿ = 1, 2, , m là các đỉnh của
cdc phéu F
Trang 2924 e Tinh ding dan của thuật toán
Chứng minh tính đúng đắn của thuật toán phễu (Xem [17])
e_ Độ phức tạp của thuật toán
Độ phức tạp của thuật toán phếu là Ó(n) (Xem [L7], trang 213-215) 2.3 Thuật toán chính
Cho: Đa giác đơn # và hai điểm s, / nằm trong P
Tìm: Đường đi ngắn nhất từ s đến / trong đa giác đơn P Bước I1 Thực hiện phép tam giác phân TGP(P ), ta gọi phép
tam giác phân đó là T
Bước 2 Với phép tam giác phân T_, thực hiện SLEEVE(P )
ta được hình ống tay P ’
Bước 3 Thực hiện FUNNEL(F ) với hình ống tay P “
Tính đúng đắn của thuật toán
Để chứng minh tính đúng đắn của thuật toán ta dựa vào một số mệnh đề sau:
Mệnh đề 2.3.1 (Xem [13]) Giả sử s và ứ là hai điểm trong đa giác đơn P,
Š là tập các đỉnh của đường ống tay xác định bởi s và / (phép tam giác phân) Khi đó, các đỉnh mà đường ngắn nhất từ s đến ¢ thudc tap S U {s, f}
Mệnh đề 2.3.2 (Xem [17]) Giả sử A „wx là một tam giác trong phép tam giác phân của đa giác sao cho AwxI '= d Khi đó đường ngắn nhất từ s
tới x là từ [ [(s.a) và đến ax Nếu axI #'= ø thì đi thẳng tới x, hay ngược lại sẽ đi theo một phần ] [(.z) | |(a.w) tới v nếu vx là tiếp tuyến của #” tai v sau
đó tiếp tục theo đoạn thẳng vx
Từ đó ta suy ra:
Trang 3025
e Thuật toán kết thúc thì tìm được đường đi ngắn nhất từ s đến ¿ vì luôn tìm được duy nhất đường ngắn nhất nằm trong hình ống tay
Độ phức tạp thuật toán
Thuật toán chính có độ phức tạp là Ó(?)
Nhận xét 2.3.1 Trường hợp đa giác đơn điệu có ø đỉnh hợp bởi hai
đường gấp khúc đơn điệu theo cùng một phương < a=pp, p;, Ð > và
< asqg, q¡ b > thì đường đi ngắn nhất trong miền đa giác đơn điệu từ đỉnh a đến đỉnh b như là một đặc biệt thuật toán trên
Việc đánh giá độ phức tạp thuật toán này dựa vào: - Bước 1 có độ phức tạp là O(n)
- Bước 2 có độ phức tạp là ÓŒˆ)
- Bước 3 có độ phức tạp là Ó()
Do đó độ phức tạp thuật toán của Lee và Preparata tìm đường đi ngắn
nhất giữa hai đỉnh trong đa giác đơn điệu 14 O(n’)
Phần minh họa của thuật toán của Lee và Preparata được trình bày
Trang 3126
Chương II
THUAT TOAN DUNG BAO LOI LAM ĐỊNH HƯỚNG
TÌM ĐƯỜNG ĐI NGẮN NHẤT GIỮA HAI ĐỈNH
TRONG ĐA GIÁC ĐƠN ĐIỆU
Trong [9] và [10], Phan Thành An đã đưa ra ý tưởng tìm đường di ngắn nhất giữa hai đỉnh trong đa giác đơn không cần quá trình tam giác phân đa giác Vấn đề này được trình bày lại trong [5] cho trường hợp đa giác đơn điệu
Trang 3227
Bài toán: Cho đa giác đơn điệu PQ tao boi hai đường gấp khúc don điệu P = < a=pạ, 0 D„¡ =b > và Q= < a=qụ, qị đ„¡=D >
Tìm đường đi ngắn nhất, Z, trong miền đa giác P@_ nối hai đỉnh ø và b 3.1 Thuật toán con tìm bao lôi tiền vi phạm
Cho hai đường gấp khúc đơn điệu X va Y theo cùng một phương có chung đỉnh đầu a và đỉnh cuối ð X = < a=pụ, p¡ , p„¡=b > các đỉnh sắp xếp
cùng chiêu kim đồng hồ, Y = < ø=qụ, đ¡ , đ„,=b > các đỉnh sắp xếp ngược
chiều kim đồng hồ và đặt Ó, = conv(%, = < vụ, Vị, ., 9, >), ( <m-]) 3.1.1 Mô tả bao lôi tiền vi phạm (Xem [Š])
Trong thuật toán tăng dần đi tìm bao lồi của X, ta có các bao lồi Ó,, Ó;, „ Ở, „¡ Giả sử Ó,., là bao lồi đầu tiên chứa đỉnh nào đó của Y_ \{gạ}
Khi đó ta gọi Ợ, là bao lôi tiển vỉ phạm của X— đối với Y_ và kí hiệu là Ợ
Tại p,,, kẻ hai tiếp tuyến trái p,,,, và tiếp tuyến phải p,,¡, tới Q,
Kí hiệu:
-X = <P,:D› ve D >, là đường nối các điểm cực biên bên trái của
bao lồi Ở” từ p, đến p„
-Y= <q, q-: ¬ > là đường nối các đỉnh của Y_ \{zạ¿} sắp theo
thứ tự tăng dân chỉ số nằm trong miền < p,,¡Ð¿ Ø,,¡Ð„ X >> (g có thể
trùng với ?„¡)
-FQ(X „Y ) là quá trình đi tìm @,X và Ÿ
Như vậy, quá trình FQ(x „Y ) cho ta kết quả: bao lồi tiền vi phạm Q*
Trang 3328
Hình 4: Minh họa thuật toán FQ(%X,Y ) tìm bao lôi tiền vỉ phạm
3.1.2 Thuật toán FQ(% ,Y ) tìm bao lồi tiên vi phạm Thuát toán 3.1.1 Bước — Dat O':= 0; i:=1; Buéc1 While @” không là bao lồi tiền vi phạm do icitl
Tính đúng đắn của thuật toán (xem [5], trang 27-28)
Thuật tốn FQ(X ,¥ ) tìm bao lồi tiền vi phạm có độ phức tạp tính toán la O((m-1)(n-2))
Nhận xét 3.1.1 Trong qué trinh tim bao 16i tién vi pham cla X_ đối
voi Y , dé kiém tra dinh g, cua Y \{qo} cé nam trong bao Idi cia Q,,, hay
không, ta chi can xem q; c6 thudc vao mién tam gidc p,,,p,p, hay không
3.2 Thuật toán con tim link 3.2.1 Khái niệm link
Cho đa giác đơn điệu PQ_ Xét hai đường gấp khúc X và Y_ trên đa
giác PO làxX = P vàY =@ có chung đỉnh đầu z và đỉnh cuối b Đường
Trang 3429
Định nghĩa 3.2.1 (Xem [9]) Link nối hai đường X và Y là đoạn thẳng
[z,v'] thoã mãn điều kiện ¿e X và ve Ÿ và mọi đỉnh của X \{u"} nam bên trái đường thẳng zw và Ÿ \{v'}I # =ø, (E' là miền mặt phẳng giới hạn bởi <9”, X, p¿ịp, >)
Tương tự ta cũng có khái niệm link của đường gấp khúc X vàY trong
đa giác đơn điệu XY_ trường hợp X =< j, pị , 0„¡ > có các đỉnh sắp xếp
ngược chiều kim đồng hồ và Y = < đụ, đ¡ , đ„¡ > có các đỉnh sắp xếp cùng chiều kim đồng hồ
Xét bài toán tìm link trong trường hợp X có các đỉnh sắp xếp cùng chiều kim đồng hồ
3.2.2 Thuật toán tìm link (Xem [5])
Mơ tả thuật tốn
Gia sit X= <P,:Dp- ws D> va Y=< q: LAI 1 đg>- trong đó
1<s<n-2 va 1<t<m-2 Ching ta di tim link theo su tang dan tir nhiing đỉnh
đầu tiên của X và Ÿ rồi đến những điểm kế tiếp
Cụ thể, bắt đâu với hai đỉnh p, := pQ, đ, := g„ ta xét link tam
[u,v'] := [p”„ 4] ta kiểm tra tất cả các đỉnh của X\{#} xem có tồn tại đỉnh
thuộc bên phải „/v” (nếu có thì gọi đó là vi phạm X) Nếu tồn tại vi phạm X
thì ta bỏ đỉnh p và tiếp tục với ic i+1, gan lại „” := p”„
Tiếp tục quay lại quá trình kiểm tra các đỉnh X \{u”} so với link tạm
[z',v"] vừa thiết lập và tiếp tục như vậy đến lúc không còn đỉnh vi phạm nữa
Khi không tồn tại đỉnh nào của X vi phạm nữa thì ta sẽ kiểm tra các đỉnh của
Ÿ Nếu không tồn tại đỉnh nào của Ÿ \{v”} thuộc vào Z thì [z,v'] là đường
Trang 3530
Ngược lại, ta có đỉnh của Ÿ \{v”} thuộc vào # (gọi là vi phạm Ÿ ) thì ta
bỏ đỉnh q, và tiép tuc v6i j<—j+1(gan lại v' := q’)
Bây giờ ta dugc link tam [v’,v'] mới và quay lại sự kiểm tra như ban đầu đối với sự vi phạm X rồi vi phạm Ÿ_ đến khi nào đồng thời không còn vi phạm Xvà Ÿ thì dừng lại Và ta nhận được [zÏ,v'] là đường link của X và Y
Thuật toán 3.2.1 Link(X ,Y )
Bước) — Thuc hin FQ(X ,¥ ) Giả sử
KES Pye Porm D7 Y ESI Qo >
Buéc 1 uc= Đụ vis q,: 1:=0;7 :=0; Bước2 While [z ,v'] không phải link do While [w,v'] vi phạm X do ici+l:u =p; While [w’,v'] vi pham Y do ich vq 3.3 Thuật toán chính
Gia sit O° va [u",v’] lần lượt là bao lồi tiền vi phạm và link của đường gấp khúc cùng chiều (tương ứng ngược chiều) kim đồng hồ X đối với Y ngược chiều (tương ứng cùng chiều) kim đồng hồ Khi đó ta gọi: - TC(% ) là biên trái (tương ứng biên phải) của bao lồi @” lấy từ đỉnh a dén u’ - TCL(% ,¥ ) 1a viéc di tim TC(X_) va link [u",v’] gittaX và Y (Xem [5])
Quy uée: Néu [u',v'], (u':= p,; v= q, Ia link cha X = < a=pg pạ 0„¡=b>
Trang 3631
< w”,v', b> tương ứng là [wÏ,v”]Y < đ„ đ,„ - đ„a b> và đường gấp khúc < ứ”, b > tương ứng là < #”, pạ„¡ , D„a„ Ð >
3.3.1 Mô tả thuật toán
Xét đa giác đơn điệu PQ@_ Bắt đầu gán / := 0,xX=P ,Y =@ Thực hiện TCL(X ,Y ) có link là [z,v'] và TC@ ) Đặt Z¿= TC(X )
- Nếu y” = b thì đường ngắn nhất Z = Z¿Y [',v'] Nếu vzb thì ta gán
lại !:= 1,X =<HÏvÏ, ,b>,Y =<H, b> Sau đó thực hiện TCLŒ ,Y ) với X va Y vita gan, ta lại có link là [z',v'] và TC@ ) Đặt Z= TC(X )
Nếu v'= b thì đường ngắn nhất Z = Zạ YZ, Y [w',v']
- Tương tự nếu vÌ zb thì ta gán lại !:= 2, rồi /:=3, và X = < nÏ,„v”, , b >, Y =<r, ,b > Cho đến khi v”= b thì kết thúc và lúc đó ta có đường ngắn I nhat 2= Y 2, Y [wv] j=0 Thuật toán chính
Bước 1 Bat dau tai a = py= qo Dat /:=0,X =P ,Y=Q
Buée2 — Thuc hién TCL(X ,Y ) Dat 2,=TC(x ) 1 Ifv'=bthen2 = Y 2, Y [z,v'] Stop j-0 Else, datX =<u,Vv, ,b>VAY =<u, ,b> 1:=1+ 1 go to (2)
Nhận xét: Viéc dat X =P ,Y =Q hoặc X =Q, Y =P trong Buéc 1
Trang 3732 3.3.2 Tính đúng đắn của thuật toán
Thuật toán chính sử dụng bao lồi làm định hướng cho ta cách tìm đường đi từ đỉnh a đến đỉnh ð trong miền đa giác đơn điệu PQ@
Tính đúng đắn của thuật toán chính và đường chỉ ra trong thuật toán
này là đường ngắn nhất trong miền đa giác đơn điệu được chứng minh chỉ tiết bởi các Mệnh đề 3.2.1, 3.2.2, 3.2.3, 3.2.4 và Bổ đề 3.2.1 (Xem [5])
Đường ngắn nhất từ đỉnh ø dến đỉnh ð trong miền đa giác đơn là tồn tại
và duy nhất (Xem [18], trang 633- 701 ), do đó bài toán đường đi ngắn nhất
giữa hai đỉnh trong đa giác đơn điệu xét trong Luận văn này chỉ là một trường
hợp đặc biệt
Nhận xét:
- Trong thuật toán tăng dần tìm bao lồi tiền vi phạm đầu tiên của
đường X=P đối với đường Y =@ ta chỉ cần xuất phát từ hai đường đơn điệu XY chung đỉnh cuối ở là X = <a=pgạ 0„¡;=b> và Y = <q), ., q„¡=b>
- Vì [u”,y"] nằm trên đường đi ngắn nhất nên nếu vˆz b thì trong Bước 2
của thuật toán chính, đối với đường X chỉ cần xét từ đỉnh v' (tức là ta đặt X =<y', b>vàY =<r, b>)
Độ phức tạp tính toán của thuật toán là Ó(|P' |.|Ø |) (|P | |@ | lần lượt là
số đỉnh của đường P và @ ) (Xem [Š]) Ví dụ mình họa thuật toán chính
Cho đa giác đơn điệu tạo bởi hai đường gấp khúc đơn điệu
P =< d=Dp, P15 Pr P35 P4s Ps Dạ; Dạ» Dạ: Dạ» Dịo: Dịns Địa: PDịa Pigs +3 P21 =9 > VA
Q =< A=, is Vs V3 Vas V5 Vo đại đạc đo địa» Tits địa địa địa -› đạọ=Ð >
(xem Hinh 3, trang 26)
Sử dụng thuật toán dùng bao lồi làm định hướng, tìm đường đi ngắn
Trang 3833 2 “SN ne NY : 4 NI ; nh NI \ I3 va ENVIS N 1 ; z RS ¬ Bà SINS 118 en NSS mu 7 SSNSN WAS #12 as aes 19
Hình 5: Minh họa bài toán sử dụng bao lôi làm định hướng
Bat dau ta dat /:=0,X = P,Y = Ø\{z} Khi đó tìm bao lồi tiền vi
phạm của X đối với Y ta được Ợ = conv{đg, đ - , đ¡ạ} tiếp theo thực hiện
TCL(X ,Y ) khi đó ta nhận được Zạ= TCŒ )= [2 p,]Y [p¿, p;] và link [w',v']
= [Pr asl
Vi (v'=q,)# b, nén ta đặt lại J := 1, X = < vÏ=q;, qụ, , b >, Y =< HÌ=p;, Dy
, b>, Tìm bao lồi tiền vi phạm của X đối với Y ta được @”= conv{v', , đ¡;},
Trang 39Pisl-34
Tiếp theo, vi (v= p,;) # b, nên ta đặt lại J := 2, X =< vÏ=ps, pụa, ., Ð >,
Y =<=4¿¿„ q¡; b > Tìm bao lồi tiền vi phạm của X đối với Y ta được
Ø = conv{v'”, , p;ạ} và thực hiện TCU( ,Y_ ) khi đó ta nhận được
Z,= TCŒL ) = [p, p;ÌY [p,s, pị;] và link [zÝ„v `] = [p,;, b] Lúc này, ta nhận thấy v = b, nên quá trình tìm đường ngắn nhất kết thúc
Đường ngắn nhất Z = Zạ Y Z, Y2; Y [w,v'] = [ø=pạ p,ÌY [p„ p„] Y [p, Us] Y
[48> G10] ¥ [4105 2] ¥ (4i2» V6] ¥ Lie Pisl Y (Piss Pisl Y [Pìs; pị;] Y [no; P]:
Như vậy thuật toán thứ nhất dùng bao lồi làm định hướng cần thực hiện việc tìm bao lồi theo thuật toán tăng dần các điểm xuất phát từ một đường đơn
điệu cho đến lúc tìm được bao lồi tiền vi phạm ta xác định link [z',v'] Ta
được đoạn đầu tiên của đường ngắn nhất từ øz đến vỶ và lặp lại quá trình với
hàm đệ quy cho đến lúc v'=b
Thuật toán thứ hai sử dụng tam giác phân đa giác đơn đòi hỏi tập đỉnh đa
giác đơn, trong bài toán là đa giác đơn điệu cho trước, thực hiện quá trình tam
giác phân đa giác, tiếp đến thực hiện thuật toán Dijkstra trên cây đối ngẫu, cuối
cùng thực hiện thuật toán phễu mới xác định được đường đi ngắn nhất
Trang 4035
KẾT LUẬN
1 Trong luận văn này, chúng tôi đạt được những kết quả sau:
e Trình bày đầy đủ các chương trình con để đi đến thuật toán chính dùng bao lồi làm định hướng tìm đường đi ngắn nhất giữa hai đỉnh trong đa
giác đơn điệu
e_ Chỉ ra được trong thuật toán chính dùng bao lồi làm định hướng tìm
đường đi ngắn nhất giữa hai đỉnh trong đa giác đơn điệu, thuật toán tìm bao
lồi tiền vi phạm đầu tiên chỉ cần xuất phát từ hai đường đơn điệu theo cùng một phương có chung đỉnh cuối và trong lần lặp tiếp theo của thuật toán TCL(X ,Y ) (với link [z ,v'] trước đó) ta chỉ xét cho đường X tính từ đỉnh v
e Trinh bay thuật toán chính tìm đường đi ngắn nhất giữa hai điểm trong đa giác đơn của Lee và Preparata, chi tiết thuật toán tìm đường đi ngắn
nhất giữa hai đỉnh trong đa giác đơn điệu 2 Những vấn đề tiếp tục nghiên cứu:
e Tiếp tục tìm cách giảm độ phức tạp của thuật toán tìm đường đi ngắn nhất giữa hai đỉnh trong đa giác đơn điệu sử dụng bao lồi làm định