Algorytm ścigania ruchomego celu

20

Załóżmy, że mamy czarną skrzynkę f którą możemy wyszukać i zresetować. Kiedy przywrócić f stan fS o f ma wartość pierwiastka wybranego losowo równomiernie ze zbioru

{0,1,...,n1}
gdzie n jest ustalone i znane dla danego f . Do zapytania f , element x (przypuszczenie) z
{0,1,...,n1}
jest podany, a zwracana wartość to . Ponadto stan dla jest ustawiony na wartość , gdzie jest wybierane losowo równomiernie z(fSx)modnfSffS=fS±kk
{0,1,2,...,n/2((fSx)modn)}

Wykonując jednolicie losowe domysły przy każdym zapytaniu, należałoby się spodziewać domysłów przed uzyskaniem , z wariancją (podane bez dowodu).nfS=xn2n

Czy można zaprojektować algorytm, aby działał lepiej (tzn. Robił mniej domysłów, być może z mniejszą zmiennością liczby domysłów)? O ile lepiej mógłby to zrobić (tj. Jaki jest optymalny algorytm i jaka jest jego wydajność)?

Skuteczne rozwiązanie tego problemu może mieć istotne implikacje oszczędnościowe podczas strzelania do królika (ograniczonego do przeskakiwania na okrągłym torze) w ciemnym pokoju.

Patrick87
źródło
Nie jestem pewien, czy strzelanie do królików to informatyka.
Dave Clarke,
6
@DaveClarke Ale jeśli potrafisz strzelać do królików, rozwiązałeś problem zatrzymania królików.
Patrick87,
@DaveClarke Żadne z nich nie strzela do satelitów w kosmos, ale obliczenia pozycji satelity są. To pytanie nie różni się całkowicie od kryptoanalizy.
Gilles „SO- przestań być zły”

Odpowiedzi:

13

Po pierwsze, zakładam, że do

Ponadto stan dla jest ustawiony na wartość , gdzie jest wybierane losowo równomiernie zfSffS=fS±kk

{0,1,2,...,n/2((fSx)modn)}

masz na myśli

Ponadto stan dla jest ustawiony na wartość , gdzie jest wybierane losowo równomiernie zfSffS=fS+kmodnk

{|n2((fSx)modn)|,,1,0,1,2,,|n2((fSx)modn)|}

W przeciwnym razie nie jest całkowicie jasne, czy zawsze obowiązuje i jak dokładnie .fS{0,...,n1}fS±k

Dzięki temu problem sprowadza się do „zagubienia jak najwięcej”. Zauważ, że im bliżej strzelamy do królika, tym większy robi chmiel; w skrajnym przypadku mamy . Powoduje to jednolity przeskok między i , co w zasadzie całkowicie ponownie losowo ustawia pozycję królika. Z drugiej strony, jeśli przegapimy tak bardzo, jak to możliwe - przesunięcie o , królik faktycznie się nie rusza (!), A czarna skrzynka faktycznie nas aktualizuje na ten fakt. Dlatego możemy po prostu odwrócić się i zastrzelić królika.fSx=±1modn(n/2±1)(n/2±1)fSxmodn=n/2

Pozostaje nam znalezienie procedury zaginięcia w każdym ujęciu. Proponuję proste „wyszukiwanie binarne”. (Dogodnie pominę zaokrąglenie.) Postępuje z grubsza w następujący sposób:

  1. Zresetuj i strzelaj w dowolnej pozycji, aż z odpowiedźTo wymaga stałej liczby kroków w oczekiwaniu.(fSxmodn){14n,...,34n}.
  2. Teraz wiemy, że poprzednia pozycja królika i że nie przesunęła się ona bardziej niż kroków w dowolnym kierunku. To w zasadzie zmniejsza o połowę naszą przestrzeń wyszukiwania w następnej iteracji, ponieważ królik musi znajdować się w pozycjifS14nfS{(fS14n)modn,...,fS,...,(fS+14n)modn}
  3. Recurse: Strzelaj w pozycji . Z prawdopodobieństwem pozycja na którą wskoczył królik w kroku 1 i 2, leży w zakresie . W takim przypadku ponownie zmniejszyliśmy o połowę przestrzeń wyszukiwania. Z prawdopodobieństwem królik nie skoczył w tym zakresie, ale ponieważ wiemy, że , mamy takie same założenia jak w kroku (2) i dlatego nic nie tracicie.fSn/2modn1/2fS{fS18n,...,fS,...,fS+18n}1/2fSxmodn=fSfS+n/2modn{12n14n,...,12n+14n}

Każdy krok wymaga spodziewanego czasu do sukcesu i zmniejsza o połowę przestrzeń wyszukiwania, dając ogólną oczekiwaną liczbę .2=O(1)O(logn)

HdM
źródło