Оптимизируйте назначение мест на мероприятии с помощью ограничений Corona

Проблема: учитывая набор групповых регистраций, каждая для разного количества человек (1-7), и набор групп рассадки (неизменяемый, не менее 2 м друг от друга), варьирующийся от 1 до 4 мест, Я хочу найти оптимальное распределение групп людей по группам рассадки:

  • Группы людей могут быть разделены на несколько групп рассадки (но желательно этого не делать).
  • Группы рассадки не могут быть разделены между разными группами людей.
  • (необязательно) назначение должно минимизировать количество «потраченных впустую» мест, т.е. максимизировать количество мест в пустых группах рассадки
  • (в идеале он должен запускаться из сценария Google Apps, поэтому объем памяти и вычислительная сложность должны быть как можно меньше)

Первая попытка: меня интересует проблема решения (возможно ли это?), а также проблема оптимизации (см. дополнительную функцию оптимизации). Я смоделировал это как проблему SAT, но это не нашел оптимального решения.

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

  • позиции: группы рассадки (размер - ›вес)
  • рюкзаки: группы людей (размер - ›размер контейнера)
  • ограничение: общий вес товара ›= размер контейнера
  • оптимизация: минимизировать количество элементов

Как видите, ограничение и оптимизация перевернуты по сравнению со стандартной задачей. Итак, мой вопрос: на правильном ли я здесь пути или вы бы пошли по другому пути? Если это правильно, то есть ли у этой проблемы оптимизации название?


person Josta    schedule 12.10.2020    source источник
comment
Связанный: stackoverflow.com/q/8025931/572670   -  person amit    schedule 12.10.2020
comment
Поскольку вы уже поработали над моделированием вашей проблемы как задачи SAT, вы можете использовать Weighted MaxSAT для решения ваших задач оптимизации.   -  person tphilipp    schedule 13.10.2020
comment
@tphilipp хорошее предложение, я изучу его. Я думаю, что мое решение SAT может быть не лучшим из возможных, поскольку для него требуется довольно много предложений: о предложениях sp² и переменных sp, где p - количество людей, s - количество мест. Для сравнения, приведенное ниже решение ILP Рубена не моделирует отдельных людей или места, уменьшая размер проблемы примерно в 20 раз, а тем более количество ограничений (#groups * #tables). Мне интересно, будет ли Weighted MaxSAT с этим решением SAT или любым решателем ILP для решения, предложенного Рубеном, вероятно, будет эффективно использовать больше памяти и времени.   -  person Josta    schedule 13.10.2020
comment
@Josta Есть много способов улучшить кодировку SAT. Иногда даже нет необходимости улучшать его, несмотря на квадратичное раздутие предложений или переменных. В зависимости от варианта использования SAT / MaxSAT может значительно превзойти ILP или решить те случаи, когда решатели ILP не могут решить вообще. Верно и другое направление.   -  person tphilipp    schedule 14.10.2020


Ответы (1)


Вы можете подойти к этому как к задаче целочисленного линейного программирования, определяемой следующим образом:

let P = the set of people groups, people group i consists of p_i people;
let T = the set of tables, table j has t_j places;
let x_ij be 1 if people from people group i are placed at table j, 0 otherwise
let M be a large penalty factor for empty seats
let N be a large penalty factor for splitting groups

     // # of free spaces = # unavailable - # occupied
     // every time a group uses more than one table,
     // a penalty of N * (#tables - 1) is incurred
min  M * [SUM_j(SUM_i[x_ij] * t_j) - SUM_i(p_i)] + N * SUM_i[(SUM_j(x_ij) - 1)]

     // at most one group per table
s.t. SUM_i(x_ij) <= 1 for all j

     // every group has enough seats
     SUM_j(x_ij * t_j) = p_i for all i

     0 <= x_ij <= 1

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


ILP являются NP-сложными, поэтому без правильных решателей это может быть невозможно выполнить с помощью Google Apps. У меня нет опыта в этом, поэтому, боюсь, я не могу вам помочь. Но есть несколько способов уменьшить пространство поиска.

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

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

person Ruben Helsloot    schedule 12.10.2020
comment
Мне нравится краткость и расширяемость этого решения, но я разделяю ваши опасения по поводу того, что решатель ILP может не работать в Google Apps даже для задач небольшого размера (однако у меня нет опыта работы с LP). Если я правильно понимаю, M * [SUM_j(t_j) - SUM_i(p_i)] - инвариант. Вы, может быть, хотели написать что-то вроде M * [SUM_j[(1 - MULT_i(1 - x_ij)) * t_j] - SUM_i(p_i)]? Я также предполагаю, что это должно быть SUM_j в предпоследней строке псевдокода. - person Josta; 13.10.2020
comment
Вы были правы насчет SUM_j. M * [SUM_j(t_j) - SUM_i(p_i)] действительно инвариант, но я изменил SUM_j(t_j) на SUM_j(SUM_i[x_ij] * t_j), чтобы не засчитывать свободные столы. Из-за другого ограничения SUM_i[x_ij] равно 0 или 1 для каждой таблицы. - person Ruben Helsloot; 13.10.2020