Вот пример того, как вы могли бы смоделировать его с помощью GA.
Используя вашу запись:
- N (номер экзаменуемого)
- T (номер экзамена)
Пусть ген человека выражает полный график бронирований.
то есть индивидуум представляет собой список конкретных заказов: (i, j, t, d)
- я экзаменатор [1, N]
- j - j-й экзаменатор [1,?]
- t - это тест, который должен сдать экзаменующийся [1, T]
- d - начало экзамена (дата + время)
Оцените, используя фитнес-функцию, которая имеет свойство:
- оштрафовать (строго) за всех экзаменаторов с двойной регистрацией
- штраф за простоя экзаменаторов
- штраф за экзаменующихся, которые не были распределены в течение их периода времени
- вознаграждение за каждый сданный экзамен за период
эта функция будет иметь всю логику для определения двойных бронирований и т. Д. У вас есть полное предлагаемое расписание для индивидуума, теперь вы запускаете логику, зная время для каждого теста при каждом бронировании, чтобы определить пригодность, и вы увеличиваете / уменьшаете оценка бронирования соответственно.
, чтобы сделать это хорошо, рассмотрим:
- initiation - используйте столько информации, сколько вам нужно, чтобы делать «нормальные» заказы, если это вычислительно дешево.
- определить правильные операторы GA
Инициирование в здравом смысле:
- случайный выбор d в течение периода времени
- случайно переставить (1,2, .., N), а затем выбрать i из этого (избегает дубликатов), то же самое для j и t
правильные операторы GA:
скажем, у вас есть заказ a и b :
(A_i, a_j, a_t, A_D)
(B_i, b_j, b_t, b_d)
вы можете поменять местами a_i и b_i и поменять местами a_j, b_j, a_d и b_d, но, скорее всего, нет смысла менять местами a_t и b_t.
Вы также можете использовать циклирование, что лучше всего иллюстрировать на примере, если N * T = 4, полное резервирование составляет 4 кортежа, и тогда вы будете циклически перемещаться по i или j или d, например циклически по i:
a_i = b_i
b_i = c_i
c_i = d_i
d_i = a_i