Подтвердить что ты не робот

Помощь по алгоритму размещения комнат на ограниченном пространстве

Я работаю над проектом дизайна небольшого дома, и одна из его наиболее важных частей - это раздел, где пользователь может дать некоторую информацию о том, как он хочет свои комнаты (например, дом размером 10 х 10 метров, имеющий 3x3 гостиная, 3x3 кухня, две 4 x 5 спален и ванная 4x2), а затем программа создает карту дома в соответствии с выполненными заказами.

В настоящее время я не беспокоюсь о том, чтобы рисовать карту, просто устраивая комнаты таким образом, чтобы они не перекрывались (да, выход может быть довольно уродливым). Я уже сделал некоторые поиски и обнаружил, что то, что я хочу, очень похоже на проблему упаковки , в которой есть некоторые , которые справляются с этой проблемой довольно хорошо (хотя это проблема NP-complete).

Но тогда у меня было еще одно ограничение: пользователь может указать "ссылки" между комнатами, например, он может пожелать, чтобы в комнате должна быть "дверь" в ванную комнату, в гостиную - прямо на кухню, и т.д. (т.е. комнаты должны быть размещены бок о бок), и здесь все усложняется.

Я уверен, что то, что я хочу, настраивает NP-проблему, поэтому я прошу советов по созданию хорошей, но не обязательно оптимальной реализации. Идея, которую я имею, - использовать графики для представления отношений между комнатами, но я не могу понять, как я могу адаптировать существующие алгоритмы упаковки, чтобы соответствовать этому новому ограничению. Кто-нибудь может мне помочь?

4b9b3361

Ответ 1

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

Ответ 2

Вы можете найти этот интересный. Это грамматика для строительства вилл Палладио.

Чтобы применить что-то подобное к вашей проблеме, у меня был бы способ построить его наугад, а затем иметь возможность делать с ним произвольные изменения и использовать алгоритм имитированного отжига.