Скрещивание

Другой вид модификации программ – это скрещивание. Для этого две успешные программы комбинируются с целью получения новой. Обычно это делается путем замены какой-то ветви одной программы ветвью другой. На рис. 11.5 приведен соответствующий пример.

Рис. 11.5. Операция скрещивания

Функции, выполняющей скрещивание, передаются два дерева, и она обходит оба. Если случайно выбранное число не превышает пороговой вероятности, то функция возвращает копию первого дерева, в которой одна из ветвей заменена какой-то ветвью, взятой из второго дерева. Поскольку обход выполняется параллельно, то скрещивание произойдет примерно на одном уровне каждого дерева. Добавьте в файл gp.py функцию crossover:

def crossover(t1,t2,probswap=0.7,top=1): if random( )<probswap and not top:

return deepcopy(t2) else:

result=deepcopy(t1)

if isinstance(t1,node) and isinstance(t2,node):

result.children=[crossover(c,choice(t2.children),probswap,0) for c in t1.children]

return result

Попробуйте применить функцию crossover к нескольким случайно сгенерированным программам. Посмотрите, что получается после скрещивания. Получается ли иногда более удачная программа?

>>> random1=gp.makerandomtree(2) >>> random1.display( )

multiply subtract p0

isgreater p0

isgreater p1 5

>>> random2=gp.makerandomtree(2) >>> random2.display( )

if 8 p1

>>> cross=gp.crossover(random1,random2) >>> cross.display( )

multiply subtract p0

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

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100