Московский государственный университет путей сообщения
Опубликован: 10.10.2014 | Доступ: свободный | Студентов: 866 / 193 | Длительность: 22:10:00
Лекция 6:

Генетическое программирование

6.2.3. Графоподобные структуры

Эта форма представления разработана для задач, которые не могут быть решены методами, которые используют рассмотренные выше модели программ. Данный подход использует более выразительную модель для представления программы [7]. Поэтому данный подход позволяет эффективно решать многие задачи, которые нельзя было решить с помощью предыдущих методов.

Сначала рассмотрим типичную блок-схему программы написанной вручную, которая представлена в качестве примера на рис.6.3.

Здесь каждая особь – программа представляется в виде графа. Вершина графа представляет линейный участок программы. Она имеет две части – собственно линейную программу и узел ветвления. Из рисунка видно, что блок-схема линейного графа более естественна, чем линейная (древовидная) форма представления программы.

Это объясняется тем, что многие программы содержат операторы ветвления, после которых может быть вызов другой части кода программы, не входящей в линейную последовательность операторов. Линейная программа выполняется в том случае, когда данный узел графа достигается при интерпретации программы на конкретных данных. После выполнения линейной части выбирается узел-последователь в соответствии с функцией ветвления этого узла. В течение интерпретации узлы только одного пути графа от входов до выхода будут выполняться в зависимости от текущих значений переменных условий операторов ветвления.

Представление программы в виде графа

Рис. 6.3. Представление программы в виде графа
Таблица 6.2.
Оператор Ветвления Описание оператора
A<0 (аккумулятор меньше 0) Если значение аккумулятора-сумматора меньше нуля, то выбирается левый (верхний) преемник, иначе правый (нижний)
А>0 Если значение аккумулятора-сумматора больше нуля, то выбирается левый (верхний) преемник, иначе правый (нижний)
A<op Если значение аккумулятора-сумматора меньше значения операнда, то выбирается левый (верхний) преемник, иначе правый (нижний)
A>op Если значение аккумулятора-сумматора больше значения оператора, то выбирается левый (верхний) преемник, иначе правый (нижний)
RD<0 (регистр данных) Если значение регистра данных меньше нуля, то выбирается левый (верхний) преемник, иначе правый (нижний)
RD>0 Если значение регистра данных больше нуля, то выбирается левый (верхний) преемник, иначе правый (нижний)
RD<op Если значение регистра данных меньше значения оператора, то выбирается левый (верхний) преемник, иначе правый (нижний)
RD>op Если значение регистра данных больше значения оператора, то выбирается левый (верхний) преемник, иначе правый (нижний)

Реализация линейных подструктур использует список операторов Си (или другого языка программирования, в том числе и ассемблера) переменной длины, которые оперируют с переменными или константами и полученные значения присваиваются переменным (например, a = b + 1.33). После выполнения программы вычисленное значение запоминается в "выходные" переменные. Функция ветвления также является оператором Си, который оперирует с теми же переменными, что и линейная программа, но этот оператор только читает значения этих переменных.Таблица 6.2 содержит множество операторов ветвления, которые могут быть использованы в данной модели.

На рис.6.4 представлен детально узел графа, соответствующий некоторой части линейной программы.

Подпрограмма, соответствующая узлу графа.

Рис. 6.4. Подпрограмма, соответствующая узлу графа.

Данная модель, как и предыдущая, использует при выполнении программы глобальную память. Графоподобные структуры позволяют расширить класс задач, которые могут быть решены с помощью ГП, так как являются более общими по сравнению с первыми двумя и допускают эффективную реализацию [7].

Известен другой способ применения структур графов в ГП, называемый PADO [5]. Здесь каждая программа представляется ориентированным графом, содержащим узлы, индексированную память для входных переменных и стек, как показано на рис.6.5. В произвольном ориентированном графе каждый узел может иметь N исходящих дуг.

Представление программы ориентированным графом.

Рис. 6.5. Представление программы ориентированным графом.

Эта структура не просто показывает потоки информации и управление ходом выполнения программы. Узел в графе соответствует сегменту программы и имеет две части: "действие" и "ветвление". Часть "действие" содержит константы и функцию, которая выполняется при достижении данного узла в процессе интерпретации программы. Данные передаются между узлами через стек. Часть "действие" получает данные из (верхушки) стека и после выполнения соответствующей функции передает преобразованные данные снова в стек. После того выполняется "ветвление", которое определяет ветвь следующего выполняемого узла на основании данных стека, памяти или специальных констант ветвления. Очевидно, что в процессе интерпретации необязательно посещаются все вершины графа. Каждая программа имеет две специальных вершины "старт" и "конец" и кроме этого может содержать некоторые специальные узлы типа "вызов подпрограммы". Поскольку граф может содержать обратные связи, то вершина "конец" при интерпретации на некоторых входных данных может быть недостижимой вследствие "зацикливания". Поэтому необходимо контролировать и ограничивать время выполнения программы.