Быстрый алгоритм определения запросов таймшера

Я пишу программу, которая будет имитировать, как члены определенного таймшера будут запрашивать свои квартиры. Квартиры доступны только для определенных «событий» в течение года, и каждое событие имеет разную продолжительность (учитывается в днях). Для каждого мероприятия доступно несколько квартир, которые разделены на группы по стоимости (баллы в сутки).

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

Теперь я хочу, чтобы участник запрашивал квартиры в соответствии с этой стратегией:

  • Первоочередной задачей является максимальное количество дней проведения мероприятий.
  • Максимальное количество потраченных баллов является вторым приоритетом (поэтому пользователь запрашивает наилучшую возможную квартиру, которую он/она может себе позволить, и при этом иметь как можно больше дней).
  • Общая стоимость запрошенных квартир не может превышать общее количество доступных баллов для данного пользователя.
  • Очевидно, что если для определенного события больше нет квартир данного типа, пользователь не должен запрашивать эту конкретную комбинацию квартира/событие.

Мне интересно, похожа ли проблема на проблему, описанную здесь:

http://en.wikipedia.org/wiki/Hungarian_algorithm

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

Однако разница в том, что для моей проблемы мне разрешено использовать одну и ту же квартиру для нескольких мероприятий — она не «потрачена» после того, как она была использована для одного мероприятия. Кроме того, стоимость входа на самом деле не является одномерной, поскольку с каждой комбинацией мероприятия/апартаментов связано как количество дней, и количество баллов, оба из которых должны быть максимальными (но с приоритет отдается количеству дней).

Например, допустим, есть три типа квартир стоимостью 75, 100 и 125 баллов в сутки и три события продолжительностью 2, 10 и 4 дня. Предположим далее, что многие квартиры заняты, поэтому матрица доступности выглядит так:

                  cost
             75    100   125
       2    True False True
 days  10   False False True
       4    True False True

Допустим также, что пользователю доступно 1250 баллов. Решение в этом случае будет заключаться в том, что пользователь запрашивает 10-дневное событие с квартирой на 125 баллов и ничего больше.

Грубый способ сделать это, возможно, будет рекурсивным алгоритмом:

  • Пусть n будет количеством событий, которые вы сейчас пытаетесь
  • Найдите все комбинации событий и квартир и рассчитайте комбинацию, которая максимизирует количество дней, а затем количество потраченных баллов (это будет включать все перестановки n событий, а также количество способов, которыми 3 типа квартир могут быть назначены n События).
  • Пусть n=n-1

Я думаю, что это быстро станет непосильным, когда количество событий возрастет, поэтому мне интересно, существуют ли какие-либо алгоритмы, которые могут решить эту проблему менее затратным способом?


person Yourik    schedule 05.11.2014    source источник


Ответы (1)


Если у вас есть доступ к библиотеке для http://en.wikipedia.org/wiki/Integer_programming вы могли бы попробовать бросить это на него.

Даже если у вас есть только один вариант стоимости для каждого мероприятия, так что вы просто пытаетесь выбрать комбинации мероприятий, которые охватывают как можно больше дней, не выходя за рамки бюджета, я думаю, что это сводится к http://en.wikipedia.org/wiki/Knapsack_problem. Это означает, что он вряд ли будет точно решен алгоритмом с полиномиальным временем для наихудшего случая, таким как венгерский алгоритм.

person mcdowella    schedule 05.11.2014
comment
Да, проблема рюкзака более тесно связана с моей проблемой, чем то, что я предложил вначале. Единственная разница в том, что я также хочу максимизировать вес, оставаясь при этом ниже предела веса. Я посмотрю, смогу ли я изменить алгоритм. В качестве альтернативы, как только будет найдено решение для оптимизации количества дней, мне будет проще перебрать квартиры, доступные для выбранных событий (поскольку их не следует менять после того, как будет найдено оптимальное количество дней). - person Yourik; 06.11.2014