Я не уверен, что полностью понимаю вашу проблему, но, похоже, у вас есть разумное расписание для начала, и вам просто нужно его улучшить.
Если так, то генетические алгоритмы будут работать очень хорошо, но я думаю, что представлять все как двоичные «хромосомы», как в ссылке, может быть нецелесообразно.Существует много других способов представления расписания, например, в двумерном массиве или присвоения событию номера слота.Вы можете посмотреть на алгоритмы, такие как поиск по Табу, имитация отжига и Великий Потоп и восхождение на горуВсе они основаны на схожих идеях, но некоторые работают лучше с некоторыми проблемами, чем другие.Например, если у вас очень грубое пространство поиска, имитация отжига не будет лучшей, и Hill Climbing обычно находит только локальный оптимум.
Общая архитектура алгоритмов, упомянутых выше, и многих других генетических алгоритмов и метаэвристики: выберите соседнее решение, используя оператор перемещения (например, поменяйте местами одно или два или три события или поменяйте местами помещения двух событий и т. д.), убедитесь, что движение не нарушает каких-либо жестких ограничений, используйте такую стратегию принятия, каккак, имитированный отжиг или Великий Потоп, чтобы определить, принято ли движение.Если это так, оставьте решение и повторяйте шаги до тех пор, пока не будет достигнут критерий завершения.Это может быть максимальное время, число выполненных итераций или улучшение не было найдено за x итераций.Пока это работает, ведите журнал «лучшего» решения, поэтому, когда алгоритм будет остановлен, у вас будет найдено лучшее решение.Вы можете определить, что считается «лучшим», исходя из того, сколько мягких ограничений нарушает расписание
Надеюсь, это поможет!