Задать вопрос
Popou
@Popou
Программист энтузиаст , обожаю саморефлексию

Генетический Алгоритм, Как правильно написать фитнес функцию?

Я не прошу дать мне код, я прошу направить меня.

Я хотел написать ГА для составление расписание уроков вуза, но я постоянно натыкаюсь на ложный минимум, повышение частоты мутации не помогает, все остальное работает(использую 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 конечно же) так же теперь это штрафы, если они равны нулям то это хорошо. А так же в конце не берет среднее арифметическое, а просто их сумму. И снова я попадаю в ложный минимум!
  • Вопрос задан
  • 192 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 2
LaRN
@LaRN
Senior Developer
У вас все параметры описаны так, что приидиальном варианте значение каждого из них будет равно 1.
Например:
Конфликтные пары для учителей = [0..1] (КоличествоПарКоторыеОниПреподают - КоличествоКонфликтныхПар )/КоличествоПарКоторыеОниПреподают

КоличествоКонфликтныхПар = 0, значение параметра =1.

В итоге вам нужно исками максимум а не минимум от вашей функции.
Может переделать описание параметров наоборот, чтобы целевое значение стремились к 0?
Например:
Конфликтные пары для учителей = [0..1] КоличествоКонфликтныхПар/КоличествоПарКоторыеОниПреподают
Ответ написан
Комментировать
Popou
@Popou Автор вопроса
Программист энтузиаст , обожаю саморефлексию
Я дико извиняюсь все это оказывается работало, просто я был тупой и не заметил .... что в параметры Лишние уроки входили и окна тоже, из за чего мой ГА приходил максимально возможному решению. Так же я использовал "функцию активации", знаю неверный термин но все же

private const int _eps = 1000;

private static double Activation(double value)
{
    return Math.Floor(value*_eps)/_eps;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы