czwartek, 6 września 2018

Pomiar czasu - algorytm cz3 - założenia (rozważania)

Rozważania nad pomiarem czasu kolejne starcie. (nie zawsze potrzebne i sensowne)

Mógłbym przy rejestracji czasu zwracać uwagę na dystans przypisany do zawodnika, dlaczego? dzięki temu wiem ile powinien mieć odbić (zarejestrowanych czasów).
Dla przykładu zawodnik który jest zapisany na 100 km:
  1. pierwszy wpis - start - Mszana,
  2. drugi wpis wpis - punkt kontrolny - Bojanów,
  3. trzeci wpis - meta - Mszana
Dla zawodnika, który jedzie na 150 km (nowy dystans w Mszanie, historycznie już był):
  1. start - Mszana,
  2. punkt kontrolny - Bojanów,
  3. punkt kontrolny - Mszana,
  4. meta - Mszana.
Dla zawodnika jadącego na 200 km:
  1. start - Mszana,
  2. punkt kontrolny - Bojanów,
  3. punkt kontrolny - Mszana,
  4. punkt kontrolny - Bojanów,
  5. meta - Mszana 
  Dla zawodnika jadącego na 50 km:
  1. start - Mszana,
  2. meta - Mszana
Dla dystansów powyżej 200 km rejestracje czasu odbywają się według schematu 200 km, wyjątkiem jest dystans 750 km gdzie dochodzi krótka pętla 50 km która nie ma punktu kontrolnego (w Bojanowie).
Być może pośrednim rozwiązaniem (tudzież ułatwieniem) było by dołożenie do tabeli z dystansami kolumny z minimalną ilością rejestracji czasu. Są jednak pewne uwagi co do powyższego rozwiązania:
  1. jeżeli zawodnik nie przejedzie swojego dystansu?, może się tak zdarzyć i się zdarza, ktoś wybrał dystans np 600 km, a przejechał tylko 200 km,
  2. Zawodnik zapomniał się odbić na punkcie lub zdarzyła się nieprzewidziana awaria, 
Częściowym rozwiązaniem jest traktowanie informacji o ilości odbić jako informację pomocniczą , a nie warunek, tzn
  • Szukamy w tabeli Czas rejestracji dla danego zawodnika ,
  • wyliczamy czas całkowity (końcowy) odejmując od ostatniego pierwszy,
  • zliczamy odbicia,
  • porównujemy ilość odbić z tabelą dystanse w której mamy dodatkową kolumnę określająca minimalną ilość rejestracji czasu,
  • w tym momencie mamy jakąś wiedzę na temat jaki jest czas końcowy i ile odbić składa się na ten czas czyli ile przejechał (jaki dystans)
 Można by algorytm rozbudować nie sprawdzam na jaki dystans zapisany jest zawodnik a jedynie sprawdzam ilość rejestracji uzyskuje jaki to jest dystans, sprawdzam limit czasu, wtedy przypisuje zawodnika do konkretnego dystansu bez względu na to jaki dystans wybrał przy rejestracji.

Jak sprawdzić odcinek czasu (wyliczyć)?
Na dystansie 50 km  nie ma problemu  bo i tak będę brał po uwagę pierwszy i ostatni wpis. Problem pojawia się już na dystansie 100 km, mamy trzy rejestracji , jeżeli zawodnika ma dwie to świadczy o tym że się nie odbił czy można na to przymknąć oko? Zależy, jeżeli czas przejazdu jest porównywalny z innymi ale jak się to ma do regulaminu? regulamin mówi brak odbicia dyskwalifikacja lub brak klasyfikacji na danym dystansie (dylemat).
Jak powiedzieć człowiekowi, który przejechał 600 km, że raz się nie odbił i jest zdyskwalifikowany?
Przy nowym algorytmie wiedza na temat  pojedynczych odcinków jest drugorzędna, liczyć się będzie tylko pierwszy i ostatni czas dzięki któremu będę miał całkowity czas przejazdu.

Wczoraj podczas jazdy samochodem w padła mi myśl do głowy (na dziurze). Jak zawodnik odbija się  na dowolnym punkcie, do bazy wpada jego czas, mam czas startu i czas ostatniego odbicia. Dzię ki temu mogę wyliczyć czas przejazdu. Nie potrzebuje budować skomplikowanego algorytmu, wystarczy że po każdym odbiciu będę liczył różnicę (ostatni minus pierwszy) czasów i zapisywał ją do tabeli z wynikami dla danego zawodnika.
Dzięki temu otrzymam czasy na daną pętle, a nawet jej część.
Wydaje się to bardzo proste, struktura tabeli wyglądała by w ten sposób:
  1. wynik_id - wiadomo  klucz główny (PK) auto inkrementacja,
  2. wynik_wartosc - wynik różnicy czasów kolumna time,
  3. zawodnik_id - (FK) - klucz obcy tabeli zawodnik,
  4. dystans_prawdopodobny - ta kolumna może nie odzwierciedlać rzeczywistości. 
Jeszcze małą uwago spomaniało mi się, z ustaleniem faktycznego dystansu może być problem więc kolumna dystans_prawdopodobny będzie się inkrementować po każdym wyliczeniu czasu, to powinno dać przybliżony dystans, który i tak będę musiał wyliczyć gdyż odbić jest więcej niż dystansów.
Wyszukiwanie czasów dla zawodnika nie wymagało by żadnego liczenia ani skomplikowanie go zapytania


select Z.zaw_nazwisko,Z.zaw_imie,NS.numer_zawodnika,W.wynik_wartosc  Wynik W
inner join Zawodnik Z on Z.zaw_id = W.zawodnik_id
inner join NumerStartowy NS on NS.numer_id = Z.numer_id
where
      zaw_id = @zaw_id
order by W.wynik_id asc

Do tego informacje o dystansie wybranym przy rejestracji, a dodatkowo dystans rzeczywisty na podstawie rejestracji. 
Spomniało mi się jeszcze jedno można by się pokusić o sprawdzenie numeru czytnika tzn. zawodnik odbija się na czytniku ja wpisuje numer dyskietki do bazy oprócz tego można by spróbować ściągnąć numer urządzenia, dzięki temu bym był w stanie określić na którym odbił się dwa razy. Było by to dodatkowe zabezpieczenie (oprócz zwłoki 30 minut).

Brak komentarzy:

Prześlij komentarz

 Po wielu miesiącach przerwy Czteroletnim exodusie do bloga ismartdev, który zdechł w zeszłym roku w listopadzie, na powrót wstąpiłem w ten ...