Я пишу генератор таблицы времени в java, используя подходы AI, чтобы удовлетворить жесткие ограничения и помочь найти оптимальное решение. До сих пор я реализовал и итеративную конструкцию (наиболее ограниченную первую эвристику) и Simulated Annealing, и я нахожусь в процессе реализации генетического алгоритма.Функция кроссовера для генетических
Некоторой информация о проблеме, и как я представляю его тогда: У меня есть набор событий, комнаты, особенности (что события требуют и номер удовлетворяет), студенты и слоты Проблемы заключаются в присвоении каждого событиечрезвычайном слот и комнату, так что ни один студент не должен присутствовать на двух мероприятиях в одном слоте, все назначенные номера отвечают необходимым требованиям.
У меня есть функция оценки, которая для каждого набора, если присвоения оценивает нарушения мягкого ограничения, таким образом, точка должна минимизировать это.
Как я реализую GA, я начинаю с совокупности, сгенерированной итеративной конструкцией (которая может оставить события неназначенными), а затем выполните обычные шаги: оценивайте, выбирайте, перекрещивайте, мутируйте и сохраняйте лучшее. Промыть и повторить.
Моя проблема заключается в том, что мое решение, похоже, слишком мало улучшается. Независимо от того, что я делаю, популяции склонны к случайной физической форме и застряли там. Обратите внимание, что эта пригодность всегда отличается, но тем не менее появляется нижний предел.
Я подозреваю, что проблема в моей функции кроссовера, а вот логика позади него:
Два задания выбираются случайным образом пересекаться. Позволяет называть их назначениями A и B. Для всех событий B выполните следующую процедуру (случайные события заказа B выбраны случайными):
Получите соответствующее событие в A и сравните задание. Возможны 3 разных ситуации.
- Если только один из них не назначается, и если можно повторить другое назначение на ребенке, выбирает это назначение.
- Если они оба назначены, но только один из них не создает конфликтов
при назначении ребенку этого выбранного. - Если они оба назначены, и ни один из них не создает конфликт, то из их выбирают случайным образом.
В любом другом случае событие остается неназначенным.
Это создает ребенка с некоторыми из назначений родителя, некоторые из матери, поэтому мне кажется, что это действительная функция. Более того, он не нарушает никаких жестких ограничений.
Что касается мутации, я использую соседнюю функцию моего SA, чтобы дать мне другое задание на основе дочерних элементов, а затем заменить этого ребенка.
Так что снова. С этой установкой, начальная популяция 100, GA работает и всегда стремится стабилизироваться при некотором случайном (высоком) значении пригодности. Может ли кто-нибудь дать мне указатель относительно того, что я могу сделать неправильно?
Благодаря
Edit: форматирование и очистить некоторые вещи
Hi. Я полагаю, что это может быть не самое лучшее, но это можно сделать, как показано в нескольких статьях http://secretgeek.net/content/bambrilg.pdf, http://www.cs.nott.ac.uk/ TR/1995/1995-8.pdf и т. Д., Поэтому мне бы очень хотелось, чтобы моя реализация работала ... Как сейчас, она должна сходиться к лучшему решению с помощью этой функции кроссовера, но ясно, t, поэтому я делаю некоторую ошибку =/ – JMarques