Я думаю, это зависит от того, как вы определяете «лучшее». Например, если вы хотите, чтобы задачи выполнялись каждые 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), где, по-видимому, не существует стационарного решения, определение «наилучший» также должно определять вашу фитнес-функцию.