Игнорирование запроса T-SQL на данный момент, поскольку вряд ли это будет лучший язык для написания этого на ...
Один из моих любимых подходов к таким сложным задачам, как эта: Имитация отжига . Это хороший подход, потому что вам не нужно думать, КАК решить реальную проблему: все, что вы определяете, это мера того, насколько хорош текущий макет (оценка, если хотите), а затем вы допускаете случайные изменения, которые увеличиваются или уменьшаются. этот счет. На протяжении многих итераций вы постепенно уменьшаете вероятность перехода к худшему результату. Такой подход «имитация отжига» снижает вероятность застрять в локальном минимуме.
Таким образом, в вашем случае функция оценки для данного макета может основываться на расстоянии до следующего объявления в той же категории и на расстоянии до другого объявления из той же серии. Если позже у вас есть соображения о времени суток, вы можете легко добавить их в функцию оценки.
Первоначально вы размещаете рекламу последовательно, равномерно или случайно в пределах их временного окна (не имеет значения, какое именно). Теперь вы выбираете два слота и учитываете, что происходит с партитурой, когда вы переключаете содержимое этих двух слотов. Если какое-либо объявление выходит за пределы допустимого диапазона, вы можете немедленно отклонить это изменение. Если оба по-прежнему находятся в пределах досягаемости, улучшит ли это общий результат? Первоначально вы принимаете изменения случайным образом, даже если они ухудшают ситуацию, но со временем вы уменьшаете вероятность этого, так что к концу вы монотонно движетесь к лучшему результату.
Легко реализовать, легко добавлять новые «правила», влияющие на оценку, можно легко настроить время выполнения, чтобы принять «достаточно хороший» ответ, ...
Другим подходом было бы использование генетического алгоритма, см. Этот похожий вопрос: Алгоритм планирования наилучшего соответствия это, вероятно, сложнее для программирования, но, вероятно, будет быстрее сходиться при хорошем ответе.