Автор Тема: Программы для решения головоломок, Filler3d  (Прочитано 17651 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн grigr

  • Глобальный модератор
  • *****
  • Сообщений: 5 105
  • Пол: Мужской
  • кручу-верчу
    • Мой Магазин
Если сможешь сделать функцию Решателя - было бы нереально круто!!!

Оффлайн kosshams

  • Новичок
  • *
  • Сообщений: 44
  • Пол: Мужской
Описываю использованный алгоритм деления фигуры на N равных частей по клеточкам.

Назовем фигурами части, на которые делится исходная фигура. Исходную же фигуру назовем полем. Через Sz (size) обозначим размер одной части, а через N - число частей, на которые делится поле.
Сначала находим все движения, переводящие фигуру, содержащую первую клетку поля, в другую фигуру. Некоторые такие движения сразу забраковываем, если число клеток, являющихся образом или прообразом движения, меньше 2*Sz.
Например, при делении правильного шестиугольника 5x5 с треугольной клеткой на 5 частей получается 545 таких движений.



Далее перебираем все наборы из N-1 движений. Например, при делении на 5 частей будет 4 движения, они переводят фигуру, содержащую первую клетку поля в оставшиеся 4 фигуры. Эти движения перебираются послойно. При выборе K движений должно удовлетворяться условие: число клеток, являющихся образом или прообразом хотя бы одного из выбранных движений не должно быть менее (K+1)*Sz. В том числе, когда все движения выбраны, каждая клетка поля должна участвовать хоть в одном движении. На самом деле, критерий еще усиливается в существующем варианте и может быть еще усовершенствован, см. ниже.
После выбора всех движений распределяем клетки по фигурам следующим образом.
Делаем прямой логический вывод. Он заключается в том, что пока есть клетка которая может быть заполнена только одной фигурой, мы ее относим к ней и соответствующие при выбранных движениях клетки относим ко всем остальным фигурам. При этом другие возможности в клетках, соотнесенных фигурам, исключаем со всеми относящимися движениями. Если есть клетка, которая не участвует ни в каком движении, то противоречие, делаем возврат в переборе вариантов.
Когда больше вывести ничего нельзя, проверяем возможность связности первой фигуры. Проверку связности можно было бы усилить, например, учитывать оставшееся число невыбранных клеток первой фигуры и более сложные топологические соображения. Кроме того, можно было бы не только забраковывать вариант, но и выводить, какие клетки обязаны принадлежать или не принадлежать первой фигуре. Но в основных исследуемых случаях такие улучшения несущественны для быстродействия.
Если вариант не отбракован проверкой на связность, то выбираем клетку, которая может принадлежать наименьшему числу фигур и рассматриваем 2 варианта: когда она принадлежит или не принадлежит первой из этих фигур. В каждом из этих вариантов также делаем прямой вывод, проверку на связность и ветвление, пока не придем к противоречию или не разделим все клетки по фигурам.
Алгоритм не зависит от вида клеток и движений - хоть в 4-мерном пространстве или на поверхности сферы, когда клетки - грани многогранника, или если клетки нескольких видов.
Отдельно рассматривается случай деления на 2 части зеркально симметричной исходной фигуры на связные по стороне части. Здесь возможен только случай деления на части остью или в 3D плоскостью симметрии, что легко доказать.
К тонкостям также относится то, что из движения исключается перевод клетки саму в себя и перевод в первую клетку поля. И разные движения не могут переводить одну клетку в одну и ту же другую клетку.
Усовершенствование метода забраковки K отобранных движений заключается в следующем алгоритме. Определяем граф, вершины которого - клетки поля, а ребрами соединены клетки, которые одновременно не могут принадлежать первой фигуре. Это произойдет, если эти клетки переводятся какими-то двумя из выбранных движений в одну и ту же клетку. Вариант отбраковывается, если нельзя выбрать множество из Sz несвязанных ребрами вершин. Сначала отбираем все вершины, которые связаны с 0 или 1 оставшейся вершиной, это не ухудшит результат. Вершины, связанные с отобранными вершинами исключаем из рассматриваемого множества. Затем оставшиеся вершины сортируем по убыванию числа оставшихся в них ребер. Делаем оценку сверху числа несвязанных вершин в наилучшем подмножестве, для случая, если бы ребра при таких числах смежности были бы распределены наилучшим образом. Для этого каждый раз выбираем оставшуюся вершину с наибольшей смежностью и распределяем ее ребра по другим вершинам в порядке их наибольшей смежности. После этого подправляем сортировку оставшегося множества. Будем таким образом выбирать вершины и удалять ребра, пока не останется множество вершин, не связанных ребрами. Это и будет оценка сверху. Если она нарушает наше условие, то вариант забраковывается.
Заметим, что этот алгоритм может быть использован при поиске максимальной клики в любом графе. Я его придумал и применил в январе этого года при решении задачи 1 Заочного Чемпионата России по головоломкам. Не знаю, известен ли он.

Принцип анализа движений может быть использован в алгоритме деления произвольного многоугольника на части ломанными линиями - не обязательно по клеточкам.
« Последнее редактирование: 09 августа 2024, 20:56:49 от kosshams »

Оффлайн kosshams

  • Новичок
  • *
  • Сообщений: 44
  • Пол: Мужской
Эта возможность в моей программе обсуждается на Фейсбуке:
https://www.facebook.com/groups/mathpuz/posts/2724504594392032

Оффлайн kosshams

  • Новичок
  • *
  • Сообщений: 44
  • Пол: Мужской
Re: Программы для решения головоломок, Filler3d
« Ответ #33 : 20 августа 2024, 19:23:41 »
Усовершенствовал возможность разрезания на N равных частей в программе:
http://kosshams.ru/Programs/Filler3D/Filler3D.zip  или только экзешник: http://kosshams.ru/Programs/Filler3D/Filler3d.exe - версия 1.2.4
1. Ускорен алгоритм.
2. Добавлена возможность отметить флажок "Другой метод перебора". При этом при переборе варианты движений не будут проверяться в порядке от плохого к хорошему, что приведет к увеличению времени, но можно будет лучше сориентироваться в ожидаемом времени выполнения и решения будут выдаваться не в самом конце перебора.
3. Добавлена возможность отметить флажок "Часть вариантов", что позволяет подсчитать одну задачу в нескольких процессах, каждому указав его диапазон вариантов на верхнем слое перебора.
4. Для разрезания теперь доступно "Состояние перебора по слоям" во время просчета.
« Последнее редактирование: 02 сентября 2024, 09:04:49 от kosshams »

Оффлайн kosshams

  • Новичок
  • *
  • Сообщений: 44
  • Пол: Мужской
Re: Программы для решения головоломок, Filler3d
« Ответ #34 : 02 сентября 2024, 09:17:17 »
Исправлена ошибка в покрывашках, когда нельзя поворачивать или переворачивать:
http://kosshams.ru/Programs/Filler3D/Filler3D.zip  или только экзешник: http://kosshams.ru/Programs/Filler3D/Filler3d.exe - версия 1.2.5

Оффлайн kosshams

  • Новичок
  • *
  • Сообщений: 44
  • Пол: Мужской
Re: Программы для решения головоломок, Filler3d
« Ответ #35 : 10 ноября 2024, 23:07:29 »
Исправлена ошибка в разрезании на равные части для шестиугольной клетки - версия 1.2.6, по тем же ссылкам.