d²na
DESCRIPTION
Презентация на защиту диплома по теме «Использование генетических алгоритмов для автоматизированного написания программ».TRANSCRIPT
1
Использованиегенетических алгоритмовдля автоматизированного написания программ
Андрей СитникСанкт-Петербург, февраль 2010
2
Актуальность
— Необходимость генерации и изменения алгоритма по заданным разработчиком требованиям.Например, для автоматического изменения фильтров от спама, при новой тактике рассылки рекламы.
— Необходимость максимальной гибкости алгоритма при изменении условий.Например, при поломке автономного робота.
3
Постановка задачи
Сгенерировать такой алгоритм A, чтобыоценочная функция T(A) была максимальной.
Алгоритм А разработчику неизвестен. Оценочная функция T(A) — программа, результат которой максимизируется. Она предоставляется разработчиком в соответствии с требованиями к алгоритму.
Генератор планируется использовать для изучения автоматической генерации программ, поэтому алгоритм A должен быть закодирован максимально понятным способом. Например, в виде современных языков программирования.
Возможные варианты решения:— полный перебор;— различные методы, накладывающие ограничения на T(A);— генетический алгоритм.
4
Генетический алгоритм
Начальная популяция
Мутация
Размножение
Отбор
a a a
a b c
a
a
Основная проблема генерации программы с помощью генетического алгоритма:
Выбор схемы кодирования алгоритма.
Если базироваться на обычных язык программирования, то мутацию сложно реализовать из-за иерархичных операторов if, while, for и излишнего множества команд.
На текущий момент чаще всего применяются нейронные сети, но при беглом взгляде на нейронную сеть нельзя понять её алгоритм.
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 (записывается имя переменной).
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
7
Схема генератора D2NA-программ
Виртуальная машина D2NA
Мутация
Размножение
Отбор
ГенераторРазработчик
начальная популяция
оценочная функция
D2NA-кодРезультатыоценочной функции
Схема генетического алгоритма с вводом языка D2NA:
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
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)
10
Результаты Созданный программный притотип «Использования генетических алгоритмов для автоматизированного написания программ» был проверен на задаче «Повторяющейся дилеммы заключённого» из теории игр:
А молчит А предаёт Б
Б молчитА: 0,5 годаБ: 0,5 года
А: свободенБ: 10 лет
Б предаёт АА: 10 летБ: свободен
А: 2 годаБ: 2 года
Идёт следствие, обвиняются два подельника А и Б по одному преступлению. Каждому предлагает предать сообщника или молчать. Общаться между собой они не могут. В зависимости от своих действий, А и Б получат срок:
Ситуация повторяется несколько раз с запоминанием предыстории.Цель: минимизация срока А.
Программный прототип генератора должен найти оптимальную стратегию для А.
Лучшую стратегию «Око за око» придумал Анатолий Рапопорт в 1984:На первом шаге молчим, а далее поступаем так же, как с нами поступили на прошлом шаге.
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
Данная программа реализует оптимальную стратегию «Око за око».
12
Спасибо за внимание