Minh họa bao lồi tiền vi phạm

Một phần của tài liệu Một thuật toán hữu hiệu tìm đường ngắn nhất giữa hai đỉnh trong đa giác đơn điệu (Trang 26)

2 Thuật toán tìm link

2.1Minh họa bao lồi tiền vi phạm

Như vậy, quá trình FQ(X,Y) cho ta kết quả: bao lồi tiền vi phạm Q∗

của đường gấp khúc X đối với đường gấp khúc Y, Xe và Ye.

Nhận xét 2.1.1 Trong quá trình tìm bao lồi tiền vi phạm của X đối với

Y, để kiểm tra đỉnh qi của Y \ {q0} có nằm trong bao lồi của Qk+1 hay không, ta chỉ cần kiểm tra xem qi có thuộc vào miền tam giácpkplpr hay không, (minh họa bởi hình 2.1).

2.1.2 Thuật toán FQ(X,Y) tìm bao lồi tiền vi phạm

Thuật toán

Step 0. Đặt Q∗:= Q1;

i := 1;

Step 1. While Q∗ không là bao lồi tiền vi phạm do

i i+ 1

Quá trình bao lồi tiền vi phạm kết thúc khi đó ta đồng thời nhận được

Tính đúng đắn của thuật toán

Để chứng minh tính đúng dấn của thuật toán trước tiên ta nêu ra một số mệnh đề sau.

Mệnh đề 2.1.1 Nếu X =< p0, p1, .., pn−1 > là đường gấp khúc đơn điệu

Qi là bao lồi của đường gấp khúc Xi =< p0, p1, ..., pi >, (i < n 1) thì đỉnh pi+1 luôn nằm ngoài Qi. p0 p1 p2 p3 p4 p5 p6 p7 p8

Hình 2.2:Minh họa Mệnh đề 2.1.1 (p8 nằm ngoàiQ7)

Chứng minh. Thật vậy, do X là đơn điệu nên khi đó tồn tại hệ trục tọa độ đề các vuông góc Oxy có trục hoành cùng phương với phương đơn điệu của X để hoành độ của pi < pi+1 (Nhận xét 1.2.1 Chương1). Mặt khác pi là điểm cực biên xa nhất về bên phải của bao lồi Qi, (dấu hiệu

nhận biết điểm cực biên).

Do vậy hiển nhiên pi+1 nằm ngoài Qi . ¤

Mệnh đề 2.1.2 Cho Y =< q0, q1, ..., qm−1 > là một đường gấp khúc đơn

điệu. Khi đó, q0 là điểm cực biên của convY.

Chứng minh. Giả sử Y =< q0, q1, ..., qm−1 > là một đường gấp khúc đơn điệu theo phương L. Ta xét hệ toạ độ đề các vuông góc Oxy sao cho trục

Ox có phương trùng với phương của L. Và không mất tính tổng quát ta

cũng giả sử đường gấp khúc đơn điệu Y được đánh chỉ số theo thứ tự từ trái qua phải.

Khi đó theo giả thiết thì q0 là điểm đầu tiên của Y nên trong hệ toạ độ Oxy thì q0 là điểm có hoành độ bé nhất. Do vậy theo dấu hiệu nhận

biết điểm cực biên của bao lồi của tập hợp các điểm {q0, q1, ..., qm−1} thì

q0 là điểm cực biên, (xem [13]). ¤

q0 qm−1 q1 qm−2 qm−3 q2 qi L x y O x0 y0 Hình 2.3:Minh họa Mệnh đề 2.1.2 Mệnh đề 2.1.3 Giả sử X =< a p0, p1, .., pn−1 > là đường gấp khúc

đơn điệu, khi đó từ đỉnh pi+1 nếu kẻ hai tiếp tuyến trái pi+1pl và phải pi+1pr tới Qi, (pl là tiếp điểm của tiếp tuyến trái, pr là tiếp điểm của tiếp tuyến phải) thì 0 ≤l < r, (tức là pl không thể đứng trước a nếu tính theo biên trái của bao lồi Qi xuất phát từ a theo chiều ngược chiều kim đồng hồ).

Chứng minh. Điều này dễ dàng suy từ tính đơn điệu của X. ¤ Từ những mệnh đề trên ta chỉ ra sự tồn tại của Q∗Xe, Ye.

¦ Rõ ràng thuật toán luôn dừng sau hữu hạn bước và luôn tồn tại Q∗. Vì đường gấp khúcXY là hữu hạn và trong các bao lồi Qi, (i n−1) (adsbygoogle = window.adsbygoogle || []).push({});

luôn tồn tại ít nhất một bao lồi chứa đỉnh của Y \ {q0}, (chẳng hạn đó

Qn−1 bởi vì XY cùng có chung điểm cuối là b).

¦ Luôn tồn tại Xe vì pk+1 luôn nằm ngoài bao lồi Qk, (Mệnh đề 2.1.2) như vậy sẽ luôn tồi tại tiếp tuyến trái và phải và theo Mệnh đề 2.1.3 thì

pl không thể đứng trước a nếu tính theo biên trái của bao lồi Q∗. ¦ Ye tồn tại là hiển nhiên vì nó là tập hợp các điểm vi phạm .

Tiếp theo ta xem xét đến độ phức tạp của thuật toán. Độ phức tạp của mỗi lần kiểm ta một đỉnh của đường gấp khúc Y \ {q0} có thuộc vào bao lồi Qi hay không là hằng số. Như vậy để kiểm tra toàn bộ dây

Y \ {q0} sẽ có độ phức tạp là O(m 1).

Trong quá trình tìm bao lồi Q∗ tối đa phải tìm làn−2 bao lồi, (bởi vì

i = 2, n−1) và độ phức tạp tìm bao lồi của đường gấp khúc XiO(i), (xem mục 1.4.1 Chương 1). Nhưng quá trình tìm bao lồi theo thuật toán tăng dần của đường gấp khúc không tự cắt thì việc thêm vào một điểm trong quá trình tìm có độ phức tạp là hằng, (xem [17]). Sau mỗi lần tìm được bao lồi mới thì chúng ta cần kiểm tra tất cả m 1 đỉnh của

Y \ {q0} thuộc có thuộc vào bao lồi hay không. Như vậy nên độ phức tạp của thuật toán tìm Q∗O

³

(m 1)(n−2)

´ . 2.2 Thuật toán tìm link

2.2.1 Khái niệm link

Cho đa giác đơn điệu X Y tạo bởi hai đường gấp khúc XY. Đường gấp khúc X các đỉnh sắp xếp cùng chiều kim đồng hồ, Y có các đỉnh sắp xếp ngược chiều kim đồng hồ. Thực hiện FQ(X,Y) ta có Xe và Ye.

Định nghĩa 2.2.1 (xem [7]) Link nối hai đường X Y là đoạn thẳng

[u∗, v∗] thoã mãn điều kiện u∗ Xe v∗ Ye và mọi đỉnh của X \e u∗

nằm bên trái đường thẳng u∗v∗ {Y \e v∗} ∩ F = ∅, (F (funnel) là miền

mặt phẳng giới hạn bởi < u∗v∗,Xe, pkpr >), (minh họa bởi hình 2.4).

pr=p0 s pl=p0 0 p0=q0 u v q0 0 qt p1 b pk+1 Q q0 1 q1 e X e Y X Y F

Tương tự ta cũng có khái niệm link của đường gấp khúc XY trong đa giác đơn điệu X Y trường hợp X =< p0, p1, .., pn > có các đỉnh sắp xếp ngược chiều kim đồng hồ và Y =< q0, q1, .., qm > có các đỉnh sắp xếp cùng chiều kim đồng hồ.

Sau đây chúng tôi 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ồ.

2.2.2 Thuật toán tìm link

Mô tả thuật toán

Giả sử Xe =< p0 0, p0 1, ..., p0 s >Ye =< q0 0, q0 1, ..., q0 t >.

Chúng ta đi tìm link theo sự gia tăng dần từ những đỉnh đầu tiên của e

XYe rồi đến những điểm kế tiếp, (minh họa bởi hình 2.5).

pr=p0 s pl=p0 0 u∗=p0 i v∗=q0 j q0 0 q0 t pk+1 q0 1 e X e Y F p0 1 p0 3

Hình 2.5: Minh hoạ quá trình tìm link

Cụ thể, bắt đầu với hai đỉnh pi := p0

0, qj := q0 (adsbygoogle = window.adsbygoogle || []).push({});

0, ta xét link tạm

[u∗, v∗] := [p0

i, q0

j] ta kiểm tra đỉnh của tất cả các đỉnh của X \ {ue ∗} xem có tồn tại đỉnh thuộc bên phải u∗v∗ (nếu có thì gọi đó là vi phạm Xe). Nếu tồn tại vi phạm Xe thì ta bỏ đỉnh p0

i và tiếp tục với i ←− i+ 1, gán lại u∗ := p0

i.

Tiếp tục quay lại quá trình kiểm tra các đỉnh X \ {ue ∗} so với link tạm [u∗, 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 Xe vi phạm thì ta sẽ kiểm

tra các đỉnh của Ye. Nếu không tồn tại đỉnh nào của Y \ {ve ∗} thuộc vào

F thì [u∗, v∗] là đường link cần tìm.

Ngược lại, ta có đỉnh của Y \ {ve ∗} thuộc vào F (gọi là vi phạm Ye) thì ta bỏ đỉnh q0

j và tiếp tục với j ←− j + 1 (gán lại v∗ := q0

j).

Bây giờ ta được link tạm [u∗, v∗] mới và quay lại sự kiểm tra như ban đầu đối với sự vi phạm Xe rồi vi phạm Xe đến khi nào đồng thời không còn vi phạm Xe và Ye thì dừng lại. Và ta nhận được [u∗, v∗] là đường link của XY.

Thuật toán

Step 0. Thực hiện FQ(X,Y), (xem mục 2.1.2). Giả sử

e X =< p0 0, p0 1, ..., p0 s >; Ye =< q0 0, q0 1, ..., q0 t > Step 1. u∗ := p0 0;v∗ := q0 0; i := 0; j := 0;

Step 2. While [u∗, v∗] không phải link do While u∗v∗ vi phạm Xe do i ←i+ 1; u∗ := p0 i; While u∗v∗ vi phạm Ye do j j + 1; v∗ := q0 j;

2.2.3 Tính đúng đắn của thuật toán

Để chứng minh tính đúng đắn của thuật toán ta cần phải chứng minh sau hữu hạn bước nào đó thuật toán sẽ dừng và tìm ra được [u∗, v∗] thỏa mãn khái niệm link đã nêu trong định nghĩa.

Trước hết ta chứng minh rằng nếu xuất phát từ một đỉnh v bất kì thuộc Ye luôn tồn tại tiếp tuyến trái với Q∗ có tiếp điểm u∗ Xe. Điều này là hiển nhiên vì v nằm ngoàiQ∗ thì luôn tồn tại duy nhất tiếp tuyến trái với Q∗. Mặt khác v ∈ F nên u∗ Xe.

Tiếp theo ta sẽ chứng minh tồn tại v∗ Ye. Giả sử tồn tại v0 Ye nào đó có chỉ số lớn hơn v∗v0 ∈ F thì khi đó ta v∗ := v0. Do Ye là hữu hạn nên rõ ràng đến hữu hạn bước gán như vậy thì việc đi tìm v∗ phải

dừng lại. Do link tạm [u∗, v∗] thõa mãn điều kiện là tiếp tuyến trái của

Q∗v∗ luôn thuộc Ye. Vậy nên luôn tồn tại được link [u∗, v∗].

Độ phức tạp của thuật toán

- Step 0 có độ phức tạp là O

³

(m−1)(n−2)

´

, (xem mục 2.1.2).

- Bước gán ở Step 1 là phép tính cơ sở nên có độ phức tạp là O(1). (adsbygoogle = window.adsbygoogle || []).push({});

- Mỗi lần kiểm tra tính vi phạm Xe và vi phạm Ye ở Step 2 có thời gian tính toán là hằng số. Do vậy độ phức tạp tính toán của Step 2 là O(s) + O(t). Vậy độ phức tạp tính toán là O ³ (m−1)(n−2) ´ + 2O(1) +O(s+ t).

2.2.4 Ví dụ minh họa thuật toán tìm link

Cho đa giác đơn điệu X Y. Giả sử quá trình FQ(X,Y) ta có bao lồi tiền vi phạm Q∗Xe =< p0 0, p0 1, p0 2, p0 3, p0 4 >, Ye =< q0 0, q0 1, q0 2, q0 3 > . Tiếp tuyến trái và phải của Q∗ = Qk qua pk+1 là pk+1p0

0 và pk+1p0

4. Bây giờ ta mô tả tìm link [u∗, v∗] của XY theo thuật toán, (minh hoạ bởi hình 2.6). pr=p0 4 pl=p0 0 u∗=p0 2 v∗=q0 2 q0 0 q0 3 pk+1 q0 1 e X e Y F p0 1 p0 3 (1) (2) (3) (4) (5)

Hình 2.6:Minh hoạ ví dụ tìm link

Trước tiên ta gán [p∗, q∗] := [p0

0, q0

0]. Kiểm tra [p∗, q∗] thấy không có đỉnh vi phạm Xe. Do vậy ta kiểm tra sự vi phạm Ye, nhận được đỉnh

q20 vi phạm, nên gán [p∗, q∗] := [p00, q01]. Kiểm tra [p∗, q∗] thấy không có đỉnh vi phạm Xe, tiếp kiểm tra sự vi phạm Ye nhận được đỉnh q0

0, q0

2, nên gán [p∗, q∗] := [p0

0, q0

2]. Kiểm tra [p∗, q∗] với Xe thấy p0

1, p0

2 vi phạm nên

[p∗, q∗] := [p0

1, q0

2]. Kiểm tra [p∗, q∗] với Xe nhận được đỉnh p0

2 vi phạm, nên gán [p∗, q∗] := [p02, q20]. Kiểm tra [p∗, q∗] với Xe thấy không có đỉnh vi phạm, tiếp kiểm tra sự vi phạm Ye, không có đỉnh nào vi phạm Ye. Vậy

[p∗, q∗] := [p0

2, q0

Đường đi ngắn nhất giữa hai đỉnh trong đa giác đơn điệu

Liên quan đến câu hỏi mở của J. S. B. Mitchell đưa ra năm 2000 trong [[19], trang 643] đã nêu trong phần giới thiệu, trong chương này chúng tôi trình bày thuật toán mới giải bài toán chính sau đây.

Bài toán chính

Cho đa giác đơn điệu PQ, được tạo thành bởi hai đường gấp khúc đơn

điệu P =< a = p0, p1, ..., pn−1 = b >Q =< a = q0, q1, ..., qm−1 = b >.

Tìm đường đi ngắn nhất Z, nối hai đỉnh a và b trong miền đa giác PQ.

v=b P Q Z a u u u v v

3.1 Thuật toán chính (adsbygoogle = window.adsbygoogle || []).push({});

Trước khi nêu lên thật toán chính chúng ta có một số khái niệm sau: Giả sử Q∗ và [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ồ.

pr=p0 s pl=p0 0 a u v q0 0 qt p1 b pk+1 Q q0 1 q1 TC(X)=<a, ..,u∗> link[uv] X Y Hình 3.2:Mô tảTC(X)=<a, ...,u∗> Khi đó ta gọi:

¦ TC(X) là biên trái (tương ứng biên phải) của bao lồi Q∗ lấy từ đỉnh

a đến u∗.

¦ TCL(X,Y) (TCL stands for Tangent Chain and Link): Là việc đi tìm TC(X) và link [u∗,v] giữa XY.

Quy ước: Nếu [u∗, v∗], (u = pk; v∗ = qt) là link của X =< a =

p0, p1, ..., pn−1 = b >Y =< a = q0, q1, ..., qm−1 = b > trong đa giác đơn điệu X Y thì đường gấp khúc < u∗, v∗, ..., b > tương ứng là

[u∗, v∗] < qt, qt+1, ..., qm−2, b > và đường gấp khúc < u∗, ..., b > tương ứng là < u∗, pk+1, ..., pn−2, b >.

Mô tả thuật toán

- Bắt đầu gán l := 0, X = P, Y = Q. Thực hiện TCL(X,Y) có link là

[u∗, v∗] và TC(X). Đặt Z0 = TC(X).

- Nếu v∗ = b thì đường ngắn nhất Z = Z0 [u∗, v∗]. Nếu v∗ 6= b thì ta gán lại l := 1, X =< u∗, v∗, ..., b >, Y =< u∗, .., b >. Sau đó thực hiện

TCL(X,Y) với XY vừa gán, ta lại có link là [u∗v∗] và TC(X). ĐặtZ1 = TC(X). Nếuv∗ = bthì đường ngắn nhấtZ = Z0∪Z1[u∗, v∗]. -Tương tự nếu v∗ 6= b thì ta gán lại l := 2, rồi l := 3,... và

X =< u∗, v∗, ..., b >, Y =< u∗, .., b >. Cho đến khi v∗ = b thì kết thúc và lúc đó ta có đường ngắn nhất Z = Sl

j=0

Zj [u∗, v∗]. Cụ thể ta có thuật toán như sau:

Thuật toán chính (1) Bắt đầu tại a = p0 = q0. Đặt l := 0, X = P, Y = Q. (2) Thực hiện TCL(X,Y). Đặt Zl = TC(X). If v∗ = b, then Z = Sl j=0 Zj [u∗, v∗], Stop. Else, xét X =< u∗, v∗, ..., b >Y =< u∗, ..., b > l := l+ 1 go to (2).

Do thuật toán chính ở trên không dùng phép tam giác phân miền đa giác nên còn gọi là thuật toán KTGP, (KTGP: Không Tam Giác Phân). Nhận xét: Việc đặt X = P, Y = Q hoặc X = Q, Y = P trong bước (1) không làm thay đổi kết quả bài toán chính.

3.2 Tính đúng đắn của thuật toán

3.2.1 Một số tính chất

Mệnh đề 3.2.1 Giả sử Y =< q0, q1, ..., qm−1 > là một đường gấp khúc

đơn điệu theo phương L. Và {q0, q1, ..., qk} là tập con các đỉnh của Y sắp xếp theo thứ tự tăng dần của chỉ số trongY. Ta đặtYe =< q0, q1, ..., qk >. Khi đó: Ye =< q0, q1, ..., qk > cũng là đơn điệu theo phương L.

Chứng minh. DoY =< q0, q1, ..., qm−1 > là một đường gấp khúc đơn điệu theo phương L, nên khi đó tồn tại một hệ trục toạ độ đề các vuông góc Oxy có trục hoành cùng phương với L sao cho hoành độ xi của các điểm

qi thoã mãn xi < xi+1 với mọi i = 0, m−2.

{q0, q1, ..., qk} là tập con các đỉnh của Y sắp xếp theo thứ tự tăng dần của chỉ số trong Y. Nên trong hệ toạ độ Oxy đang xét, ta hiển nhiên có xi < xi+1 (với mọi i = 0, k 1) với xi là hoành độ của qi. Do đó Ye =< q0, q1, ..., qk > cũng là đơn điệu theo phương L. ¤

Mệnh đề 3.2.2 Nếu [u∗, v∗] là link của X =< p0, p1, .., pn−1 > Y =< q0, q1, .., qm−1 >, (v∗ = qk) thì Y∗ = [u∗, v∗] < qk, qk+1, ..., qm−1 > đơn điệu.

Chứng minh. Điều này dễ dàng suy ra được từ tính đơn điệu của Y

định nghĩa link. ¤

Mệnh đề 3.2.3 (xem [7]) Trong đa giác đơn điệu X Y, nếu [u∗, v∗] (adsbygoogle = window.adsbygoogle || []).push({});

link của của hai đường gấp khúc X =< p0, p1, ..., pn > cùng chiều kim

Một phần của tài liệu Một thuật toán hữu hiệu tìm đường ngắn nhất giữa hai đỉnh trong đa giác đơn điệu (Trang 26)