Я не прошу дать мне код, я прошу направить меня.
Я хотел написать ГА для составление расписание уроков вуза, но я постоянно натыкаюсь на ложный минимум, повышение частоты мутации не помогает, все остальное работает(использую Accord.Genetic), значит дело в моем понимание фитнес функции. Условия там не сложные: учителя выбирают себе час в котором они не могут работать по тем или иным причинам, некоторые группы не учатся в определённые пары (например моя группа не учиться в 5, 6, 7,8 паре, а друга в точности да наоборот), и последнее условие - у группы есть набор обязательных дисциплин за неделю, типо 3 математики, 3 немецкого. разумеется не должно быть конфликтов.
Я использовал два варианта ,но оба введут в ложный минимум
1) фитнес функция имеет диапазон значений от 0 до 1, критерии которые оцениваются и их диапозон, 48 это количество возможных пар( 6 дней * на 8):
- Лишние уроки=[0..1] (48-КоличествоЛишних)/48
- Недостаток уроков= [0..1] (СуммаНужныхУроков-СуммаНедостающихУроков)/СуммаНужныхУроков
- Неудобное время для группы=[0..1] (48-КоличествоПарВНеудобноеВремя)/48
- Неудобное время для учителей = [0..1] (КоличествоПарКоторыеОниПреподают - КоличествоПарВНеудобноеВремя )/КоличествоПарКоторыеОниПреподают
- Конфликтные пары для учителей = [0..1] (КоличествоПарКоторыеОниПреподают - КоличествоКонфликтныхПар )/КоличествоПарКоторыеОниПреподают
Затем берётся среднее арифметическое и вот результат фитнес функции. Что бы вы понимали я пробовал даже округлять, 0.1865456 до 0.1 что бы алгоритм не так сильно "боялся" делать ошибки, я даже делал так что бы единственными возможными значениями были [0, 0.5, 1] и это не помогло............
Второй вариант использует все те же критерии оценки, но теперь диапазон не ограничен(в рамках double конечно же) так же теперь это штрафы, если они равны нулям то это хорошо. А так же в конце не берет среднее арифметическое, а просто их сумму. И снова я попадаю в ложный минимум!