Планирование работника с перекрывающимися периодическими задачами - PullRequest
3 голосов
/ 18 октября 2008

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

Учитывая список задач,
- определяется как «n секунд, каждые m секунд» (например, 5 секунд каждые 3600 секунд)

Как найти лучшее время запуска и рассчитать для каждого задания?

Если бы каждая задача была "1 секунда каждые 60 секунд", у каждой была бы уникальная начальная секунда, и счет был бы бесконечным (устойчивое состояние).
Если бы это были «1 секунда каждые 4 секунды» и «1 секунда каждые 3 секунды», результатом будет: «0, бесконечно и 3, 3 раза»

- Надеюсь, самая простая форма

Если у меня уже есть список задач, составленный из «start second and number of times», как будет выглядеть функция, которая возвращает: {start, count} для дополнительной задачи {n секунд каждые m секунд}?

- (Чуть более сложная форма -
если вместо «n секунд каждые m секунд»,
задачи были определены как «n секунд каждые 1 ... секунд»,
где я мог бы выбрать число m в диапазоне l - o (но должен был бы выполнить это m, пока задача не будет завершена),
это позволит лучше использовать работника?
Как бы я выбрал лучшее «м»?

Ответы [ 4 ]

1 голос
/ 21 ноября 2008

Я думаю, это зависит от того, как вы определяете «лучшее». Например, если вы хотите, чтобы задачи выполнялись каждые m секунд «в среднем», есть простой способ сделать это, используя тот же алгоритм, что и в методе Брезенхэма, для рисования линий (задача «n секунд каждые m секунд» - это много как разбрасывание n вертикальных шагов на m горизонтальных шагов при рисовании линии). Присвойте каждой задаче счетчик и значение шага (для «1 секунды каждые 3 секунды» шаг будет 1/3). Затем добавляйте шаг к счетчику каждый цикл. Когда счетчик становится выше нуля, эта задача должна выполняться (и вычесть 1 из счетчика). Если у вас несколько счетчиков выше нуля, выберите самый большой. Это может дать вам решение, «достаточно хорошее» для немного более сложной формы.

Пример «1/4» и «1/3» звучит так, будто у вас есть требование запускать задачи «ровно» с интервалом в несколько секунд. Начиная со списка и добавляя новую задачу, чтобы максимизировать количество, это не сложная проблема поиска - но я не думаю, что это то, что вам нужно. Пример A (1/4) B (1/4) C (1/2) даст A B x x A B x x после добавления A, затем B. Тогда C не может быть добавлен,

Я думаю, что есть очевидные кандидаты на функции пригодности - таблица n, m, start может иметь функцию пригодности, которая является частью времени, когда запланировано не более одной задачи. GA / отжиг имели бы хорошие шансы найти устойчивое решение, если оно существует. Но в таких случаях, как (1/4), (1/3), где, по-видимому, не существует стационарного решения, определение «наилучший» также должно определять вашу фитнес-функцию.

0 голосов
/ 28 ноября 2008

См. w: планирование (вычисление) . Ссылка включает в себя хороший список стратегий планирования:

[Планирование] относится к способу процессам назначаются приоритеты в очередь с приоритетами. Это назначение осуществляется с помощью программного обеспечения, известного как планировщик. Планировщик обеспокоен в основном с:

  • загрузка ЦП - сохранить ЦП как занят как можно.
  • Пропускная способность - номер процесса, который завершен их выполнение за единицу времени.
  • Оборот - количество времени до выполнить определенный процесс.
  • Время ожидания - количество времени Процесс ожидал в Готовая очередь.
  • Время ответа - сумма времени, которое требуется с момента запроса был представлен до первого ответ получен.
0 голосов
/ 18 октября 2008

Хм, вот небольшое предложение: если наибольший общий делитель m больше или равен сумме n, решение является устойчивым состоянием.

Я бы пошел для набора задач, который имеет максимальную сумму n, так что gcd m больше или равен этой сумме.

0 голосов
/ 18 октября 2008

Этот тип проблемы трудно решить, но относительно легко оптимизировать. Взгляните на Имитационный отжиг, Великий Потоп или Генетические алгоритмы.

...