Операция кроссовера в генетическом алгоритме для TSP
Я пытаюсь решить проблема коммивояжера (TSP) С генетический алгоритм
мой геном-это перестановка вершины в графе (путь для продавца).
Как я должен выполнить операцию кроссовера над моими геномами?
где я могу найти реализации моей проблемы в C#?
7 ответов
вы должны проверить "решение генетического алгоритма TSP, избегая специального кроссовера и мутации" Гоктурка Уколука. Формат PDF здесь. Он дает обзор специальных операторов кроссовера для перестановок и предлагает умное представление перестановок, которое хорошо работает со стандартным кроссовером (т. е. пересечение двух перестановок всегда производит две перестановки).
ключевым моментом является представление перестановки в последовательности инверсия, т. е. для каждого элемент i
, магазина в a[i]
сколько элементов больше, чем i
слева от i
в перестановке. В отличие от прямого представления, единственное ограничение на a[i]
является локальным, т. е. a[i]
не может превышать N - i
. Это означает, что простое пересечение двух допустимых инверсионных последовательностей всегда порождает две допустимые инверсионные последовательности - нет необходимости в специальной обработке повторяющихся элементов.
вместо использования стандартной техники перекрестного перехода GA (as очерчено MusiGenesis), лучше использовать заказал кросс-овер для Проблемы коммивояжера.
обычный подход не работает так хорошо для TSP, потому что функция пригодности очень чувствительна к относительным позициям разных городов в эволюционировавшем маршруте, а не к их абсолютным позициям. Например, если вы посещали все европейские столицы, то самые короткие маршрут на самом деле не зависит от того, посещаете ли вы Братиславу 1, 2 или 9. Что более важно, что вы посещаете его непосредственно перед или сразу после посещения Вены вместо посещения Хельсинки, Афин и 6 других столиц между ними.
конечно, как mjv также указывает, традиционный кросс-овер также представит дубликаты в вашем маршруте. Если один из родителей имеет Париж в позиции 2, а другой-Париж в позиции 14, пересечение может привести к одному эволюционировавшему маршруту, который посещает Париж дважды (и пропускает другой город), а другой эволюционировавший маршрут, который не посещает его вообще. Упорядоченный перекрестный генетический оператор не страдает от этой проблемы. Он сохраняет элементы и изменяет порядок.
здесь программы на C# подход для того, что вы ищете.
Что касается интереса (или его отсутствия) реализации кросс -, все это зависит от конкретной логики выбора, которую будет использовать ваша реализация (и/или сама функция оценки, если, например, она включает оценку скорости улучшения). Во многих случаях перекрестные операции будут "спасать от разделочного блока" некоторые решения это эффективно / оптимально в области графика, но как-то" застряло " в других. Это не значит, что если общий алгоритм достаточно медленный и охватывает хороший процент пространства решений, то те же решения, возможно, не были обнаружены заново, но кросс-овер также может увеличить эти открытия (и/или позволить вам застрять в другом локальном минимуме; -))
не имеет прямого отношения, но представляет значительный интерес для тех, кто смотрит в GA, является оригинал "окончательный" эксперимент в GA оригинальный" окончательный " эксперимент в GA профессором Олдерменом (из RSA славы), который использовал фактические молекулы ДНК [в программу C - просто шучу] для решения связанной проблемы графа, что гамильтоновых графов.
редактировать: перечитывая вопрос, я понимаю, почему вы его задали, а точнее почему вы хотели бы" нет, вы не хотите перекрестного " ответа ;-)
Ваш genonme напрямую привязан к графу сам (в этом нет ничего плохого,априори), но это создает препятствие, что большинство перекрестных offsrpings не будет жизнеспособным, так как они могут иметь дубликаты узлов (посетить один и тот же город дважды или более) и отсутствующие узлы (не посетить некоторые города)... Кроме того, жизнеспособные перекрестные переходы будут влиять на аналогичные графики и, следовательно, возможно, просто постепенно затратят поиск по сравнению с тем, что обнаружили бы мутации...
Гудеть... Тогда, возможно, cross-over, в этой конкретной реализации не очень поможет алгоритму (и действительно, возьмите большую часть своего процессора для создания, тестирования и часто отбрасывания перекрестных отпрысков, CPU, который лучше использовать, предоставляя больше итераций и более медленная скорость охлаждения...). Пока! Вы найдете хитрый способ выполнения перекрестного operatitions ;-)
цель кроссовера для расширения эволюционного пространства поиска путем объединения новых геномных комбинаций.
единственным реальным критерием, необходимым для эволюционного процесса, является то, что продукт кроссовера содержит части обоих родителей и представляет собой действительный геном.
только вы знаете правила валидности для вашего алгоритма, поэтому только вы можете указать метод кроссовера, который будет работать (если вы не хотите поделиться более подробной информацией о правилах валидации для вас структура генома).
вот моя точная реализация так называемого метода" частично сопоставленного кроссовера " в GA для TSP.
здесь это статья, которая объясняет частично отображенный кроссовер в теории, а ниже-мой код.
//construct a new individual with the genes of the parents
//method used is cross over mapping
//note that Individual datastrucuture contains an integer array called Genes which //contains the route.
//
public Individual Breed(Individual father, Individual mother)
{
int[] genes = new int[father.Genes.Length];
int[] map = new int[father.Genes.Length + 1]; //create a map to map the indices
int crossoverPoint1 = rand.Next(1, father.Genes.Length - 2); //select 2 crossoverpoints, without the first and last nodes, cuz they are always thje same
int crossoverPoint2 = rand.Next(1, father.Genes.Length - 2);
father.Genes.CopyTo(genes, 0); //give child all genes from the father
for (int i = 0; i < genes.Length; i++) //create the map
{
map[genes[i]] = i;
}
//int[] genesToCopy = new int[Math.Abs(crossoverPoint1 - crossoverPoint2)]; //allocate space for the mother genes to copy
if (crossoverPoint1 > crossoverPoint2) //if point 1 is bigger than point 2 swap them
{
int temp = crossoverPoint1;
crossoverPoint1 = crossoverPoint2;
crossoverPoint2 = temp;
}
//Console.WriteLine("copy mother genes into father genes from {0} to {1}", crossoverPoint1, crossoverPoint2);
for (int i = crossoverPoint1; i <= crossoverPoint2; i++) //from index one to the 2nd
{
int value = mother.Genes[i];
int t = genes[map[value]]; //swap the genes in the child
genes[map[value]] = genes[i];
genes[i] = t;
t = map[genes[map[value]]]; //swap the indices in the map
map[genes[map[value]]] = map[genes[i]];
map[genes[i]] = t;
}
Individual child = new Individual(genes);
return child;
}
когда я был на первом курсе в моем университете, я делал некоторые вычисления (которые заняли около 30 страниц) о влиянии различных операторов GA на сходимость решения. Как я помню, crossover-не лучшее решение для TSP, более подходящим решением является мутация, которая инвертирует суб-последовательность вершин.
пример:
ранее:BCDEFGH
после: AFEDCBGH
"кроссовер "в генетических алгоритмах просто относится к произвольному способу смешивания двух" генетических последовательностей", каждая из которых представляет собой конкретное решение проблемы (как последовательность сопоставляется с решением до вас). Например, предположим, что у вас есть популяция, состоящая из следующих двух последовательностей:
AAAAAAAAAA
BBBBBBBBBB
один из способов рекомбинации этих двух "родительских" блоков, чтобы случайно выбрать точку (скажем, позиция 3), в результате чего эти два "ребенка" последовательности:
AAABBBBBBB
BBBAAAAAAA
или вы можете случайным образом выбрать две точки пересечения (скажем, 3 и 8), в результате чего эти две последовательности:
AAABBBBBAA
BBBAAAAABB
для удовольствия и дополнительной изменчивости вы также можете ввести возможность случайных точечных мутаций:
AAABBBABAA
BBBAAAAABB
на самом деле нет никаких жестких правил относительно того, как вы реализуете кроссовер в генетическом алгоритме, так же, как на самом деле нет никаких жестких правил, регулирующих эволюцию в биологическом мире. Все работает, работает.