2011-04-07 1 views
6

이것은 일반적인 질문이며, 일부는 답변을 받았음에도 불구하고 넓은 토론보다는 의견을 원합니다. . 나는 진화론 적 계산과 유전 프로그래밍에 관한 석사 논문을하고자하며, 유전 프로그램으로부터 소스 코드 파일을 만들 수 있는지, 컴파일에 실패했는지 gcc를 호출 할 수 있는지 여부를 리눅스/C++ 전문가들로부터 의견을 듣고 싶다. 컴파일 된 프로그램을 (새로운 프로세스로서) 실행하도록 컴파일 한 다음 해당 프로그램에 입력을 보내고 출력 및 발생 된 예외 (또는 충돌)를 포착 할 수있는 경우, 실패한 이유를 캡처 할 수 있습니다. 나는 그 주제가 너무 광범위하다는 것을 이해하지만 누군가가 이것이 되돌릴 수 없다고 생각하는지, 어리석게 시도했는지, 또는 더 나은 방법이있을지라도 알고 싶다.C++ 유전 프로그래밍 : 링커/컴파일러 호출, 컴파일 된 프로그램 실행 및 입출력 연결

+0

전혀 바보가 아니지만 시간이 많이 걸립니다. 지적 도전적인 부분은 진화 할 좋은 C++ dna를 생각해내는 것입니다. 원시 수프의 주제/목표는 무엇입니까? –

+0

이 작업을 수행하는 데 제한이 있습니까? C++입니까? 소프트웨어 자체가 변경 될 경우 더 나은 옵션이 있다고 생각합니다. –

+0

이것은 제대로 작동하지 않을 것입니다. 돌연변이가 생존하고 결과적으로 개선에 기여하는 것은 극히 희박합니다. 컴파일러는 한 글자의 변경 사항을 지키지 않으며, 반대의 작업을 수행하도록 설계되었습니다. –

답변

1

네, 가능합니다. 실제로는 아주 간단합니다. 임시 파일 (mkstmp)에 대한 소스 코드를 출력하고/exec 컴파일 과정 (임시 파일로 출력)을 실행하면 입력 결과와 출력을 연결하기 전에 dup2pipe까지 결과 프로그램 fork/exec이 생성됩니다. 그것은 기본적인 유닉스 프로그래밍이며, C 언어에서는 여기서는 복잡하지 않습니다.

코드 생성 자체가 어려울 수 있지만 이는 프로젝트에 크게 좌우됩니다.

또한 우리는 몇 달 후 현대 도구가 있습니다. 나는 Clang이 이런 종류의 물건을 볼 수있는 것이 분명하다고 생각합니다. 수행하려는 코드 생성이 단순하거나 간단하지는 않지만 구조화 된 경우 LLVM 코드를 직접 출력 할 수 있습니다. 그것은 어렵지 않으며 컴파일 된 코드를 적시에 효율적으로 생성 할 수 있습니다.

+0

링크 주셔서 대단히 감사합니다! 다른 컴파일러를 사용하기로 마음 먹었습니다. 코드 생성 자체는 GP 전개 과정이 될 것이므로 컴파일하지 않으면 본질적으로 종료됩니다. 컴파일 및 충돌, 세그먼트, 예외 발생 등이 발생하면 종료됩니다. 컴파일되고 원활하게 실행 되더라도 생존을 위해서는 각 시나리오에서 필요한 것을 수행해야합니다. 나는 Clang을 대신 사용할 수 있다고 생각합니다. 코드 생성은 전적으로 필요한 작업의 세대와 복잡성에 따라 달라집니다. –

1

이 유전 프로그램에서 당신은 무엇을 최적화하려고합니까? 단순히 실행되는 프로그램을 찾는 것 외에 어떤 기준을 찾고 있습니까? 나는 요점을 꽤 얻지는 않는다. ...

내가 묻는 이유는 일종의 최적화 문제를 해결하기 위해 유전 알고리즘을 사용하는 것을 이해하기 때문이다. 이 경우에는 프로세스의 모든 하위 항목을 평가 한 후 휴리스틱 및 선택 기준에 따라 새 자식을 낳을 수있는 일종의 휴리스틱이 있습니다. 이 소스를 생성하는 데 필요한 결과가 무엇인지, 또는이를 평가하기 위해 발견 적 방법을 작성하는 방법을 이해하지 못합니다.

+0

그것은 유전자 알고리즘이 무언가를 최적화하려고 시도한 것이 아니라, 기계 학습 - 인공 생명, 기계가 복잡한 컴퓨터 코드를 진화시키는 것이 가능한지, 실험을 통해 더 복잡한 코드를 배우고 진화시킬 수 있는지를 보여주는 실험입니다.프로그램의 함수, 클래스 등은 각각의 경우에 특별한 기준에 따라 평가되어야하며 그렇게하면 "규칙 집합"을 만들 수 있습니다. 예를 들어 첫 번째 단계 중 하나에서 두 입력 중 어느 것이 더 큰지를 반환하는 함수를 개발하려고 시도합니다. 나중에 엔진은 그 기능을 사용할 수 있어야합니다. –

+0

유전 알고리즘을 사용하기를 원한다면, 어느 시점에서 최적화하고자하는 대상에 문제를 형성해야합니다. 또한 생성중인 소스 코드를 평가하는 휴리스틱을 형식화해야합니다. 나는 당신이하는 일이 왜 유전 알고리즘과 관련이 있는지를 실제로 알지 못합니다. 그러나 소스 코드의 라인을 무작위로 변경하여 컴퓨터를 "진화"하려고 시도하는 것이 좋을지 모르지만 실제로이 방법 뒤에는 아무 것도없는 것처럼 보입니다. – jberg

+0

방법이 있습니다! 또한, 그것은 실용적이고 의미 있고 유용한 코드를 만들기위한 진화 알고리즘 인 최적화 알고리즘이 아닙니다. 평가는 a) 컴파일 오류 검사 b) 예외 검사 c) 무엇이든 목표 달성 (입력 및 출력 검사)에 실패 함. 내가 말했듯이, 나는 전에 이것을 해왔다. 나의 우려는 평가 그 자체가 아니라 오히려 실제 평가를하기 위해 컴파일러와 호출 된 프로세스와의 의사 소통이다. 또한 그것은 GA가 아니며 GP, 문자열 인코딩, 고정 된 문자열 등입니다. http://www.genetic-programming.org –

관련 문제