avva: (Default)
avva ([personal profile] avva) wrote2002-08-05 07:13 pm

ещё раз о подлодке

Обещанное решение задачи о подлодке.

Постараюсь объяснить как можно более подробно, но если останется непонятным, можно задавать вопросы.

Нарисуем в уме координатную сетку. Пусть ось X обозначает возможные точки начала движения лодки (все целые числа), а ось Y - возможную её скорость (тоже все целые числа).

Если мы подозреваем, что "истинной" является какая-то конкретная точка на этой плоскости, например, точка с координатами (2,-3) (означающая, что подлодка начинает движение в точке 2 и движется со скоростью -3 единицы в минуту), то мы можем проверить эту гипотезу выстрелом в любую минуту N. Для этого надо просто в минуту N выстрелить по числу 2 + (-3)*N. Если мы попадём по подлодке, значит, всё хорошо (это необязательно значит, что "истинной" была именно точка (2,-3) -- есть и другие точки, приводящие к тому же числу на N-ной минуте -- но нам важно, в конце концов, то, что мы попали по подлодке). Если мы промахнёмся, то как минимум эту точку мы отвергли в качестве возможной.

Если бы у нас был алгоритм, позволяющий последовательно "проверять на вшивость" все точки нашей плоскости одну за другой, то это решило бы задачу. Такой алгоритм перебирал бы точку за точкой, рано или поздно добираясь до любой точки на плоскости (если до тех пор не попал ещё в подлодку). Т.к. какая-то точка на плоскости является "истинной", то рано или поздно алгоритм бы до неё добрался и попал бы в подлодку (если не попал в неё ещё раньше). Это было бы гарантированным.

Естественно, не любой перебор точек одной за другой нам подходит. Например, представим себе алгоритм, который стреляет последовательно в числа: 1, 4, 9, 16, 25, 36, ... Его можно представить, в наших терминах, как алгоритм, к-й "проверяет на вшивость" последовательно одну за другой точки (0,1), (0,2), (0,3)... - т.е. исходит из предположения, что подлодка начинает движение в точке 0, и проверяет одну за другой все возможные положительные скорости (учитывая в своих выстрелах номер данной минуты, естественно). Понятно, что такой алгоритм никогда не поймает подлодку, для которой "истинной" является точка (-1, -1), например. Не поймает именно потому, что он не обходит все точки на плоскости - вместо этого он уходит в бесконечность по оси Y, оставляя все остальные точки неисследованными.

Но на самом деле есть простой алгоритм, "обходящий" все точки на плоскости, и его легко представить геометрически. Он просто обходит все точки по концентрическим квадратам. Сначала проверяет точку (0,0); затем все точки, лежащие на квадрате с центром в 0 и длиной стороны в 2 единицы (а именно, точки (1,1), (1,0), (1,-1), (0,-1), (-1,-1), (-1,0), (-1,1), (0,1) ); затем все точки, лежащие в следующем концентрическом квадрате - с центром в 0 и длиной стороны в 4 единицы, и так далее. Каждую точку он "проверяет на вшивость", стреляя в то число, где должна была быть подлодка сейчас (на данной минуте N -- алгоритм ведёт счёт минутам, естественно), если бы именно эта точка была "истинной". Ясно, что двигаясь таким образом, мы рано или поздно дойдём до любой точки на плоскости (хоть и очень медленно), и поэтому рано или поздно убъём подлодку.

[identity profile] wildernesscat.livejournal.com 2002-08-05 11:45 pm (UTC)(link)
Ой, как просто и красиво!

??

(Anonymous) 2002-08-06 06:32 am (UTC)(link)
А вы там говорили еще что-то о множестве алгоритмов движения подлодки. Насколько я понимаю, их надо по оси Z откладывать, а идти можно концентрическими кубами?

Re: ??

[identity profile] avva.livejournal.com 2002-08-08 05:17 am (UTC)(link)
Ага, именно так. Но там возникли некоторые осложнения, см. дискуссию в той записи.

Вообще говоря, можно сколько угодно осей добавлять; например, пусть подлодка изначально движется по плоскости, а не по прямой - нет проблем, будем обходить 4-х мерное простраство (2 координаты начального положения и 2 координаты скорости) 4-х мерными кубиками. И т.п.

Re: ??

[identity profile] malenkiy-scot.livejournal.com 2002-08-08 08:30 am (UTC)(link)
Кстати, just for the record, если разрешить подлодке менять направление бесконечное число раз, тоже ничего не выйдет. Доказательство основывается на той же идее, что и доказательство с любым алгоритмом.


Re: ??

[identity profile] avva.livejournal.com 2002-08-08 08:33 am (UTC)(link)
Да, это понятно.

[identity profile] eugen.livejournal.com 2002-08-07 01:31 pm (UTC)(link)
С ума сойдти -- как вы умудряетесь сочетать в себе эти вещи.
Алгоритмическое программирование и филологию.
И ещё не мало весчей.
Просто поражаюсь на Вас.

(Anonymous) 2002-08-14 01:40 am (UTC)(link)
на самом деле есть куда более простое решение: стрелять случайным образом. от приведенного алгоритма это отличается только тем, что мы не проверяем одно и то же начальное условие движения подлодки несколько раз. ну этот алгоритм можно доработать просто: мы запоминаем все свои выстрелы и не стреляем по алгоритму, если мы его уже проверяли.

Pro

Re:

[identity profile] avva.livejournal.com 2002-08-14 11:00 am (UTC)(link)
Если стрелять случайным образом, нет абсолютной гарантии того, что рано или поздно заденешь любую точку.

(не говоря уж о сложности случайного выбора точек на плоскости).

(Anonymous) 2002-08-15 02:29 am (UTC)(link)
как это нет гарантии? есть. если стрелять бесконечное время бесконечными выстрелами попадешь в любую точку гарантированно. это тоже самое что обходить точки по порядку. иначе не было бы гарантии что при обходе точек по порядку мы дойдем до бесконечно удаленной точки

Pro

[identity profile] avva.livejournal.com 2002-08-15 02:38 am (UTC)(link)
Нет, это не то же самое. При обходе точек по порядку гарантия попадания в любую точку есть потому, что для любой точки мы можем вычислить точный момент, когда мы в неё попадём. Это и есть единственная возможная гарантия. При случайном обстреле всегда остаётся возможность того, что в данную точку мы никогда не попадём. Такую возможность можно с уверенностью исключить только в случае эксплицитного доказательства для каждой точки в отдельности того, что в неё попадут (в случае обхода по порядку для каждой точки в отдельности можно дать такое эксплицитное док-во: основываясь на устройстве алгоритма, доказать, что в такой-то момент времени он выстрелит именно в неё).

(Anonymous) 2002-08-15 05:56 am (UTC)(link)
совершенно справедливо. речь здесь идет лишь об алгоритме выбора случайной точки. если он допускает выбор любой точки, то мы гарантированно попадем во все точки

Pro

Re:

[identity profile] avva.livejournal.com 2002-08-15 06:02 am (UTC)(link)
если он допускает выбор любой точки, то мы гарантированно попадем во все точки

Нет, гарантии такой нет, если нет эксплицитной формулы или другого способа показать, в какой конкретный момент будет поражена любая конкретная точка.

(Anonymous) 2002-08-15 06:30 am (UTC)(link)
ну да. я же сказал: если он допускает выбор любой точки.... то есть если есть возможность доказать, что он может выбрать любую точку