Przeskocz do treści

Delta mi!

Historia pewnego trenera

Janusz Schmude

o artykule ...

  • Publikacja w Delcie: październik 2019
  • Publikacja elektroniczna: 30 września 2019
  • Autor: Janusz Schmude
    Afiliacja: doktorant, Instytut Informatyki, Wydział Matematyki, Informatyki i Mechaniki, Uniwersytet Warszawski
  • Wersja do druku [application/pdf]: (393 KB)

Czy pokazując poprawność algorytmu, warto sięgnąć po matematyczne twierdzenia? Jak najbardziej! Przekonamy się o tym, rozważając problem zbalansowanego rozwoju w 2-wymiarowych systemach dodawania wektorów ( Vector Addition Systems - VAS), ubrany w historyjkę o zawodniku i trenerze.

obrazek

Rozważmy trenera, który trenuje jednego zawodnika. Co pewien czas, na przykład co 3 miesiące, trener musi wybrać metodę treningową na kolejny okres z pewnej skończonej puli metod 𝒜. W tym celu korzysta z pomocy symulatora, w którym może sprawdzić, jakie umiejętności będzie miał dany zawodnik po zastosowaniu metody X∈ 𝒜. Zależy mu na znalezieniu takiego ciągu metod, aby po ich kolejnym zastosowaniu zawodnik rozwinął się w sposób zbalansowany - o tym, co przez to rozumiemy, za chwilę.

Zakładamy, że zawodnik x jest w całości opisany przez parę liczb naturalnych, na przykład: szybkość, technika. Założymy również, że metody trenera to wektory liczb całkowitych, a aplikacja metody do zawodnika powoduje przesunięcie jego umiejętności o taki właśnie wektor, o ile nie powoduje to "zejścia" któregoś z parametrów poniżej zera.

Mówimy, że zawodnik |x = (x1,x2) jest z całą pewnością lepszy lub równy zawodnikowi y = (y1,y2), co zapisujemy (x1,x2)⩾ (y1,y2), jeżeli jest co najmniej tak samo szybki i wyszkolony technicznie, czyli gdy jednocześnie |x1⩾ y1 i |x2⩾ y2. Jeżeli dodatkowo nie jest mu równy, czyli x1≠ y1 lub |x2≠ y2, to piszemy x > y, na przykład (500,600) > (500,500). Uważny Czytelnik od razu spostrzeże, że niektórzy zawodnicy są nieporównywalni, na przykład (600,700) i |(800,500). Powiemy, że zawodnik rozwinął się (w sposób zbalansowany), jeżeli stał się z całą pewnością lepszy. Ścieżką treningową nazywamy dowolny ciąg metod treningowych |T = X1X2...Xn, a efekt zastosowania kolejno metod X1,X2,... dla zawodnika x będziemy oznaczać przez T (x). Ścieżkę |T nazwiemy rozwojową dla zawodnika |x, jeżeli po jej zastosowaniu rozwinął się, czyli gdy |T(x) > x.

Przykład 1. Niech 𝒜 = {A,B}, gdzie |A= (4,−4), a B = (−2,4). Ścieżka |T = ABB jest rozwojowa dla |x = (4,4), gdyż  A B B |(4,4) − (8,0) − (6,4) − (4,8), a |(4,8) > (4,4). Nie jest ona rozwojowa dla y = (1,1), ponieważ w tym punkcie nie można zastosować metody A, gdyż y2 + A2 = 1+ (−4) =− 3 jest liczbą ujemną. Co więcej, dla y nie ma żadnej ścieżki rozwojowej.

Sformułujemy teraz problem w sposób ścisły i zaproponujemy algorytm, który ma go rozwiązywać.

Problem (zbalansowanego rozwoju).
Dane wejściowe:
punkt (startowy)  2 x0 ∈N ,
skończony zbiór 𝒜 par liczb całkowitych (wektorów).
Pytanie: czy istnieje taki ciąg punktów kratowych w ćwiartce dodatniej |x,x ,...,x ∈N2 1 2 n , że dla każdego |i istnieje wektor |A∈𝒜 taki, że |xi+1 = xi + A oraz |xn > x0?

Najpierw podamy bez dowodu pewien lemat pomocniczy.

Lemat 1. Istnieje ścieżka rozwojowa z x0 wtedy i tylko wtedy, gdy istnieje ścieżka rozwojowa z pewnego punktu xk osiągalnego z |x0 (czyli takiego, że xk = T (x0), dla pewnej ścieżki |T ).

Mając na uwadze powyższy lemat, będziemy zajmować się pytaniem, czy jest punkt xk osiągalny z |x0, z którego istnieje ścieżka rozwojowa. Równoważnie: szukamy ścieżki (x0,x1,...,xn) takiej, że xk < xn dla jakiegoś |0⩽ k < n.

Algorytm. Konstruujemy kandydata na |(x0,x1,...,xn) przez back-tracking, czyli "jak nie wyjdzie, to zrób krok wstecz i pójdź w innym kierunku": będąc w punkcie x , i aplikujemy niezaaplikowaną do tej pory w tym punkcie metodę |A (o ile jest taka), otrzymując kolejny punkt na ścieżce xi+1 = xi + A. Gdy "nie wyjdzie", czyli gdy xi+1 jest mniejszy lub równy pewnemu xk obecnemu już na ścieżce, robimy "krok wstecz", czyli usuwamy xi+1 ze ścieżki i cofamy się do x . i Jeżeli z kolei |x i+1 jest większy od któregoś |xk obecnego już na ścieżce, kończymy algorytm i zwracamy TAK, ponieważ ścieżka |(xk,xk+1,...,xi+1) jest rozwojowa dla xk (por. lemat 1). Jeżeli algorytm nie może wykonać już żadnego kroku, zwraca NIE.

obrazek

Przykład 2. Rozważmy następującą instancję problemu: |x0 = (8,0),𝒜 = {A,B,C,D}, gdzie |A= (−5,5),B = (− 4,3),C = (4,−6),D = (10,− 6). Wówczas stosując powyższy algorytm, otrzymujemy drzewo ścieżek

Ścieżki |A nie da się kontynuować; w 𝒜 nie ma wektora, który po dodaniu do (3,5) miałby obie współrzędne nieujemne. Z kolei |BBC prowadzi do mniejszego punktu. Wreszcie |BBD prowadzi do większego.

Na pierwszy rzut oka algorytm po prostu działa. Okazuje się, że trochę tutaj przemilczeliśmy...

Ustalmy jakieś |x 0 i |𝒜. Jest jasne, że jeżeli powyższy algorytm zatrzyma się i zwróci odpowiedź, to jest ona poprawna. Ale czy algorytm na pewno się zatrzymuje?

Skąd wiadomo, że każda ścieżka zostanie zakończona? Czy może się zdarzyć, że na pewnej ścieżce będziemy otrzymywać coraz inne nieporównywalne wartości, na przykład (70,130),(90,110),(100, 100), (80,120),...? Czy trener może nigdy nie odejść od komputera? Okazuje się, że nie może tak się zdarzyć, a wynika to bezpośrednio z lematu Dicksona.

Lemat 2 (Dicksona). Niech x ,x ,x ,... 1 2 3 to nieskończony ciąg punktów z  2 |N . Wówczas istnieją pewne dwa indeksy i < j takie, że xi ⩽ x j.

A zatem, gdyby pewna ścieżka nigdy nie została zakończona, to wszystkie pary liczb na niej byłyby nieporównywalne, co przeczyłoby lematowi Dicksona.

Trener już się cieszy, że symulacje na pewno kiedyś się zakończą i wróci na treningi. Ale zaraz, zaraz… udowodniliśmy jedynie, że żadna ścieżka nie jest nieskończona. Czy jednak nie może być tak, że każda ścieżka jest skończona, ale jest nieskończenie wiele coraz dłuższych ścieżek? Wówczas nasz algorytm nigdy by się nie zatrzymał. Okazuje się, że tak nie może być, a odpowiada za to lemat Königa, zastosowany do drzewa konfiguracji symulatora.

Lemat 3 (Königa). Jeżeli w drzewie skierowanym |T każdy wierzchołek ma skończenie wiele następników i w T nie ma nieskończonej ścieżki, to T ma skończenie wiele wierzchołków.

Podsumowując dowód, na mocy Lematu Dicksona wszystkie ścieżki w drzewie konfiguracji symulatora są skończone, a więc na mocy Lematu Königa ma ono skończenie wiele wierzchołków. Wynika stąd, że algorytm zatrzyma się i, jak już zauważyliśmy, zwróci poprawną odpowiedź.

A jak rozwiązać ten problem w wymiarze większym niż 2? Pomocny okaże się artykuł autorstwa Wojciecha Czerwińskiego "Na granicy możliwości" (Delta 1/2014). Zachęcamy do jego lektury!