d²na

12

Click here to load reader

Upload: andrey-sitnik

Post on 05-Jul-2015

1.088 views

Category:

Technology


0 download

DESCRIPTION

Презентация на защиту диплома по теме «Использование генетических алгоритмов для автоматизированного написания программ».

TRANSCRIPT

Page 1: D²NA

1

Использованиегенетических алгоритмовдля автоматизированного написания программ

Андрей СитникСанкт-Петербург, февраль 2010

Page 2: D²NA

2

Актуальность

— Необходимость генерации и изменения алгоритма по заданным разработчиком требованиям.Например, для автоматического изменения фильтров от спама, при новой тактике рассылки рекламы.

— Необходимость максимальной гибкости алгоритма при изменении условий.Например, при поломке автономного робота.

Page 3: D²NA

3

Постановка задачи

Сгенерировать такой алгоритм A, чтобыоценочная функция T(A) была максимальной.

Алгоритм А разработчику неизвестен. Оценочная функция T(A) — программа, результат которой максимизируется. Она предоставляется разработчиком в соответствии с требованиями к алгоритму.

Генератор планируется использовать для изучения автоматической генерации программ, поэтому алгоритм A должен быть закодирован максимально понятным способом. Например, в виде современных языков программирования.

Возможные варианты решения:— полный перебор;— различные методы, накладывающие ограничения на T(A);— генетический алгоритм.

Page 4: D²NA

4

Генетический алгоритм

Начальная популяция

Мутация

Размножение

Отбор

a a a

a b c

a

a

Основная проблема генерации программы с помощью генетического алгоритма:

Выбор схемы кодирования алгоритма.

Если базироваться на обычных язык программирования, то мутацию сложно реализовать из-за иерархичных операторов if, while, for и излишнего множества команд.

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

Page 5: D²NA

5

Язык D2NAЯзык D2NA создан для представления алгоритма в форме, удобной для мутации и смешивания в генетическом алгоритме. Чтобы быть понятным человеку он базируется на современных языках программирования:

1. Только целочисленные переменные (их имена с прописной буквы).2. С внешним миром обмен идёт сигналами (их имена с заглавной буквы).3. Перед именами переменных и сигналов идёт двоеточие.4. Только три команды:

4.1. послать сигнал;4.2. увеличить переменную на 1;4.3. уменьшить переменную на 1.

5. Из операторов только if (без for и while).Синтаксис: on условие do команды end.

6. Исключается вложенность if’ов.7. Программа начинается со списка if’ов со всеми возможными условиями.8. В условии if’а проверяется только:

8.1. поступление сигнала (записывается имя сигнала);8.2. значение переменной больше 0 (записывается имя переменной).

Page 6: D²NA

6

Пример программы на языке D2NA

Для запуска программы посылается сигнал :Init. На сигнал :Print посылается исходящий сигнал :Ping. На следующий :Print посылается :Pong и обратно.

on :Init do up :ping_stateend

on :Print, :ping_state do send :Ping down :ping_state up :pong_stateend

on :Print, :pong_state do send :Pong down :pong_state up :ping_stateend

Page 7: D²NA

7

Схема генератора D2NA-программ

Виртуальная машина D2NA

Мутация

Размножение

Отбор

ГенераторРазработчик

начальная популяция

оценочная функция

D2NA-кодРезультатыоценочной функции

Схема генетического алгоритма с вводом языка D2NA:

Page 8: D²NA

8

Реализация на языке Rubyгенератора D2NA-программ

Язык Ruby:— интерпретируемый

с JIT-компиляцией;— кроссплатформенный;— с динамической типизаций;— с автоматическим управлением

памятью и сборщиком мусора;— с объектной модель Smalltalk;— в нём всё является объектом, даже

число и класс;— имеет замыкания и гибкий

синтаксис.

MutableCode

Population

Tests

Evolution

Code Rule Rule …

d2na/evolution

d2na/vm

Диаграмма классов:

Метрики: 11 классов 84 метода 110 правок в истории проекта по системе контроля версий 487 строк комментариев2 261  строка кода

Генератор опубликован в Интернетепод свободной лицензией GNU GPL:http://github.com/ai/d2na

Page 9: D²NA

9

Отладка и тестирование— 177 модульных тестов (1 015 строк кода). — 100% покрытие кода тестами по C0 (по строкам).— 4 интеграционных теста.— Тесты писались до реализации (методология TDD).— Было исправлено около 16 ошибок

во время интеграционного тестирования.

Пример. В D2NA, при клонировании кода, условные операторы копируются, только если в клоне их изменили (копирование при записи, copy-on-write).В начале клонирование было неправильным, так как метод clone() клонирует только сам массив, но не создаёт копии его элементов:

def clone_rule(rule) clone = rule.dup() clone.commands = clone.commands.clone() ↓def clone_rule(rule) clone = rule.dup() clone.commands = deep_clone(clone.commands)

Page 10: D²NA

10

Результаты Созданный программный притотип «Использования генетических алгоритмов для автоматизированного написания программ» был проверен на задаче «Повторяющейся дилеммы заключённого» из теории игр:

А молчит А предаёт Б

Б молчитА: 0,5 годаБ: 0,5 года

А: свободенБ: 10 лет

Б предаёт АА: 10 летБ: свободен

А: 2 годаБ: 2 года

Идёт следствие, обвиняются два подельника А и Б по одному преступлению. Каждому предлагает предать сообщника или молчать. Общаться между собой они не могут. В зависимости от своих действий, А и Б получат срок:

Ситуация повторяется несколько раз с запоминанием предыстории.Цель: минимизация срока А.

Программный прототип генератора должен найти оптимальную стратегию для А.

Лучшую стратегию «Око за око» придумал Анатолий Рапопорт в 1984:На первом шаге молчим, а далее поступаем так же, как с нами поступили на прошлом шаге.

Page 11: D²NA

11

Результаты 2Формализация задачи в видеоценочной функции на языке Ruby:protocode do input :Step, :Keeped, :Betrayed output :Keep, :Betrayendend_if { stagnation > 20 }

punishments = {[:Keep, :Keep] => [0.5, 0.5], [:Betray, :Keep] => [ 0, 10], [:Keep, :Betray] => [ 10, 0], [:Betray, :Betray] => [ 2, 2]}opponents = [proc { :Keep }, proc { :Betray }, proc { |p| :Betrayed == p ? :Betray : :Keep }]

opponents.each do |opponent| selection do out_punishment = 0; our_previous_choice = nil 10.times do send :Step our_choice = out.first clear_out!

unless our_choice our_punishment = 100; break end

opponent_choice = opponent.call(our_previous_choice) our_previous_choice = input_name(our_choice) our_punishment += punishments[[our_choice, opponent_choice]].first end min our_punishment endend

Автоматически сгенерированное решение на языке D2NA:

on :Init do send :Keepend

on :Step do send :Betrayend

on :Keeped do send :Betrayend

Данная программа реализует оптимальную стратегию «Око за око».

Page 12: D²NA

12

Спасибо за внимание