Аналитическое решение квеста из игры "Братья-пилоты"

Автор темы daun 
ОбъявленияПоследний пост
ОбъявлениеРаботодателям и кадровым агентствам: Размещение вакансий и рекламы в форуме26.03.2008 03:07
ОбъявлениеРекомендации по использованию теха в нашем форуме07.10.2009 17:41
ОбъявлениеВакансия Perl программиста в ABBYY Language Services24.01.2012 18:23
26.07.2010 17:09
Аналитическое решение квеста из игры "Братья-пилоты"
Здравствуйте уважаемые форумчане!

Начну немного издалека.
Однажды, когда моя младшая сестрёнка заинтересовалась квестами, я вспомнил об игре "Братья Пилоты: По следам полосатого слона", в которую мы играли в 199.. каком-то году (боже, я такой старый? Ужас :)). Вобщем, раскопал, поставил, посидели, посмеялись, поиграли...

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

И одолел меня вот какой вопрос: а имеет ли описанная задача аналитическое решение? Поскольку я увлекаюсь кодингом, алгоритмическое решение я себе вполне представляю. А вот как сформулировать проблему математическим языком, и самое главное какими методами её можно (и можно ли) решить - не представляю совершенно. Из той каши в голове, что осталась от институтского курса вышки сварить ничего не получается.

Как Вы понимаете, конкретное решение для описанной игры мне не нужно. Мне просто интересна сама возможность аналитического решения и указание на математический аппарат для этого.

Описание задачи (ежели чего упустил сильно не бейте:))
Дано:
1. Дана квадратная матрица (размерность, в обобщённом случае любая, в игре - 4х4)
2. Элементы матрицы могут принимать только два значения (ну, пусть ноль или еденица)
3. Начальное состояние элементов матрицы - произвольное
4. Изменение значения одного из элементов, влечёт изменение значений элементов в ряду и столбце содержащих изменяемый элемент (отмечу, цепной реакции тут нет. Т.е. наведённые изменения в столбце и ряду не вызывают последующих изменений).
Данное изменение элемента (вместе с наведенными изменениями) назовём ходом.

Собственно, требуется: привести все элементы матрицы в одинаковое состояние (т.е. все нули или все еденицы) за конечное (но не ограниченное) число ходов, с указанием порядка сделанных ходов (неважно, номера это будут элементов, или множество индексов).


Собственно вот как-то так. Если дочитали пост до конца - уже спасибо! :)
Буду рад если кто-нибудь заинтересуется и ответит.
Удачи всем!
26.07.2010 18:23
Для матрицы четного порядка.
Для матрицы четного размера (как в игре) сделаем так:
1. Найдем, если такая ручка есть, ручку в неправильном положении и повернем ее. Назовем эту ручку ручкой А.
2. Теперь, не трогая ручку А, которая приняла правильное положение, повернем по разу все ручки на той вертикали и той горизонтали, на пересечении которых находится ручка А. Тем самым все ручки совершат четное число оборотов, то есть останутся исходных состояниях, кроме А, которая стала правильной.
3. Достаточно проделать действия из п.п. 1, 2 по одному разу со всеми неправильными ручками.
Теперь о сути решения: я придумывал алгоритм, который после выполнения одного шага, то есть одинакового набора операций, позволяет гарантированно увеличить число "правильных" элементов матрицы. Тогда, в силу конечности общего числа элементов матрицы, алгоритм за конечное число шагов обязательно достигнет цели.
Как мне кажется, поиск такого алгоритма для каждой конкретной задачи - уникален, тут нет единообразного подхода, который годился бы на все случаи жизни.
Тем не менее, есть тренинги, которые позволяют резко увеличить успешность поиска для конкретного человека. К числу таких тренингов можно отнести так называемые "математические сборы" - стандартный способ тренировок национальных сборных перед выступлением на ММО, региональных сборных перед выступлением на межрегиональных МО и т.д.



Редактировалось 1 раз(а). Последний 26.07.2010 18:33.
26.07.2010 21:07
Если учесть...
Если учесть, что каждое "тыкание" приводит к инверсии строго заданной группы элементов, то приходим к двум выводам:
1) порядок этих "тыканий" неважен;
2) "тыкать" два раза в один и тот же элемент бессмысленно.
Из чего, в свою очередь, можно сделать вывод, что эта задача может быть решена не более чем за n^2 "тыканий", где n - порядок матрицы. Это позволяет представить решение рассматриваемой задачи в виде вектора фиксированной размерности, n^2 элементов которого могут принимать значения 1 - "тыкать" и 0 - не "тыкать" в соответствующий элемент исходной матрицы.
В таком виде задача имеет конечное число вариантов решений (2^(n^2)), может рассматриваться как комбинаторная (см. "Комбинаторика") и решаться методами комбинаторной оптимизации. Некоторые задачи комбинаторной оптимизации могут быть сведены к виду задач линейного программирования, а именно: целочисленного линейного программирования. Рассматриваемая же задача сводится к частному случаю целочисленного линейного программирования - булевскому программированию.

Комбинаторная оптимизация тесно связана с теорией сложности вычислений, поскольку здесь этот вопрос далеко не праздный. Для многих частных задач комбинаторной оптимизации разработаны специализированные решения, которые по своей производительности превосходят общие подходы. Не исключено, что для Вашей задачи также может быть разработан или уже существует специализированный алгоритм.
26.07.2010 21:41
однако
Цитата
boris_notkin
Если учесть, что каждое "тыкание" приводит к инверсии строго заданной группы элементов, то приходим к двум выводам:
1) порядок этих "тыканий" неважен;
2) "тыкать" два раза в один и тот же элемент бессмысленно.

неверно. важен порядок и тыкать можно в один и тот же элемент более одного раза.
26.07.2010 22:46
Если Вас не затруднит...
Цитата
zklb (Дмитрий)
неверно. важен порядок и тыкать можно в один и тот же элемент более одного раза.

Если Вас не затруднит, то приведите, пожалуйста, контрпример, демонстрирующий ошибочность моих выводов.
26.07.2010 23:16
Не вижу связи посылки и вывода.
Цитата
boris_notkin
Цитата
zklb (Дмитрий)
неверно. важен порядок и тыкать можно в один и тот же элемент более одного раза.

Если Вас не затруднит, то приведите, пожалуйста, контрпример, демонстрирующий ошибочность моих выводов.
Беда в том, что Ваш посыл и выводы из него сильно напоминают каноническую пару: "Человеческий мозг и грецкий орех - похожи. Поэтому спиртовая настойка из грецкого ореха должна помогать от головной боли". Вот попробуйте опровергнуть справедливость этого умозаключения...
26.07.2010 23:18
ошибка)
да, был не прав) беру слова обратно.
27.07.2010 08:49
Каюсь...
Цитата
brukvalub
Цитата
boris_notkin
Цитата
zklb (Дмитрий)
неверно. важен порядок и тыкать можно в один и тот же элемент более одного раза.

Если Вас не затруднит, то приведите, пожалуйста, контрпример, демонстрирующий ошибочность моих выводов.
Беда в том, что Ваш посыл и выводы из него сильно напоминают каноническую пару: "Человеческий мозг и грецкий орех - похожи. Поэтому спиртовая настойка из грецкого ореха должна помогать от головной боли". Вот попробуйте опровергнуть справедливость этого умозаключения...

Каюсь, думал, что понять это проще, чем объяснить. Исправляюсь.
Для удобства будем считать, что исходная матрица $ A $ состоит из элементов $ a_{i,j} $ со значениями 1 и -1, а операция тыканья в элемент $ a_{i,j} $ приводит к умножению всех элементов строки $ i $ и столбца $ j $ матрицы $ А $ на -1.
Тогда по завершению комплекса тыканий, состояние элемента
$ a_{i,j}=a_{i,j} (-1)^{s_{i,j}} $,
где $ s_{i,j} $ сумма всех тыканий в строку $ i $ плюс сумма всех тыканий в столбец $ j $. Иными словами - состояние элемента $ a_{i,j} $ изменится только в том случае, если число тыканий $ s_{i,j} $ будет нечетным, при этом порядок тыканий неважен. А если учесть, что каждое тыканье приводит к увеличению значений соответствующей группы элементов $ s $ на 1, то становится понятно, что тыкать в одно и то же место более одного раза – бессмысленно, т.к. с точки зрения четности/нечетности, второе тыканье просто компенсирует первое.



Редактировалось 2 раз(а). Последний 27.07.2010 08:54.
27.07.2010 12:14
...
Здравствуйте!

Спасибо всем кто заинтересовался.
Все Ваши суждения лично мне кажутся вполне логичными.
Но, если я правильно понял, речь идёт о построении оптимизированного (с учётом Ваших выводов и суждений), но всё-таки алгоритма перебора? А другие варианты возможны? Т.е., например, если (и возможно ли?) зависимость изменения элемента от связанных с ним элементов выразить некоторой функцией, то можно ли свести задачу к системе каких-либо уравнений? Или подобный класс задач в принципе не решается другими методами?
27.07.2010 18:55
Вы неправильно поняли.
Цитата
daun
Здравствуйте!

Спасибо всем кто заинтересовался.
Все Ваши суждения лично мне кажутся вполне логичными.
Но, если я правильно понял, речь идёт о построении оптимизированного (с учётом Ваших выводов и суждений), но всё-таки алгоритма перебора?...
В своем первом сообщении в этой теме я указал Вам универсальный алгоритм для матрицы четного размера. Там не идет речи о переборе. Так что Вы неправильно поняли.
27.07.2010 19:20
Не все так однозначно...
Цитата
daun
Здравствуйте!

Спасибо всем кто заинтересовался.
Все Ваши суждения лично мне кажутся вполне логичными.
Но, если я правильно понял, речь идёт о построении оптимизированного (с учётом Ваших выводов и суждений), но всё-таки алгоритма перебора? А другие варианты возможны? Т.е., например, если (и возможно ли?) зависимость изменения элемента от связанных с ним элементов выразить некоторой функцией, то можно ли свести задачу к системе каких-либо уравнений? Или подобный класс задач в принципе не решается другими методами?

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

> Или подобный класс задач в принципе не решается другими методами?

Этот вопрос очень близок к вопросу о равенстве/неравенстве классов P и NP. Ответ на него стоит $1 млн. Именно столько составляет премия за ответ на каждый из шести оставшихся вопросов тысячелетия (до Перельмана, доказавшего гипотезу Пуанкаре, их было семь).

> Т.е., например, если (и возможно ли?) зависимость изменения элемента от связанных с ним элементов выразить некоторой функцией, то можно ли свести задачу к системе каких-либо уравнений?

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

> Но, если я правильно понял, речь идёт о построении оптимизированного (с учётом Ваших выводов и суждений), но всё-таки алгоритма перебора?

В общем случае, да. Но Вы ведь интересовались областью математики и просили указать "традиционный" аппарат решения таких задач. Что есть, то есть.

> А другие варианты возможны?

Я не зря ранее отмечал, что очень часто для таких частных задач отыскиваются специализированные решения, которые превосходят то, что предлагает общий подход. Одно из таких решений, не требующих явного перебора всех вариантов, Вам предложил г-н brukvalub. Если дополнить предложенное решение осознанием того факта, что четное число раз тыкать в один и тот же элемент не имеет смысла, а любое количество нечетных тыканий эквивалентно одному тыканью, то получим вполне аналитическое решение: по одному разу ткнуть в каждый из тех элементов, для которых значение суммы нежелательных элементов по горизонтали и вертикали в исходной матрице нечетно. По виду, такое решение до некоторой степени похоже, например, на определение ранга матрицы, а вычислительно является даже более простым.
27.07.2010 20:54
И я - согласный
Цитата
boris_notkin
.......

Я не зря ранее отмечал, что очень часто для таких частных задач отыскиваются специализированные решения, которые превосходят то, что предлагает общий подход. Одно из таких решений, не требующих явного перебора всех вариантов, Вам предложил г-н brukvalub. Если дополнить предложенное решение осознанием того факта, что четное число раз тыкать в один и тот же элемент не имеет смысла, а любое количество нечетных тыканий эквивалентно одному тыканью, то получим вполне аналитическое решение: по одному разу ткнуть в каждый из тех элементов, для которых значение суммы нежелательных элементов по горизонтали и вертикали в исходной матрице нечетно. По виду, такое решение до некоторой степени похоже, например, на определение ранга матрицы, а вычислительно является даже более простым.
" Видя Мишкину тоску,
- А он в тоске опасный,
- Я еще хлебнул кваску
И сказал: "Согласный!"
И я - согласный, что Вы, boris_notkin, указали, как сильно оптимизировать выписанный мной алгоритм.
28.07.2010 15:14
Всем спасибо!
Большое спасибо всем Вам за ответы и потраченное время.

Всего Вам доброго!
09.08.2010 15:25
Решение
В свое время видел такое решение этой задачи:

1) Два состояния 0 и 1 и определим, что нам нужно получить матрицу из нулей.
2) Каждый "крест" в матрице либо четный либо нечетный (сумма по столбцу и строке). Щелчком на центре "креста" изменяется его состояние.
3) Матрица из нулей - единственная матрица полностью состоящая из четных "крестов" => щелкая по центрам нечетных крестов прийдем к матрице из нулей
29.08.2010 04:16
из фидо
Извините, только зарегистрированные пользователи могут публиковать сообщения в этом форуме.

Кликните здесь, чтобы войти