2013-02-14 4 views
-1

Существует общий алгоритм, я могу использовать, чтобы решить следующие задачи:Распределение временных интервалов Алгоритм

Дано:

фона: Месяц, который содержит от 0 до 1000 событий (любое число на самом деле). Каждое событие имеет дату начала и окончания. События проводятся в комнатах по одному (без совпадений, однако последующие события позволяют делиться концами и датировать даты друг с другом). Количество номеров не ограничено.

Задача: выделить комнаты для таких мероприятий, чтобы количество комнат, необходимых для проведения ежемесячных мероприятий, было сведено к минимуму.

Хотя полное решение высоко ценится, я ищу любые направления, умные идеи.


class Event: 
- int Id; 
- DateTime StartDate; 
- DateTime EndDate 

class Allocation: 
- int EventId 
- int RoomId 

так я ищу:

// roomIds is Enumerable.Range(1, int.MaxValue) 
IEnumerable<Allocation> GetAllocations(IEnumerable<Event> events, IEnumerable<int> roomIds, int year, int month) 
{ 
    ... 
} 
+2

Это домашнее задание? Что вы пробовали? – MoonKnight

+0

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

+0

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

ответ

4

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

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

Пример:

Событие: 9 утра до 5 вечера, 9 утра-2 вечера, 5 PM-6PM, 3 PM-6PM

Сортировано таблицы:

моментов времени

(9 утра начала event1), (9AM старт event2), (2 вечера событие окончания 2), (3 вечера начинают event4), (5 вечера конец event1), (5 вечера начать event3), (6 вечера конец event3), (6 вечера конец event4)

Обработка:

(9AM start event1) - assign room 1 to event1 
(9AM start event2) - assign room 2 to event2 
(2PM end event2) - free room 2 
(3PM start event4) - assign room 2 to event4 
(5PM end event1) - free room 1 
(5PM start event3) - assign room 1 to event3 
(6PM end event3) - free room 1 
(6PM end event4) - free room 2 
+0

Некоторые события будут иметь пробелы только потому, что помещение не было принято ни одним событием. Как идет подсчет того, подходит ли следующее найденное событие в течение месяца? – user1514042

+0

@ user1514042 Свободные комнаты создают пробелы в мероприятиях? Я не понимаю. После того как вы выделите комнаты, вы можете группировать события по месяцам, если это необходимо (если я не понял, что вы написали.) –

+0

они действительно. – user1514042

0

Это почти дословно из класса Алгоритмы, которые я использовал во время моего обучения. Наилучшим является жадный алгоритм, выделяющий комнаты на основе раннего времени начала и кратчайшей продолжительности. Доказательство этой оптимальности оставлено в качестве упражнения, чтобы профессор не заваливал читателя. :)

Смежные вопросы