понедельник, 15 марта 2010 г.

Одна моя странная идея

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

Если такого нету, а мне такое хочется попробовать накарябать чисто с точки зрения программирования (т.е. написать какую-то реализацию такого планировщика), но что-то не понятно, как.
Вообще не понятно как можно расставлять задачи на бесконечной прямой времени, как их при этом хранить и как при этом отличать занятое время от незанятого. Пока только родилась идея планирования на n дней вперед (тем более что больше смысла не имеет), путем записи отсортированного по времени начала ассоциативного массива с элементами типа "диапазон времени", с циклической проверкой всего массива на пересечения при попытки вставить новое событие (вот не медленно ли это, хз). При этом стоит заметить что повторений и цикличности в полной мере в этом случае никогда не будет, ибо каждый день, неделя и т.д. в реальности всегда уникален и наполнен своими событиями.
Итак, пока мысль такая: создаются объекты типа Task, засунутые в контейнер. Задачи хранят время, выделенное на задачу, некоторые атрибуты типа "обязательная" и "имеет жесткое расписание" или "должна выполняться перед ..." или "после ...". Мы проходим по всем задачам в контейнере и добавляем в план задачи с расписанием в первую очередь. Затем мы повторяем это с задачами, у которых есть зависимости от задач с расписаниями, и снова их добавляем. На этом, вроде-бы со всеми жестко привязанными вариантами мы должны были разобраться (а если не получилось сделать это так чтобы ничего не пересеклось, сделаем себе хедшот в виде эксепшена). Далее начинается самое сложное и интересное, ибо тут мы будем как раз пытаться сделать работу за человека :).
Есть пара вариантов, как можно работать с множеством задач без расписания, у которых есть разные приоритеты.
1. Это просто сортировать задачи по приоритетам и забивать ими все свободное время. Но это скучно и неинтересно для моего мозга, поэтому я бы такое расписание даже не стал юзать.
2. Сделать нечто похожее на работу планировщика задач CPU. Разбить задачи на кванты определенной длины (т.е., скажем, по 30 минут), а затем, как и OS, закидывать их с учетом приоритета на все свободные промежутки времени. Реализацию этого точно можно где-то подсмотреть. :)

Вот собственно и вся идея решения такой проблемы, но до конкретной реализации пока не додумал.

1 комментарий:

  1. Идея не нова,
    но реализация её должна быть не линейной, а дифференцированной, imho.

    Пример: известно, что человек работает с ПН по ПТ, значит приоритет у задачи "вечеринка/пьянка" выше в ПТ и СБ.

    где-то такую подобную задачу я встречал на олимпиаде

    ОтветитьУдалить