651

Пятнашки и А*

Навеяно постом Собеседование vs первый рабочий день и комментами к нему.

Ходил на курсы С++ для общего развития. Работа с программированием никак не связана, но мечтал с юности об этом деле, а возможности небыло. Подрос немного до 30+, начал нормально зарабатывать и решил воплощать мечту. Был самый старший в группе, годиков на десять от всех.
Так вот. На курсах была задачка написать игру Пятнашки с примитивным интерфейсом. Из функционала - только клик по квадратикам с цифрами, их перемещение и распознавание победной комбинации.

Пятнашки и А*

Преподаватель решил немного нас подзадорить и сказал, кто напишет автосборку из случайной раскладки, того САМ лично за руку поведёт на собеседование. Описал он эту задачу, как не воплотимую для таких простых как мы.

Вобщем-то, зацепил за живое.
Не боги же горшки лепят, подумал я. И погряз на 2 месяца в изучение темы и написание кода. Информации в интернете было очень мало. Можно сказать и небыло вовсе. Пример кода посмотреть не у кого было. На каком то сайте нашёл чью то работу с олимпиады, где математичесски оценивались разные варианты применения разных алгоритмов для решения этой задачи. Вот тут то я и познакомился с А* )))
Что бы понять его на интуитивном уровне ушло ещё недели две. Но когда пазл в голове сложился в чёткую картинку я почувствовал настоящую эйфорию. Код просто рекой полился. Автосборка была написана!
Я был больше чем просто рад, я кайфовал ежесекундно!

На очередном занятии показал результат преподавателю. Тот открыл ехешник, посмотрел на интерфейс и сказал, что сейчас покажет как это должно выглядеть. Открыл чей то проект, бесспорно визуально более красивый, и начал хвалить его автора - бывшего своего студента. Рассказывал какой он был распрекрасный чувак и как много добился на сегодня. Я попросил запустить автосборку чужого проекта. С рандомной раскладки решение было найдено за 140 с чем то ходов. И тут я понял, что его вариант находит не самый короткий верный путь, а просто первый попавшийся верный, на что, собственно я и указал, попросив запустить эту же раскладку в моём варианте. Моя програма дошла до финиша за 40 с чем то ходов. Я был так горд собой, что это отчётливо читалось на моём лице. Но преподаватель не поверил. Попросил оставить исходники, что бы он всё перепроверил. Так и проверяет до сих пор. А мне по человечески было реально обидно, что он не сдержал слово и не предложил идти на собеседование. Я бы отказался, так как работа у меня нормальная, хоть и не в IT, но за державу обидно.
Доверие к себе он подорвал ровно в тот момент не только у меня, но и у всей группы.

А в А* я остался влюблён на всю жизнь )))

Лига программистов

2.3K постов12K подписчика

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

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

30
Автор поста оценил этот комментарий

Просто для интереса.

Если раскладка рандомная, то есть "высыпал из из коробки" и сложил, то в "пятнашках" есть нерешаемые раскладки. Определит алгоритм нерешаемость? Или не настолько случайная раскладка и есть ограничения?

раскрыть ветку (1)
18
Автор поста оценил этот комментарий
Нерешаемость определялась.
Ровно половина комбинаций такова.
показать ответы
30
Автор поста оценил этот комментарий

Просто для интереса.

Если раскладка рандомная, то есть "высыпал из из коробки" и сложил, то в "пятнашках" есть нерешаемые раскладки. Определит алгоритм нерешаемость? Или не настолько случайная раскладка и есть ограничения?

раскрыть ветку (1)
6
Автор поста оценил этот комментарий
И раскладка была истино рандомной. Сообщение о нерешаемости в классическом виде выводилось пользователю и он решал, запускать ли автосборку. Вдруг у него много свободного времени и оперативки )))
0
Автор поста оценил этот комментарий

Но тогда вы же в половине случаев должны попадать в несобираемую раскладку

раскрыть ветку (1)
4
Автор поста оценил этот комментарий
Так и было.
После цикла генерации поля была простенькая функция проверки на решаемость, результат которой выводился пользователю.
А вдруг пользователь хочет поиграть с нерешаемой комбинацией ))) Это его выбор.
показать ответы
Автор поста оценил этот комментарий

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

раскрыть ветку (1)
5
Автор поста оценил этот комментарий
Да, я серьёзно пишу что не смог найти решение для тривиальной задачи на языке который самый популярный для решения подобных задач!
0
Автор поста оценил этот комментарий

Что-то странно. Прямо в интернете первопроходец решивший пятнашки и не в начале 90х а в 2019.

При этом действительно если в постановке не требовалось лучшее решение то в задаче не нужен никакой перебор - задача решается примитивным алгоритмом который сможет исполнить человек. То есть ПК потратит гораздо меньше ресурсов на решение и что лучше вопрос спорный.  (кстати найти этот алгоритм без интернета способен школьник чуть умнее среднего)

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
Не понял я, что странного?
А задача решалась так, что бы потом нельзя было упрекнуть в решении на отъебись. Сразу предвидел замечания типа, "Так ты жеж не самый короткий путь ищешь, попробуй доработать."
показать ответы
3
Автор поста оценил этот комментарий

ТС, хочу дополнить по поводу нахождения решений.

Для каждой вершины у вас есть 3 числа:

1. эвристика

2. расстояние до этой вершины от стартовой

3. сумма 1 и 2


А вот теперь немного магии.

Если при переборе комнат алгоритм будет выбирать следующую комнату основываясь на (1) (эвристике), то вы получите самый кратчайший путь решения (но поиск решений будет происходить долго)

Если при переборе комнат алгоритм будет выбирать следующую комнату основываясь на (2), то вы найдете решение практически моментально, но оно может быть абсурдно по требуемому количеству ходов. (Например у меня для поля 3 на 3 алгоритм таким образом находил решение за 30 тысяч шагов)

Вы скорее всего используете (3) для выбора следующей компнаты.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
Абсолютно верно.
У каждой вершины есть свой вес.
В моём случае это была сумма следующих велечин:
1. Пройденное расстояние от старта;
2. Евристика пути до финиша основанная на манхеттенском расстоянии каждой доминошки до терминального положения.
показать ответы
Автор поста оценил этот комментарий

Что значит открыл ехзешник?

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
.exe файл из дебага.
0
Автор поста оценил этот комментарий

Откуда такой алгоритм?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Из википедии
0
Автор поста оценил этот комментарий
Можно и то и то) спасибо
раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Можно показать, что ровно половину из всех возможных 20 922 789 888 000 (=16!) начальных положений пятнашек невозможно привести к собранному виду: пусть квадратик с числом iрасположен до (если считать слева направо и сверху вниз) k квадратиков с числами меньшими  i.. Будем считать  ni=k, то есть если после костяшки с  i-м числом нет чисел, меньших  i, то  k=0.. Также введем число  e — номер ряда пустой клетки (считая с 1). Если сумма
является нечётной, то решения головоломки не существует
Иллюстрация к комментарию
1
DELETED
Автор поста оценил этот комментарий

Вопрос на схожую тему: судоку писали? Создание поля с 0 генератором случайных чисел? Да, перебор, но с парой хитростей и правил. Не в смысле создать строку из 9 цифр, записывать со сдвигом, потом перемешать строки/столбцы, а в смысле реального перебора? У меня вот в среднем 4,3мс на генерацию уходило (С#, 100'000 пусков циклом, i5-7300HQ в один поток). Просто не с кем померяться достижениями, а так ещё учусь говнокодить.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Нет, такого не писал.
Может когда нибудь... )))
25
Автор поста оценил этот комментарий

Алгоритм поиска кратчайшего пути по вершинам графа. Применяется много где, например в играх, чтобы NPC могли бегать и обходить препятствия.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Насколько я понял, построение маршрутов в навигаторах происходит так же с применением этого алгоритма.
показать ответы
0
Автор поста оценил этот комментарий

ТС, как у вас сейчас с языком? Программируете?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Давно не заходил.
К сожалению не смог уйти чисто в программирование.
Те навыки, которые получил на курсах, помогли найти новые решения на основном месте работы и по другому посмотреть на большой спектр задач.
Как итог - повышение, что ещё дальше отодвинуло меня от смены работы.
Сейчас код пишу редко, для себя, но получаю массу удовольствия.
3
DELETED
Автор поста оценил этот комментарий

Уважуха за забивание болта на то, что самый старый в группе ради достижения своих целей. А препод казел, конечно, что не сдержал слово.

И кстати забей болт на препода и развивайся дальше.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Спасибо за доброе слово.
0
Автор поста оценил этот комментарий
Можно и то и то) спасибо
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
В моём коде выглядит вот так:
Иллюстрация к комментарию
показать ответы
0
Автор поста оценил этот комментарий
А что мкнхеттенское расстояние и эвристическое?
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Не понял вопрос?
0
Автор поста оценил этот комментарий
А как проверяется решаемость? Без самой автосборки
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Вам код или логику?
показать ответы
2
Автор поста оценил этот комментарий

Отвечу за автора, что в данной задаче "случайной раскладкой" было бы логично считать случайное число случайных ходов из собранного состояния.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Немного не так.
Каждое из 16 чисел генерировалось с помощью rand() % 16, с исключением совпадений.
показать ответы
0
Автор поста оценил этот комментарий

в каком году происходило это?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
2019-2020
показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества