Gennl: part 0

Submitted by 0xd34df00d on Sun, 10/30/2011 - 00:16

Энное время я пописываю один матан-проект с реализацией на хацкеле, который по совместительству является моей бакланаврской дипломной работой на этом курсе. На днях читал на haskellwiki статью о том, как надо писать программы, и пришла мне в голову идея, что и правда было бы неплохо как-то освещать все это дело. Пожалуй, можно было бы писать как о хаскель-проблемах, возникающих при решении этой задачи, от «пишем собственные матрицы» до «блин-нахрена-экзистенциальные-и-дуальные-типы-при-дифференциировании-вперед», так и о сопутствующей математике. Кроме того, хотелось бы получить фидбек о проекте, начиная от «чувак, твой код — полное дерьмо» и до конструктивных обсуждений всякого матана.

Собственно, теперь о проекте. Проект заключается в применении эволюционных алгоритмов к задаче восстановления регрессии — иными словами, фигачим генетическими алгоритмами по множеству математических формул и смотрим, что лучше описывает какие-то там данные. Можно погуглить по «symbolic regression», например.

Помимо прикладной части (кода, реализующего все это дело), в работе есть какие-то попытки теоретически обосновать применимость этих алгоритмов. В частности, в тех работах (Джон Коза, Иван Зелинка), которые я видел (и про которые научрук говорит, что это более-менее bleeding edge), не обосновывается теоретически вообще ничего, а просто предлагается некоторый алгоритм, который типа как работает. Что, почему, зачем — непонятно. В то же время, я пытаюсь хоть как-то что-то обосновать-оценить, ну и, кроме того, есть ряд идей о том, как сам прикладной алгоритм можно еще улучшить. А еще было бы круто найти там где-нибудь групповую структуру или что-то такое, да.

Кроме того, значительная часть реализаций генетики на символьных выражениях работает с некоторым бинарным представлением этих выражений, откуда вылезают всякие интересные проблемы. То есть, выражение кодируется в бинарную строку, и ГА работает уже на этих строках. Таким образом мы можем получить рекурсивные функции (не очень приятно), для сохранения арности функций нужны отдельные костыли (не очень приятно), да и вообще. Я же работаю напрямую с соответствующими выражениям деревьями, и поэтому ряд проблем у меня тупо не возникает. Впрочем, алгоритм пока и не то чтобы работает :)

Делается все это на Haskell, публично доступно в соответствующей git-репе, и есть планы по дальнейшему развитию проекта вне этой самой бакалаврской работы.

Так что, в общем, если это кому интересно — попинайте меня. Комментить можно в стандалоне, в жоже, в пстоще, да и выцепить меня в конфочках math@conference.jabber.ru и c_plus_plus@conference.jabber.ru.