유전자 프로그래밍 [폐쇄]


13

최근에 Reddit을 탐색하고 있는데 "JavaScript 유전자 알고리즘"예제와 연결된 게시물을 발견했습니다. 나는 유전자 알고리즘과 프로그래밍의 개념에 정말로 매료되었지만, 일부 인터넷 검색 후에도 여전히 약간 혼란 스럽습니다. 어떻게 작동합니까?

나는 어휘 용어가 다른 무엇보다 나를 혼란스럽게한다고 생각합니다. 간단한 예와 설명을 부탁드립니다. 유전자 프로그래밍의 개념과 프로젝트에서 어떻게 구현할 수 있습니까?


1
Mat Buckland의 "AI Programming Techniques for Game Programming"( amazon.com/Techniques-Programming-Premier-Press-Development/dp/… ) 이라는 좋은 책이 있는데이 책의 절반은 유전자 알고리즘을 다룹니다. 이 책의 제목은 약간 잘못된 것으로 GA와 신경망에 관한 책입니다. 주제에 대한 훌륭한 소개입니다.
Steven Evers 2016 년

답변:


19

유전자 프로그래밍보다 유전자 알고리즘에 대해 이야기하는 것처럼 들리지만 여기에 이해에 대한 나의 기여가 있습니다.


GA를 구성하는 부분으로 GA를 생각하면 편리합니다.

어떤 문제가 있다고 가정 해 봅시다. 가장 먼저 필요한 것은 솔루션의 모양을 표현하는 방법입니다. 도시 A, B, C, D, E와 관련 하여 여행하는 판매원 문제 가있는 경우 도시 이름의 배열 (B, C, A, D, E)과 같은 솔루션이 무엇인지 알 수 있습니다.

이것은 유전자 입니다.

그렇지 않으면 문제의 잠재적 해결책으로 알려져 있습니다. Steven A. Lowe가 언급했듯이 비트 스트링은 유전자를 인코딩하는 일반적인 방법이지만 반드시 그럴 필요는 없습니다. 그것은 단지 특정 일을 더 쉽게 만듭니다. 중요한 부분은이 배열과 같은 방식으로 솔루션을 표현할 수있는 방법이 있다는 것입니다.

지금. 솔루션이 좋은지 어떻게 알 수 있습니까? 당신에게 말하고 솔루션의 등급을 매길 수있는 기능이 필요합니다. 따라서 TSP에서 다시 경로 [B, C, A, D, E]를 사용하여 이동 한 거리를 측정하는 기능이있을 수 있습니다. 당신이 할당하는 '등급'은 단순히 이동 한 거리 일 수 있지만 더 복잡한 문제에서는 여행 비용과 같은 것들을 포함 할 수 있습니다.

이것은 피트니스 기능 입니다.

이제 잠재적 인 해결책을 찾고 그것이 좋은지 알아낼 수 있습니다. 무엇 향후 계획?

다음으로 우리는 1 세대를 시작해야합니다. 그래서 우리는 많은 무작위 솔루션을 생성합니다. 그들이 좋은지 아닌지는 중요하지 않습니다. 이것은 초기 또는 종자 인구입니다. 이것을 당신의 유전자 풀이라고 부를 수 있습니다.

그래서 당신은 당신의 초기 유전자 풀을 가지고 그들 모두에게 당신의 체력 기능을 적용하고 모든 등급을 부여합니다. 이제 다음 세대를 위해 두 가지를 가져 와서 새로운 인구를 확보해야합니다. 누구를 선택합니까? 글쎄, 당신은 꼭 맞는 가장 적합한 것을 선택하고 싶지 않아서, 몇 가지 문제를 일으킬 수 있습니다. 대신 선택 기능 이 필요 합니다 .

시각화하기 쉬운 것을 선택하는 한 가지 방법은 일종의 바퀴를 사용하는 것입니다. 각 유전자는 바퀴의 한 조각이며, 그들의 적합성 점수는 그들의 조각이 얼마나 큰지를 나타냅니다 (적합성이 좋을수록 조각이 더 큼). 휠을 가리키는 핀을 넣고 회전시킵니다 (예 : 난수 생성). 핀은 첫 번째 부모를 가리 킵니다. 두 번째 부모를 위해 다시 수행하십시오.

이제 새 자식을 만들어야합니다. 새로운 인구를 만들기 위해 부모를 합치려고합니다. 이를 수행하는 다양한 방법이 있지만 모두 크로스 오버 함수 라고합니다 . 그것들을 반으로 나누고 부모 사이의 절반을 바꾸거나 일종의 인터리빙을 할 수 있습니다. 이것은 새로운 자녀를 낳는 포유류 부모와 매우 유사합니다.-> 둘 다 새로운 자녀에게 유전자를 제공합니다.

이 새로운 세대를 갖게되면 각 어린이에게 무작위이지만 희귀 한 돌연변이를 일으 킵니다. 나는 종종 돌연변이 비율이 1 % 미만으로 발생하는 것을 보았다. 돌연변이 기능은 무작위로 인코딩 된 유전자에 뭔가 변경됩니다. 유전자가 비트 문자열 인 경우 비트를 교체 할 수 있으며, 도시 배열 인 경우 목록에서 2 개 도시를 교체 할 수 있습니다. 중요한 부분은 비교적 드물게 발생하고 여러 가지가 섞여 있다는 것입니다.

원하는 수의 세대까지, 또는 체력 기능이 지속적으로 높은 체력 점수를 가진 부모를 생산할 때까지이 과정을 반복하십시오.


그것은 조금 말이 많았으므로 은유로 요약하겠습니다.

  1. 유전자는 사람들이다 : 사람들은 문제를 해결한다
  2. 운동 기능은 성적입니다 : 사람들은 문제를 얼마나 잘 해결했는지에 따라 성적을 얻습니다.
  3. 새로운 인구를 사육하기 위해 2 명을 선발합니다.
  4. 부모가 번식하면 자녀를 키우기 위해 결합합니다.
  5. 자녀를 거의 무작위로 돌연변이시키지 않습니다
  6. 당신은 새로운 인구의 아이들을 등급
  7. 헹구고 반복

도움이 되었기를 바랍니다.


이것은 훌륭한 설명입니다. 나는 항상 유전자 알고리즘이 다윈 알고리즘 또는 진화 알고리즘으로 더 잘 묘사되었다고 생각했지만, "유전"은 확실히 그 역학을 더 잘 묘사합니다 (전체적인 아이디어가 아니라면). 나는 그들을 다윈의 유전자 알고리즘이라고 부를 것이다.
Steven Lu

Conway의 인생 게임은 유전자 알고리즘입니까?
Florian Margaine

@Florian Margaine : 삶의 게임은 무관 한 개념 인 셀룰러 오토 마톤입니다 (생명의 게임은 전적으로 결정 론적이며 GA는 확률 론적이라는 사실에서 시작).
scrwtp

1
이것은 내가 들어 본 GA에 대한 가장 좋은 단일 설명입니다. 나는 과거에 여러 차례에 걸쳐 언급 된 유전자 알고리즘을 보았는데, 일반적으로 외식 성 외식 술을 받았지만, 지금까지 그들이 실제로 무엇인지 이해하지 못했습니다. 감사!
Locke

GA 학습을 처음 시작할 때이 설명을 보셨 으면 좋겠습니다.
Avrohom Yisroel

7

문제에 대한 솔루션을 비트 열로 인코딩

인코딩 된 솔루션에 비트 스트링이 제공되는 방법을 평가하는 함수 ( "피트니스"함수라고 함)를 작성하십시오. 결과는 일반적으로 0과 1 사이의 숫자입니다.

이 비트 스트링을 무작위로 생성하고 적합성을 평가합니다.

일반적으로 더 적합한 묶음을 선택하고 절반으로 자르고 반을 바꿔 새로운 비트 문자열을 만듭니다 (크로스 오버)

때로는 새로운 비트 열 중 일부에서 무작위로 몇 비트를 뒤집습니다 (돌연변이).

좋은 솔루션이 진화 할 때까지 반복

이유 : 일부 문제에는 가능한 솔루션 공간이 너무 커서 모든 가능성을 평가하는 것이 비현실적입니다 (참조 Traveling Salesman Problem)

검색, 최적화 및 기계 학습에서 유전자 알고리즘 책을 강력히 추천합니다.


"Genetic Algorithms"에 대한 아마존 검색에서 4 페이지 분량의 자료를 얻었습니다. 첫 페이지 만 보았지만 "Genetic Algorithms"라는 제목의 책은 없었습니다. 책의 전체 제목 및 저자와 같은 세부 정보를 제공 할 수 있습니까?
David Thornley

도전 과제 : 답변을 유전자 알고리즘으로 다시 작성하십시오. [-:
매우 바보 같은

@David 링크 추가; 1989 년에 출판되었으므로 지금 더 나은 것들이있을 수 있지만 이것도 잘 설명되어 있습니다
Steven A. Lowe

1
@veryfoolish : 먼저, 질문을 경계가 이산 된 공간 솔루션으로 재 설명하십시오
Steven A. Lowe

@David Genetic 알고리즘은 인공 지능에 관한 더 큰 책에서 한 장 또는 두 장이 될 것입니다.
베리 브라운

6

유전자 프로그래밍은 컴퓨터가 프로그램을 작성하도록하는 방법입니다!

MS Word와 같은 "프로그램"을 생각하지 말고 "프로그램"을 다음과 같이 생각하십시오.

function(x){ return x*2; }

이 기능 (또는 프로그램) 자체에는 존재하는 이유가 없습니다. 우리는 문제에 대한 해결책을 찾고 있습니다. 두 숫자의 합을 찾아야하는 경우 계산기를 열고 수학을 수행하면됩니다. 누군가가 당신에게 다음 표를 준 사이의 관계를 알아 내기 위해 당신이 무엇을 요구하는 경우 resultxy:

x   y   result
99  1   (3.02)
79  88   2.01 
21  62   5.01 
84  52  (6.58)
12  70   5.54 
67  18   0.73 

이 데이터는 "훈련"데이터입니다. 컴퓨터는이 데이터를 사용하여 일부 가설을 생성 한 다음 실제 데이터와 비교하여 테스트합니다.

통계를 모르고이 문제를 스스로 파악하기가 너무 어렵다고 판단하면 컴퓨터에서 알아낼 수 있습니다.

컴퓨터가 무작위로 추측하기

컴퓨터가 백만 개의 응답을 생성하고 그 중 하나가 고착되는지 확인하십시오 (추측 ... 백만 번!). 다음은 몇 가지 추측의 예입니다.

function(x,y){ return x+y; } // wrong
function(x,y){ return x/1*1*1*1*1*1+y; } //wrong, silly

이것을 알 수도 있고 알지 못할 수도 있지만 함수 나 프로그램도 트리로 표시 될 수 있습니다. 예를 들어 두 번째 함수는 다음과 같습니다.

(+ (/ x (* 1 (* 1 (* 1 (* 1 (* 1 1)))) y)

들여 쓰기하여 나무처럼 보이게 만들 수 있습니다 (btw, 리버스 폴란드어 표기법 및 lisp 구문을 찾으십시오 ... 그러나 우리가 이와 같은 프로그램을 왜 짧은 시간에 나타내는 지 이해할 것입니다).

(+ 
    (/ x 
        (* 1 
            (* 1 
                (* 1 
                    (* 1 
                        (* 1 1)))) 
    y)

( +두 가지의 "잎"과 상단에 /y. /자체 등 여러 명의 아이들이있다)

이것이 유전자 프로그래밍에서 "나무"에 대해 많은 것을 읽는 이유입니다. 어떤 경우에, 우리는의 값을 연결 x하고 y이 기능으로 그것은 우리에게 잘못된 대답을 제공합니다. 우리가 이것을 무작위로 생성했기 때문에 놀라운 것은 아닙니다.

이제 백만 개의 그러한 솔루션을 생성하기로 결정했습니다. 그들 모두 잘못되었습니다. 그러나 일부 답변은 다른 답변보다 정답에 더 가깝습니다. 다시 말해 일부 솔루션은 다른 솔루션보다 "적합"합니다. 컴퓨터는 "올 바르고"잘못된 것이 무엇인지 알지 못하므로 자신 만의 "피트니스 기능"을 제공해야합니다. 이 기능은 잠재적 인 솔루션, 교육 데이터를 전달받으며 GP 시스템에이 솔루션이 얼마나 "적합한"지 알려주는 역할을합니다. 아시다시피이 기능은 수백만 번 실행됩니다.

GP가 다른 이유

다음은 유전자 프로그래밍이 거친 추측과 다른 점입니다. 백만 번 더 추측하기로 결정합니다. 그러나 좀 더 지능적으로 수행합니다. 추측의 상위 10 % (실제 값에 가까운 추측)를 가져 와서 2 세대의 일부로 만듭니다. 또한이 솔루션들 중 다수 (아마도 동일한 10 % ... 나는 기억하지 못함)를 취하여 "혼합"하기로 결정합니다.

두 가지 솔루션을 임의로 선택하고 하위 트리를 임의로 선택하여 교환을 시작합니다. 따라서 솔루션 A의 일부는 솔루션 B 아래에 있으며 그 반대도 마찬가지입니다. 또한 일부 솔루션을 가져 와서 간단히 "돌연변이"합니다. 하위 트리를 가져 와서 약간 '나사'(솔루션이 끔찍한 경우 '아무 이유없이 나사를 조이면'실제로 개선 될 수 있습니다).

이것을 생각하는 좋은 방법은 다음과 같습니다. 엄마와 아빠는 머리 색깔, 키, 질병 가능성 등과 같은 특정 특성을 가지고 있습니다. 자녀로서, 부모는 부모와는 다른 특성을 상속받습니다. 부모님 둘 다 올림픽 운동 선수라면 슈퍼 운동 선수가 되겠습니까? 글쎄, 생물 학자, 사회 학자, 심지어 역사가 조차도이 아이디어와 관련이있을 수 있지만 컴퓨터 과학자들은 여기에서 유생 학의 도덕에 관심이 없습니다. 그들은 방금 "시스템"이 솔루션을 제공하는 훌륭한 일을하는 것을 보았으므로 소프트웨어로 모델링하기로 결정했습니다.

그것이 실제로 생물학과 일치하지는 않지만 여전히 좋은 대답을 제공한다면 ... 많은 컴퓨터 과학자들은 "어떤 사람이든, 용어에 감사합니다"라고 통칭합니다. 또한 모든 형제 자매들, 심지어 정확히 같은 것은 아닙니다. 심지어 같은 부모를 통해서도 마찬가지입니다. 각 사람은 어떤 이유로 든 돌연변이시키는 유전자를 가지고 있습니다 (생물 학자에게 이것을 보여주지 말아야합니다. 요점은 많은 용어 뒤에있는 동기를 이해하는 것입니다).

이제 컴퓨터가 수백만 개의 프로그램을 생성하고 체력을 측정하게되었습니다. 최고의 솔루션은 차세대에도 살아남습니다. 우리는 또한 "돌연변이"하고 "인구"에 대해 교차를한다 (유전학과 생물학의 언어가 어떻게 사용되는지 주목하라). 2 세대가 생성되면 피트니스가 다시 측정됩니다. 이 세대는 이전 세대의 최상의 솔루션을 가지고 있으며 우리는 최고의 솔루션을 넘어서서 변형 시켰습니다 (일반적인 인구와 함께-다양성 유지).이 세대는 적어도 이전 세대보다 조금 나아야합니다.

우리는 이것을 매우 많은 세대에 걸쳐 계속합니다. 올바른 답변을 얻을 때까지 각 세대는 (더욱 희망적으로) 더 나은 솔루션을 제공합니다. 예를 들면 다음과 같습니다.

(+ (- 2.2 (/ x 11) (* 7 (cos y))))

이것 좀 봐, 맞아!
( http://en.wikipedia.org/wiki/Genetic_programming 에서 복사 했으며이 트리의 그래픽 표현도 있습니다)

잡동사니

+, -, *, /, cos, sin, tanGP 시스템에서 사용할 수 있는 "터미널"( ) 을 결정하는 방법, 피트니스 기능을 작성하는 방법 및 시스템이 ( (1 + cos)또는 (2 / "hello")다른 많은 것들 과 같은) 중요하지 않은 프로그램을 처리하는 방법과 같은 중요한 문제 가 있습니다 .

방정식을 진화시키는 것은 지루합니다. 터미널 세트가 (화재, 적 감지, 이동 등 ...)과 같으면 피트니스 기능이 건강과 무술 괴물의 시체 수를 측정합니다.

나는 이것을 메모리에서 대부분 썼지 만 이것이 기본 아이디어입니다. 나는 대학 시절에 약간의 GP를했다. 당신은 분명히 그것을 가지고 놀아야합니다. 모든 용어를 이해하는 것에 대해 걱정하지 말고, 무료 GP 시스템을 다운로드하고, 몇 가지 예를 통해 느낌을 얻고 자신의 흥미로운 예를 구성하십시오 (다른 데이터 세트 간의 관계 찾기, 게임에 연결하려고 시도하십시오) API 등)


1

가장 적합한 생존 : Windows Forms를 사용한 자연스러운 선택은 유전자 프로그래밍을 소개하는 방법이었습니다. 다운로드 가능한 코드로 쉽게 읽을 수 있습니다. 단점은 GP는 런타임에 생성 된 코드를 실행하는 수단을 필요로하며, 기사를 작성할 당시 C #은이 작업에 적합하지 않다는 것입니다. 그렇기 때문에이 예제에서는 CodeDOM을 사용하여 런타임에 코드를 생성, 컴파일 및 실행하는 데 그 자체로 또 다른 복잡성이 추가됩니다.

그 이후로 .NET에서 이제는 ExpressionTree API가 자체적으로 변경되어 기사에서 설명한 것보다 C #에서보다 우아한 GP 구현이 가능합니다. 그러나 GP의 작동 방식을 이해하기에 충분합니다.

GP에서 무료 전자 책을 다운로드 할 수 있으며 여기 에는 매우 짧은 자바 코드 예제도 포함되어 있습니다.


-1

유전자 알고리즘과 유전자 프로그래밍은 서로 관련이 있지만 개념은 다릅니다.

유전자 알고리즘 (GA)은 복잡한 최적화 문제에 대한 검색 알고리즘입니다. GA에서 솔루션의 매개 변수를 "DNA"비트 스트링의 일부 문제로 인코딩 한 다음이 비트 스트링을 무작위로 번식시킵니다. 일부를 조합하여 재생성하고 모든 비트 스트링을 삭제하여 "적합한 생존"을 적용합니다. 문제를 해결하는 데 가장 적합한 것을 제외하고 있습니다.

유전자 프로그래밍 (GP)은 훨씬 더 복잡합니다. 여기서는 DNA (비트 스트링)로 프로그램을 나타내지 않고 번식하고 선택한 트리를 구문 분석하여 프로그램을 나타냅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.