Операция кроссовера в генетическом алгоритме для 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

на самом деле нет никаких жестких правил относительно того, как вы реализуете кроссовер в генетическом алгоритме, так же, как на самом деле нет никаких жестких правил, регулирующих эволюцию в биологическом мире. Все работает, работает.