Проблемы с оператором пересечения перестановок (генетический алгоритм), когда нет сопоставления 1 к 1

Это не домашнее задание, чисто для моего побочного проекта.

Я реализую оператор кроссовера перестановки для генетического алгоритма (решение коммивояжера, где каждое число представляет индекс города), и у меня возникла проблема с граничным случаем, когда нет сопоставления 1 к 1.

Рассмотрим два генома ниже и предположим, что последние две записи поменяны местами. Таким образом, 5 отображается в 6, а 6 отображается в 7. Итак, что происходит, когда я нажимаю номер 6 - следует ли мне изменить его на 5 или 7, и это может привести к недействительному туру, когда город посещают дважды.

//initial case
GenomeA: [ 2, 3, 1, 4, 0, 7, 5, 6 ]
GenomeB: [ 1, 2, 0, 3, 4, 5, 6, 7 ]

5 <--> 6
6 <--> 7

//after mapping
GenomeA: [ 2, 3, 1, 4, 0, 6, 6, 7 ]
GenomeB: [ 1, 2, 0, 3, 4, 6, 5, 6 ]

Следует ли мне случайным образом выбрать другой номер, если номер уже сопоставлен? Или мне не следует переключать какие-либо номера, которые уже были сопоставлены?

Например,

a) Evaluate first set of numbers (5 <--> 6) 
b) Since 5 has not been mapped, map 5 to 6 and vice versa
c) Evaluate second set of numbers (6 <--> 7)
d) Since 6 is already mapped to 7, ignore this set of numbers

person Dan Tang    schedule 21.09.2014    source источник
comment
Если вы решаете проблемы, основанные на перестановках, я предлагаю вам взглянуть на Случайные ключи. Это действительно умный способ представления перестановок, позволяющий использовать простые операторы кроссовера и мутации.   -  person zegkljan    schedule 23.09.2014


Ответы (1)


Я нашел простой способ произвести законное потомство в случае множественных отображений (5 ‹--> 6 ‹--> 7).

a) First check if any number outside the substring exchanged ("originalNumber" is contained within the mapping
b) Let the mapped value of "originaNumber" be called "replacement"
c) Check if "replacement" is also contained within the mapping (if it is, this implies that there will be a clash if we set "originalNumber" to "replacement") If it isn't, simply set "originalNumber" to "replacement"
d) Otherwise, find the mapped value of "replacement" and set "originalNumber" to it.
person Dan Tang    schedule 21.09.2014