notatka
Transkrypt
notatka
Definicje Forma i odlew Wykład 4 2006/10/25 Problem PROBLEM „wyjęcia z formy” Dane: odlew P z górną ścianą g Pytanie: • czy istnieje wektor d taki, że P może być przesunięty w nieskończoność w kierunku d, nie przecinając MP • jeśli istnieje: podać taki wektor d. • Odlew: wielościan P, z wyróżnioną górną ścianą g (pozostałe ściany nazywamy zwykłymi) • Forma: prostopadłościan MP zawierający „otwór” o kształcie P, górna ściana P pokrywa się z górną ścianą MP [w układzie współrzędnych: możemy przyjąć, że górna ściana MP zawiera się w płaszczyźnie z = c dla stałej c] Definicja Niech out(f) dla ściany f wielościanu P oznacza wektor prostopadły do ściany f, skierowany na zewnątrz P. Twierdzenie Wielościan P o górnej ścianie g może być „wyjęty z formy” w kierunku d wtw gdy d tworzy kąt ≥900 z out(f) dla każdej ściany zwykłej f∈P. Dowód Formy a programowanie liniowe ⇒ Oczywiste (patrz ściany „stowarzyszone” z P i MP) ⇐ Zał, że punkt p∈P „zahacza” o MP (przecina ścianę). Wtedy: • długość d nieistotna • d=(dx,dy,dz) może być rozwiązaniem tylko gdy dz>0 [bo górna ściana równoległa do płaszczyzny z=0] • a zatem wszystkie możliwe kierunki d możemy reprezentować przez wektory d=(dx,dy,1), gdzie dx, dy dowolne Inaczej: wszystkie kierunki reprezentowane przez punkty na płaszczyźnie z = 1. • p to wierzchołek P (jeśli P „zahacza”, to również jego wierzchłek) • niech p przecina się ze ścianą f’w MP odpowiadającą f w P • wtedy kąt między out(f) i d mniejszy od 900 [rysunek...] Kąty i nierówności Kąt między wektorami a i b jest ≥900 wtw ich iloczyn skalarny jest ≤0. A zatem, d=(dx,dy,1) jest kierunkiem wyjęcia P wtw gdy dx∗out(f)x + dy ∗ out(f)y ≤ -out(f)z dla każdej zwykłej ściany f∈P Problem przecięcia półpłaszczyzn: Dane: półpłaszczyzny h1,...,hn, gdzie hi zdefiniowana przez nierówność ai ∗ x + bi ∗ y ≤ ci Wynik: punkt d=(dx,dy) należący do h1∩... ∩hn, lub informacja, że h1∩... ∩hn=∅ WNIOSEK Problem wyjęcia z formy można w liniowym czasie zredukować do problemu (niepustości) przecięcia półpłaszczyzn. Jak rozwiązywać problem przecięcia? Podejście 1: • Wyznacz obszar C wypukły będący przecięciem h1∩... ∩hn • podaj dowolny punkt obszaru C Podejście 2: Sformułuj jako zadanie programowania liniowego (LP): znajdź max (c1 x + c2 y) przy ograniczeniach ai ∗ x+ bi ∗ y ≤ ci, dla i=1,...,n gdzie c1, c2 dowolne Możliwe rozwiązania probl. przecięcia • wielokąt wypukły • zbiór pusty • obszar wypukły nieograniczony, brzeg utworzony przez odcinki i półproste Możliwe rozwiązania progr. liniowego Podejście przyrostowe (LP) • jedno rozwiązanie [wielokąt lub obszar nieograniczony, wektor (c1,c2) nie jest prostopadły do żadnego boku] • brak [zbiór pusty lub obszar nieograniczony] • zbiór nieskończony tworzący odcinek [ obszar nieograniczony lub wielokąt ] Dane: • H={h1,...,hn}, gdzie hi zdef. przez ai, bi, ci jak wcześniej • wektor c=(c1,c2) • założenie c nie jest prostopadły do żadnej prostej ogr. hi Algorytm LP: 1. Sprawdź czy w ogóle istnieje rozwiązanie (jak?) 2. Jeśli istnieje: wybierz ha, hb dla których istnieje rozwiązanie i ustal rozwiązanie v0 3. Dla i=1,...n: 1. jeśli vi-1∈hi to vi ← vi-1 2. jeśli vi-1 ∉ hi: Modyfikuj({h1,...,hi-1}, hi, c) Podejście przyrostowe c.d. Modyfikuj({h1,...,hp}, h, c) Niech l1, ...,lp,l –proste ograniczające h1,..,hn,h Wybierz p∈l taki, że: a) p ∈ hi dla każdego i=1,..,p b) p daje maksymalną wartość c1∗ px + c2 py wśród punktów spełniających (a) Jak to zrobić? • wyznacz l∩h1∩... ∩hp [jest to odcinek lub półpr.] • wybierz na tym odcinku jego koniec o większej wartości c1∗ px + c2 py Analiza Czas: O(n2) Jak zrobić to lepiej? • najpierw utwórz losową permutację h1,...,hn • liczymy nie czas najgorszego przypadku ale średni • ALE: czas średni po wszystkich permutacjach (nie po inputach) • i wybieramy najgorszy średni czas (dla najbardziej złośliwych danych – o ile jakieś dane będą w ogóle bardziej złośliwe) LEMAT 1 Niech Ci=h1 ∩... ∩ hi, niech vi to unikalne rozwiązanie programu liniowego {h1,...,hn}, c. Wtedy: • jeśli vi∈hi+1, to vi+1=vi • jeśli vi∉hi+1, to Ci+1=∅ lub vi+1 ∈li+1, gdzie li to prosta ograniczająca hi Lemat 1 – uzasadnienie algorytmu Analiza algorytmu zrandomizowanego Oznaczenia: Ti – czas wykonania i-tej iteracji: • O(1) jeśli vi-1 należy do hi • O(i) jeśli vi-1 nie należy do hi E[Ti] – wartość oczekiwana czasu i-tej iteracji T – czas całego algorytmu, E[T] – wartość oczek. T Analiza algorytmu zrandomizowanego Sprawdź czy w ogóle istnieje rozwiązanie E[T] = E[T1+...+Tn] = E[T1]+...+E[Tn] Dane: • H={h1,...,hn}, gdzie hi to półpłaszczyzna zdef. przez ai, bi, ci jak wcześniej • wektor c=(c1,c2) • założenie c nie jest prostopadły do żadnej prostej ogr. hi Wynik: • i, j takie, że zadanie liniowe dla funkcji celu c i półpłaszczyzn hi, hj ma rozwiązanie LUB • informacja, że zadanie sprzeczne [gdy część wspólna wszystkich hi jest pusta] LUB • półprosta z części wspólnej wszystkich hi, wzdłuż której funkcja c rośnie do nieskończoności [gdy zad. nieogr.] liniowość wart.oczek. E[Ti] = O(i ∗2/(i-2) ) „analiza wsteczna” • vi jest p-tem przecięcia dwóch prostych, ograniczających dwie półpłaszczyzny • z prawdopodobieństwem 2/(i-2) któraś z tych półprostych nie występuje w h1,...,hi-1 E[T]=O(n) Sprawdź( H={h1,...,hn}, c=(c1,c2)) Sprawdź czy w ogóle istnieje rozwiązanie Definicja. Kierunkiem półpłaszczyzny hi zdefiniowanej przez nierówność ai x + bi y ≤ ci nazywamy wektor prostopadły do prostej ai x + bi y = ci, skierowany do wnętrza półpłaszczyzny hi. Definicja. Kierunek „góra” to kierunek wektora (0,1) Definicja. Odległością wektorów u i v nazywamy mniejszy z kątów wyznaczonych przez wektory u i v. 1. 2. 3. 4. 5. 6. 7. Zmień współrzędne tak, aby c=„dół”, czyli c=(0,-1) Wybierz półprzestrzeń hk o kierunku najbliższym „góra” Wyznacz część wspólną K wszystkich hi takich, że |ai|=ak Jeśli K=∅, zwróć informację, że zad. sprzeczne i zakończ Niech lj oznacza prostą na granicy hj dla j=1..n Niech li to dolne ograniczenie K Dla każdego j takiego, że aj≠ ai: 1. Jeśli li∩hj ograniczona: zwróć [ograniczone] i oraz j i zakończ 8. Zwróć: zadanie nieogranicznoe Lemat Niech i będzie takie, że li to dolne ograniczenie K w algorytmie Sprawdz(H, c). Wówczas: • Jeśli li∩hj nieograniczona w dół dla każdego j takiego, że aj≠ ai to zadanie H, c jest nieograniczone. • Jeśli li∩hj ograniczona w dół dla pewnego j takiego, że aj≠ ai to zadanie (H, c) jest ograniczone lub sprzeczne Progr. liniowe w d wymiarach c.d. h1,..,hn– półprzestrzenie; g1,..,gn– podprzestrzenie „brzegowe” dla h1,..,hn c – funkcja celu 4. Szukanie rozw. zadania h1,..,hi-1 na podrzestrzeni gi • wyznacz p1,..,pi-1 – rzuty h1,..,hi-1 na gi • wyznacz rzut c’ funkcji celu c na gi • rozwiąż zadanie programowania liniowego w d-1 wymiarach dla półprzestrzeni p1,..,pi-1 i funkcji celu c’. Progr. liniowe w d>2 wymiarach h1,..,hn– półprzestrzenie; g1,..,gn– podprzestrzenie „brzegowe” dla h1,..,hn Jak wcześniej: 1. algorytm przyrostowy 2. losowe uporządkowanie półprzestrzeni 3. najpierw wybieramy d półprzestrzeni mających ograniczone rozwiązanie 4. jeśli rozwiązanie dla h1,..,hi-1 należy do hi, to jest rozwiązaniem dla h1,..,hi 5. jeśli rozwiązanie dla pierwszych h1,..,hi-1 NIE należy do hi, to NOWE rozwiązanie (dla h1,..,hi) jest punktem leżącym do gi Progr. liniowe w d wymiarach c.d. CZAS (oczekiwany!): n d T (d −1, i) i − d i =d +1 T (d, n) ≤ O(dn) + ∑ T (d , n) = O (d !n) Problem najmniejszego koła Dane: • P={p1,..,pn} – zbiór punktów na płasczyźnie Wynik: • D – najmniejsze koło zawierające P Oznaczenia: • Pi={p1,..,pi} • Di – najmniejsze koło dla zbioru Pi Problem najmniejszego koła c.d. Problem najmniejszego koła Algorytm MiniDisc(P): 1. Wyznacz losową permutację p1,..,pn 2. Wyznacz D2 3. Dla i=3,4,..,n 1. Jeśli pi ∈ Di-1, to Di =Di-1 2. w przeciwnym razie: Di = MiniDiscWithPoint({p1,..,pi-1}, pi) Problem najmniejszego koła c.d. Algorytm MiniDiscWithPoint(P, q) Dane: P={p1,..,pn}, q – punkty na płaszczyźnie Wynik: Najmniejsze koło zawierające P, z q na brzegu 1. Wyznacz losową permutację p1,..,pn 2. Niech D1 to najmniejsze koło zawierające p1 i q na brzegu 3. Dla i=2,..,n 1. Jeśli pi∈ Di-1, to Di =Di-1 2. w przeciwnym razie: Di = MiniDiscWithTwoPoints({p1,..,pi-1}, pi,q) Algorytm MiniDiscWithTwoPoints(P, q1, q2) Dane: P={p1,..,pn}, q1, q2 – punkty na płaszczyźnie Wynik: Najmniejsze koło zawierające P, z q1, q2 na brzegu 1. Niech D0 to najmniejsze koło zawierające q1, q2 na brzegu 2. Dla i=1,..,n 1. Jeśli pi∈ Di-1, to Di =Di-1 2. w przeciwnym razie: Di = koło (unikalne) z q1, q2 i pi na brzegu. Problem najmniejszego koła c.d. Problem najmniejszego koła c.d. Czas: • MiniDiscWithTwoPoints działa w czasie O(n) • MiniDiscWithPoint działa w oczekiwanym czasie O(n) • MiniDisc działa w oczekiwanym czasie O(n) Idea oszacowań: • korzystamy z faktu, że Di≠Di-1 z prawdopodobieństem nie większym niż 3/i Poprawność: Niech P, R – rozłączne zbiory punktów (R może być pusty), p∈P. 1. Jeśli istnieje koło zawierające P i takie, że wszystkie elementy R są na brzegu tego koła, wówczas jest tylko jedno takie koło md(P,R) o najmniejszym promieniu. 2. p ∈md(P-{p},R) ⇒ md(P,R)=md(P-{p},R) 3. p ∉md(P-{p},R) ⇒ md(P,R)=md(P-{p},R∪{p}) (czyli najmniejsze koło po dołączeniu p musi mieć p na swoim brzegu)