Вопрос

Я искал несколько хороших примеров генетического программирования для C #.Кто-нибудь знает о хороших онлайн-ресурсах / книгах?Интересно, существует ли библиотека C # для эволюционного / генетического программирования?

Это было полезно?

Решение

После разработки мое собственное дидактическое приложение для генетического программирования, я нашел полную структуру генетического программирования под названием AForge.ЧИСТАЯ генетика.Это часть Aforge.Сетевая библиотека.Это лицензировано по LGPL.

Другие советы

В прошлом году в MSDN была статья о генетическом программировании: Генетические Алгоритмы:Выживание наиболее приспособленных с помощью Windows Forms

Я бы рекомендовал не создавать сборки на самом деле, если вам это абсолютно не нужно, особенно если вы только начинаете внедрять генетический алгоритм.

Генетический алгоритм проще всего реализовать, когда целевой язык является функциональным и динамически типизированным.Обычно именно поэтому большинство исследований генетических алгоритмов написано на LISP.В результате, если вы собираетесь реализовать это на C #, вам, вероятно, лучше определить свой собственный мини-"древовидный язык", заставить алгоритм генерировать деревья и просто интерпретировать деревья, когда приходит время запускать каждую итерацию алгоритма.

Я делал подобный проект, когда учился в колледже (реализация генетического алгоритма на C #), и именно такого подхода я придерживался.

Выполнение этого таким образом даст вам преимущество в том, что у вас будет только 1 представление для работы (представление AST), которое оптимально подходит как для выполнения, так и для этапов "воспроизведения" генетического алгоритма.

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

Интерпретируемые AST, с другой стороны, можно собирать как мусор, так и любой другой объект, и поэтому вам не нужно будет возиться с несколькими доменами приложений.Если из соображений производительности вы хотите создать конечный результат с помощью кода, вы можете добавить поддержку для этого позже.Тем не менее, я бы вам порекомендовал сделать это с помощью Динамический метод класс.Это позволит вам динамически преобразовывать AST в скомпилированный делегат во время выполнения.Это позволит вам развернуть единственную библиотеку DLL, сохраняя при этом процесс генерации кода максимально простым.Кроме того, экземпляры DynamicMethod можно собирать из мусора, так что в конечном итоге вы могли бы использовать их как часть генетического алгоритма, чтобы ускорить работу и там.

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

Я видел хорошее обсуждение этого на высоком уровне на 9-м канале Майка Свенсона в http://channel9.msdn.com/posts/Charles/Algorithms-and-Data-Structures-Mike-Swanson-Genetic-Session-Scheduler/

Вы имеете в виду реальное генетическое программирование, в отличие от генетических алгоритмов в целом?

Если это так, то C # / .net - не лучший язык для этого.LISP, например, всегда был основой GP.

Однако, если вам необходимо, вы, вероятно, захотите динамически генерировать CIL / MSIL.Вы могли бы сделать это с помощью Система.Отражение.Излучение, однако я бы порекомендовал Моно.Сесил.Ему не хватает хороших документов (как будто у reflection emit они есть)..Но он обеспечивает гораздо лучшее излучение и отражение при сборке.

Другая проблема заключается в том, что загрузить код, а затем удалить его в .net Framework менее чем тривиально.По крайней мере, вы не можете выгружать сборки.Вы можете выгружать домены приложений, но весь процесс загрузки кода в отдельный домен приложения и вызова его извне может стать довольно запутанным.Система .NET 3.5.Дополнительные материалы должны упростить это.

Если вы интересуетесь генетическими алгоритмами или эвристической оптимизацией в целом, вы, возможно, захотите взглянуть на Эвристическая лаборатория.Он разрабатывается уже несколько лет, прошло 1,5 года с тех пор, как мы выпустили новую версию.Он запрограммирован на C # 4 и имеет приятный графический интерфейс.Уже доступно множество алгоритмов, таких как Генетический алгоритм, Генетическое программирование, Эволюционная стратегия, Локальный поиск, Запретный поиск, Оптимизация скопления частиц, Имитированный отжиг и многое другое.Также реализовано несколько задач, таких как задача маршрутизации транспортного средства, коммивояжер, оптимизация реальных функций, рюкзак, задача квадратичного назначения, классификация, регрессия и многие другие.Также есть учебные пособия, и у нас интегрированы буферы протоколов, чтобы вы могли взаимодействовать с внешними программами для оценки решения.Он лицензирован по GPL.В 2009 году программное обеспечение получило награду Microsoft innovation award от Microsoft Austria.

Мы также написали книгу на эту тему: Генетические алгоритмы и Генетическое программирование.

У меня есть бесплатный продукт, который может помочь. Платформа генетических алгоритмов .Net 4.0 представляет собой единую сборку .Net 4.0 с некоторыми вспомогательными статьями.

Я читаю Практическое руководство по генетическому программированию прямо сейчас (бесплатно скачать в формате PDF).Она также доступна в мягкой обложке.В нем обсуждается использование библиотеки, написанной на Java, которая называется Крошечный gp.Возможно, вы извлечете из этого некоторую пользу.Я еще не начинал заниматься каким-либо реальным программированием, но надеюсь применить некоторые концепции на C #.

Я разветвил ECJ на C # .NET 4.0, если вас интересует полнофункциональная платформа эволюционных вычислений.Пакет включает в себя все из оригинального проекта ECJ Java, включая все рабочие образцы.

Я также написал 500 модульных тестов для проверки многих аспектов преобразования.Но требуется еще много тестов.В частности, аспекты распределенных вычислений полностью не протестированы.Это потому, что я планирую перейти от простого использования сокетов ECJ к более надежной стратегии с использованием WCF и WF.Я также буду перерабатывать фреймворк для использования TPL (Task Parallel Library).

В любом случае, вы можете скачать первоначальное преобразование здесь:

http://branecloud.codeplex.com

Я также нахожусь в процессе перевода нескольких других фреймворков с Java на .NET, которые связаны с исследованиями в области "синтетического интеллекта" (когда смогу найти время).

Ben

Ты можешь попробовать Генетическая резкость.

В нем есть все классические операции GA, такие как отбор, кроссовер, мутация, повторное внедрение и терминация.

Он очень расширяемый, вы можете определить свои собственные хромосомы, функцию приспособленности, стратегию генерации популяции и все перечисленные выше операции.

Он может быть использован во многих приложениях, таких как библиотеки C # и игры Unity 3D. GTK # приложение и Игра в шашки Unity 3D.

Это также работает в Win и OSX.

Вот базовый пример использования библиотеки:

var selection = new EliteSelection();
var crossover = new OrderedCrossover();
var mutation = new ReverseSequenceMutation();
var fitness = new YourFitnessFunction();
var chromosome = new YourChromosome();
var population = new Population (50, 70, chromosome);

var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);

ga.Start();

Книга Мэннинга:"Метапрограммирование в .NET" посвящает большой раздел GP с помощью деревьев выражений.

Я поддерживаю порт ECJ на C #.Это здорово.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top