Подтвердить что ты не робот

Генетическое программирование на С#

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

4b9b3361

Ответ 3

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

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

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

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

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

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

Ответ 4

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

Ответ 6

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

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

Однако, если вам нужно, вам, вероятно, захочется динамически генерировать CIL/MSIL. Вы можете сделать это с помощью System.Reflection.Emit, однако я бы рекомендовал Mono.Cecil. В нем не хватает хороших документов (как если бы их отражал их излучение). Но он предлагает гораздо лучшую эмиссию и отражение сборки.

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

Ответ 7

Если вас интересуют генетические алгоритмы или эвристическая оптимизация вообще, вы можете взглянуть на HeuristicLab. Он разработан в течение нескольких лет, через 1,5 года с тех пор, как мы выпустили новую версию. Он запрограммирован на С# 4 и имеет приятный графический интерфейс. Существует много алгоритмов, которые уже доступны, например, генетический алгоритм, генетическое программирование, стратегия эволюции, локальный поиск, поиск табу, оптимизация роялей частиц, имитация отжига и многое другое. Есть также несколько проблем, связанных с проблемой маршрутизации транспортных средств, продавцом путешествий, оптимизацией реальных функций, ранцем, проблемой квадратичного задания, классификацией, регрессией и многими другими. Есть также учебные пособия, и у нас встроены протокольные буферы, чтобы вы могли общаться с внешними программами для оценки решений. Лицензируется по лицензии GPL. В 2009 году программное обеспечение получило награду Microsoft от Microsoft Austria.

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

Ответ 8

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

Ответ 9

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

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

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

http://branecloud.codeplex.com

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

Бен

Ответ 10

Вы можете попробовать GeneticSharp.

Он имеет все классические операции GA, такие как выбор, кроссовер, мутация, повторная установка и завершение.

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

Он может использоваться во многих приложениях, таких как библиотеки С# и игры Unity 3D, есть образцы, запускающие его в приложении GTK #. и Игра в 3D-игры Unity.

Он также работает в 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();

Ответ 11

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

Ответ 13

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