programing

C #의 유전 프로그래밍

nasanasas 2020. 12. 8. 08:17
반응형

C #의 유전 프로그래밍


저는 C #에 대한 좋은 유전 프로그래밍 예제를 찾고있었습니다. 좋은 온라인 / 도서 자료를 아는 사람이 있습니까? Evolutionary / Genetic 프로그래밍을위한 C # 라이브러리가 있는지 궁금하십니까?


제 자신의 유전 프로그래밍 교훈 응용 프로그램을 개발 한 후 AForge.NET Genetics 라는 완전한 유전 프로그래밍 프레임 워크를 발견했습니다 . Aforge.NET 라이브러리 의 일부입니다 . LGPL에 따라 라이센스가 부여되었습니다.


MSDN은 작년에 유전 프로그래밍에 대한 기사를 게재했습니다. 유전 알고리즘 : Windows Forms를 사용한 적자 생존


절대적으로 필요한 경우가 아니라면, 특히 유전자 알고리즘 구현을 막 시작하는 경우 실제로 어셈블리를 생성하지 않는 것이 좋습니다.

유전 알고리즘은 대상 언어가 기능적이고 동적으로 입력 될 때 구현하기 가장 쉽습니다. 이것이 일반적으로 대부분의 유전 알고리즘 연구가 LISP로 작성된 이유입니다. 결과적으로 C #으로 구현하려는 경우 자신의 미니 "트리 언어"를 정의하고 알고리즘이 트리를 생성하도록하고 알고리즘의 각 반복을 실행할 때가되면 트리를 해석하는 것이 좋습니다. .

저는 대학에있을 때 이와 같은 프로젝트를했고 (C #에서 유전 알고리즘을 구현 한) 그 방식을 취했습니다.

그렇게하면 실행 및 유전 알고리즘 "재생산"단계 모두에 최적으로 적합한 하나의 표현 (AST 표현) 만 사용할 수 있다는 이점이 있습니다.

또는 어셈블리를 생성하려는 경우 앱에 불필요한 복잡성을 많이 추가하게 될 것입니다. 현재 CLR은 전체 앱 도메인이 삭제되지 않는 한 앱 도메인에서 어셈블리를 언로드하는 것을 허용하지 않습니다. 이는 앱에 막대한 메모리 누수가 발생하지 않도록 알고리즘을 반복 할 때마다 생성 된 각 프로그램에 대해 별도의 앱 도메인을 가동해야 함을 의미합니다. 일반적으로 모든 것이 추가 자극을 추가합니다.

반면에 해석 된 AST는 다른 객체와 마찬가지로 가비지 수집이 가능하므로 여러 앱 도메인을 둘러 볼 필요가 없습니다. 성능상의 이유로 최종 결과를 코드 생성하려는 경우 나중에 지원을 추가 할 수 있습니다. 그러나 DynamicMethod 클래스 를 사용하여 수행하는 것이 좋습니다 . 런타임에 동적으로 AST를 컴파일 된 델리게이트로 변환 할 수 있습니다. 이를 통해 코드 생성 작업을 가능한 한 간단하게 유지하면서 단일 DLL을 배포 할 수 있습니다. 또한 DynamicMethod 인스턴스는 가비지 수집이 가능하므로 유전 알고리즘의 일부로 사용하여 작업 속도를 높일 수 있습니다.


LINQ 표현 트리를 사용하여 유전 프로그래밍을 구현할 수 있습니다. 임의 IL 생성보다 유용한 것을 생성 할 가능성이 더 높습니다.


http://channel9.msdn.com/posts/Charles/Algorithms-and-Data-Structures-Mike-Swanson-Genetic-Session-Scheduler/ 에서 Mike Swanson의 channel9에서 이에 대한 높은 수준의 토론을 보았습니다 .


일반적인 유전 알고리즘과는 반대로 실제 유전 프로그래밍을 의미합니까?

그렇다면 C # /. net은 최상의 언어가 아닙니다. 예를 들어 LISP는 항상 GP의 중심이었습니다.

그러나 필요한 경우 CIL / MSIL을 동적으로 생성하고 싶을 것입니다. System.Reflection.Emit을 사용하여이 작업을 수행 할 수 있지만 Mono.Cecil을 권장 합니다 . (반사가 방출하는 것처럼) 좋은 문서가 부족합니다. 그러나 훨씬 더 나은 어셈블리 방출과 반사를 제공합니다.

또 다른 문제는 .net 프레임 워크에서 코드를로드하고 나중에 폐기하는 것이 간단하다는 것입니다. 적어도 어셈블리를 언로드 할 수 없습니다. appdomains를 언로드 할 수 있지만 코드를 별도의 appdomain으로로드하고 외부에서 호출하는 전체 업무는 꽤 지저분해질 수 있습니다. .NET 3.5의 System.Addin 기능을 사용하면이 작업이 더 쉬워집니다.


일반적으로 유전 알고리즘이나 휴리스틱 최적화에 관심이 있다면 HeuristicLab을 살펴 보시기 바랍니다.. 새 버전을 출시 한 지 1.5 년이 지난 몇 년 동안 개발되었습니다. C # 4로 프로그래밍되었으며 멋진 GUI가 있습니다. 유전 알고리즘, 유전 프로그래밍, 진화 전략, 로컬 검색, Tabu 검색, 입자 군집 최적화, 시뮬레이션 어닐링 등과 같은 많은 알고리즘이 이미 사용 가능합니다. 또한 차량 라우팅 문제, 여행하는 세일즈맨, 실제 기능 최적화, 배낭, 2 차 할당 문제, 분류, 회귀 등과 같은 몇 가지 문제가 구현되었습니다. 튜토리얼도 있으며 프로토콜 버퍼가 통합되어 있으므로 솔루션 평가를 위해 외부 프로그램과 통신 할 수 있습니다. GPL에 따라 라이센스가 부여되었습니다. 2009 년에 소프트웨어는 Microsoft Austria의 Microsoft 혁신 상을 받았습니다.

우리는 또한 주제에 대한 책을 썼습니다 : 유전 알고리즘과 유전 프로그래밍 .


도움이 될 수있는 무료 제품이 있습니다. Genetic Algorithm Framework .Net 4.0 은 일부 지원 문서가 포함 된 단일 .Net 4.0 어셈블리입니다.


저는 지금 A Field Guide to Genetic Programming을 읽고 있습니다 (무료 PDF 다운로드). 문고판으로도 제공됩니다. TinyGP 라는 Java로 작성된 라이브러리 사용에 대해 논의 합니다. 그것에서 약간의 마일리지를 얻을 수 있습니다. 실제 프로그래밍을 시작하지는 않았지만 C #의 일부 개념을 적용하기를 희망합니다.


완전한 기능을 갖춘 Evolutionary Computation 프레임 워크에 관심이 있다면 ECJ를 C # .NET 4.0으로 포크했습니다. 패키지에는 모든 작업 샘플을 포함하여 원래 ECJ Java 프로젝트의 모든 것이 포함되어 있습니다.

또한 변환의 여러 측면을 확인하기 위해 500 개의 단위 테스트를 작성했습니다. 그러나 더 많은 테스트가 필요합니다. 특히 분산 계산 측면은 완전히 테스트되지 않았습니다. ECJ의 단순한 소켓 사용에서 WCF 및 WF를 사용하는보다 강력한 전략으로 전환 할 계획이기 때문입니다. 또한 TPL (Task Parallel Library)을 활용하기 위해 프레임 워크를 재 작업 할 것입니다.

어쨌든 여기에서 초기 변환을 다운로드 할 수 있습니다.

http://branecloud.codeplex.com

또한 "합성 지능"연구와 관련된 여러 다른 프레임 워크를 Java에서 .NET으로 변환하는 중입니다 (시간을 찾을 수있을 때).


GeneticSharp 를 사용해 볼 수 있습니다 .

선택, 교차, 돌연변이, 재 삽입 및 종료와 같은 모든 고전적인 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();

Manning 책 : " Metaprogramming in .NET "은 표현식 트리를 통해 GP에 대한 큰 섹션을 제공합니다.


저는 C #에서 ECJ 포트를 유지합니다. 훌륭합니다.

참고URL : https://stackoverflow.com/questions/14008/genetic-programming-in-c-sharp

반응형