유전자 알고리즘 / 유전자 프로그래밍 솔루션의 좋은 예는 무엇입니까? [닫은]


227

유전자 알고리즘 (GA)과 유전자 프로그래밍 (GP)은 흥미로운 연구 분야입니다.

GA / GP를 사용하여 해결 한 특정 문제와 자신이 롤하지 않은 경우 사용한 라이브러리 / 프레임 워크에 대해 알고 싶습니다.

질문 :

  • GA / GP를 사용하여 어떤 문제를 해결 했습니까?
  • 어떤 라이브러리 / 프레임 워크를 사용 했습니까?

직접적인 경험을 찾고 있습니다. 그러지 않는 한 대답하지 마십시오.


28
@Jason : Google에 제안 해 주셔서 감사합니다. 다소 유용하지만 GA / GP 경험이있는 SO 사용자를 특별히 다루기 때문에이 질문에 어떻게 대답 할 수 있는지 알 수 없습니다.
knorv


13
"우리는 답변이 ... 특정 전문 지식에 의해 지원 될 것으로 기대합니다 ...."Check! "그의 질문은 토론, 논쟁, 여론 조사 또는 광범위한 토론을 요구할 것입니다." 그릇된. 많은 답변이 있지만 여론 조사는 아니며 의견에 대한 의견이나 토론이 많지 않습니다. 왜 폐쇄 되었습니까?
Adrian McCarthy

Eureqa 프로그램은 유전자 프로그래밍에 매우 유용합니다 : nutonian.com/products/eureqa
Simon

답변:


146

숙제가 아닙니다 .

전문 프로그래머 (1995)로서의 첫 직업은 S & P500 선물을위한 유전자 알고리즘 기반의 자동 거래 시스템을 작성하는 것이 었습니다. 이 응용 프로그램은 Visual Basic 3 [!]로 작성되었으며 VB3에는 클래스가 없기 때문에 내가 당시에 어떤 일을했는지 ​​전혀 모른다.

이 응용 프로그램은 무작위로 생성 된 고정 길이 문자열 ( "유전자"부분)로 시작했습니다. 각 문자열은 S & P500 선물의 분당 가격 데이터의 특정 형태와 특정 순서에 해당합니다. (매수 또는 매도) 및 손절매 및 손질 이익 금액. 각 문자열 (또는 "유전자")은 3 년간의 과거 데이터를 통해 수익 성능을 평가했습니다. 지정된 "모양"이 과거 데이터와 일치 할 때마다 해당 구매 또는 판매 주문을 가정하고 거래 결과를 평가했습니다. 나는 각 유전자가 정해진 금액의 돈으로 시작하여 잠재적으로 파산되어 유전자 풀에서 완전히 제거 될 수 있다는 경고를 덧붙였다.

모집단의 각 평가 후, 생존자들은 무작위로 (두 부모로부터 비트를 혼합함으로써) 무작위로 교배되었고, 유전자로 생성 된 이익에 비례하여 부모로 유전자가 선택 될 가능성이있었습니다. 나는 또한 점 돌연변이가 일을 조금 돋보이게 할 가능성을 추가했습니다. 이것의 수백 세대 후에, 나는 사망 / 파산의 가능성없이 (물론 역사적 데이터에서) 5000 달러를 평균 약 10000 달러로 바꿀 수있는 유전자 집단으로 끝났다.

불행히도, 상사는 전통적인 방식으로 거래하는 3 개월 이내에 $ 100,000에 가까운 손실을 입었고 프로젝트를 계속할 의지를 잃었 기 때문에이 시스템을 실제로 사용할 기회를 얻지 못했습니다. 돌이켜 보면 필자는 시스템이 반드시 올바른 일을했기 때문이 아니라 내가 생산 한 유전자 집단이 (주문 판매와는 반대로) 구매 주문에 대해 약 5 분 정도 편향되어 있었기 때문에 막대한 이익을 얻었을 것이라고 생각합니다. 1 비율. 우리가 20/20의 뒤늦은 통찰력으로 알고 있듯이 시장은 1995 년 이후 약간 상승했습니다.


9
"시스템이 막대한 수익을 올렸을 것이라고 생각합니다."-백 테스팅 환경에서 완벽하게 작동 할 것입니다. ;-)
Joel

30
@Joel : 물론 그렇습니다. 그러나 그것이 수익성이 있다고 생각한 이유는 아닙니다. 그것은 판매 대신 구매에 대한 강한 편견 때문에 돈을 벌었을 것입니다. 1995 년에서 1999 년 사이에 임의의 시간에 S & P500 선물을 매수 한 시스템 (GA의 말도 안되는 일이 발생하지 않았 음)은 엄청난 돈을 벌었을 것입니다.
MusiGenesis

10
Joel은 아마도 "과적 합"을 언급했을 것입니다.
Eric Normand

10
테스트를 위해 약간의 과거 데이터를 예약해야합니다. 교차 검증이 가장 좋습니다.
Eric Normand

에서 "모양"은 무슨 뜻 each of which corresponded to a specific shape in the minute-by-minute price data입니까?
CodyBugstein

89

나는이 작은 세상에서 살았던 작은 동물들을 만들었습니다. 그들은 신경망 뇌를 가지고 있었는데 그것은 세계로부터 어떤 입력을 받았으며 그 출력은 다른 행동들 사이의 움직임을위한 벡터였습니다. 그들의 두뇌는 "유전자"였다.

이 프로그램은 무작위 뇌를 가진 무작위 동물 집단으로 시작되었습니다. 입력 및 출력 뉴런은 정적이지만 그 사이에 있었던 것은 그렇지 않았습니다.

환경에는 음식과 위험이있었습니다. 음식은 에너지를 증가시키고 충분한 에너지가 있으면 짝짓기를 할 수 있습니다. 위험으로 인해 에너지가 줄어들고 에너지가 0이면 사망했습니다.

결국 생물은 전 세계를 이동하고 음식을 찾고 위험을 피하도록 진화했습니다.

그런 다음 약간의 실험을하기로 결정했습니다. 나는 생물의 뇌에 "입"이라는 출력 뉴런과 "귀"라는 입력 뉴런을 주었다. 다시 시작하여 공간을 최대화하기 위해 진화했으며 각각의 생물이 각자의 부분에 머물렀다는 사실에 놀랐습니다 (음식은 무작위로 배치되었습니다). 그들은 서로 협력하고 서로를 방해하지 않는 법을 배웠습니다. 항상 예외가있었습니다.

그런 다음 흥미로운 것을 시도했습니다. 죽은 생물은 음식이 될 것입니다. 무슨 일이 있었는지 추측 해보세요! 두 종류의 생물이 진화했습니다. 하나는 떼처럼 공격하고 다른 하나는 피하는 것이 좋습니다.

그럼 여기서 교훈은 무엇입니까? 의사 소통은 협력을 의미합니다. 다른 사람을 다치게하는 것이 무언가를 얻는 것을 의미하자마자 협력이 파괴됩니다.

이것이 자유 시장과 자본주의 시스템에 어떻게 반영되는지 궁금합니다. 기업이 경쟁을 해칠 수 있고 경쟁에서 벗어날 수 있다면 , 경쟁을 해칠 수있는 모든 힘을 다할 것입니다.

편집하다:

프레임 워크를 사용하지 않고 C ++로 작성했습니다. 내 신경망과 GA 코드를 작성했습니다. 에릭, 그럴듯한 말을 해줘서 고마워 사람들은 보통 GA의 힘을 믿지 않습니다 (제한은 분명하지만). GA는 단순하지만 단순하지는 않습니다.

의심의 여지없이 신경망은 하나 이상의 레이어가있는 경우 모든 기능을 시뮬레이션 할 수있는 것으로 입증되었습니다. GA는 로컬 및 잠재적으로 최소값을 찾는 솔루션 공간을 탐색하는 매우 간단한 방법입니다. GA를 신경망과 결합하면 일반적인 문제에 대한 대략적인 솔루션을 찾는 함수를 찾을 수 있습니다. 우리는 신경망을 사용하기 때문에 다른 입력이 GA를 사용할 때 함수에 대한 입력이 아니라 일부 입력에 대한 함수를 최적화하고 있습니다

다음은 생존 예제의 데모 코드입니다. http://www.mempko.com/darcs/neural/demos/eaters/ 빌드 지침 :

  • darcs, libboost, liballegro, gcc, cmake, make 설치
  • darcs clone --lazy http://www.mempko.com/darcs/neural/
  • cd neural
  • cmake .
  • make
  • cd demos/eaters
  • ./eaters

먹는 사람 Screenshot


10
이 이야기와 함께 튜링상은 어디에 있습니까? RoadRunner 이외의 다른 기기에서도 이러한 실험을 수행하려면 과학에서 약간의 발전이 있어야합니다.
San Jacinto

1
에릭과 동의. 한 시간 안에 간단한 NN을 작성할 수 있으며 (실제로 시험을 보았습니다) 기본 GA는 반드시 하루나 이틀 이상의 작업이 아닙니다. 이것은 유전자 알고리즘보다 A-Life 알고리즘에 가깝지만 여기서는 매우 간단하고 실행 가능한 것들에 대해 이야기하고 있습니다.
Kylotan

2
신입생 년이 지난 여름, 나는 C #에서 XNA를 사용하여 신경망을 빼고 GA를 사용하고 다양한 특성을 가진 생물 군집을 사용하여 이것과 매우 유사한 funsies 프로젝트를 만들었습니다. . 예를 들어, 하나의 유전자가 시력을 조절했습니다. 더 높은 시력, 더 ​​넓은 시력 반경을 의미합니다. 장애물과 음식은 무작위로 배치되며 생물은 음식을 먹음으로써 에너지를 보충합니다. 특성은 무작위로 생성 된 가우시안 수를 그들에 추가하여 돌연변이를 일으켜 실제 진화에서와 같이 정상적으로 분포 된 유전자를 생성합니다.
Philip Guin

2
저는 이런 종류의 일 (ALife)이 사람들이 매일하는 일인 연구 그룹에서 일합니다. 당신의 이야기는 완전히 믿을 수 있고, 솔직히 말해서 나는 그것이 누군가가 그것이 가짜라고 생각할 것이라는 것을보고 약간 충격을 받았습니다. 다시 말하지만, 보통 그것들을 수행하는 요점은 복잡한 행동이 매우 간단한 시스템에서 발생할 수 있다는 점을 지적하는 것입니다. 요점은 충분하지 않다고 생각합니다.
Lucas

1
나는 그의 웹 사이트에서 몇 가지 증거를 발견했다. 예제 코드는 다음과 같습니다. mempko.com/darcs/neural/demos/eaters
guerda

51

2004 년 1 월 필자는 필립스 New Display Technologies와 접촉하여 최초의 상업용 e- 잉크 용 전자 제품을 제작 한 Sony Librie (아마존 킨들과 다른 사람들이 미국에서 시장에 출시하기 몇 년 전에 일본에서만 출시 된) 유럽.

필립스 엔지니어에게는 큰 문제가있었습니다. 제품이 시장에 출시되기 몇 달 전에 페이지를 변경할 때 여전히 화면에 고스트 현상이 발생했습니다. 문제는 정전기 장을 생성하는 200 명의 드라이버였습니다. 이 드라이버 각각에는 0에서 1000mV 또는 이와 비슷한 값으로 설정해야하는 특정 전압이 있습니다. 그러나 그 중 하나를 변경하면 모든 것이 변경됩니다.

따라서 각 드라이버의 전압을 개별적으로 최적화하는 것은 의문의 여지가 없었습니다. 가능한 값 조합 수는 수십억 개였으며, 특수 카메라가 단일 조합을 평가하는 데 약 1 분이 걸렸습니다. 엔지니어들은 많은 표준 최적화 기술을 시도했지만 아무 것도 근접하지 않았습니다.

이전에 오픈 소스 커뮤니티에 유전자 프로그래밍 라이브러리를 출시했기 때문에 헤드 엔지니어가 저에게 연락했습니다. 그는 GP / GA가 도움이 될지, 참여할 수 있는지 물었습니다. 나는 한 달 동안 함께 일하면서 GA 라이브러리를 작성하고 조정하여 합성 데이터를 작성하고 시스템에 통합했습니다. 그러다가 어느 주말에 그들은 진짜로 라이브로 운영하게했습니다.

다음주 월요일에 나는 그와 그의 하드웨어 디자이너로부터이 빛나는 이메일을 받았는데, 아무도 GA가 찾은 놀라운 결과를 어떻게 믿을 수 없었는지에 대해 이야기했다. 이게 다야 그해 말에 제품이 시장에 출시되었습니다.

나는 그것에 대해 1 센트를 지불받지 못했지만 '흔들리는'권리를 얻었습니다. 그들은 처음부터 이미 예산이 초과되어 있다고 말 했으므로 거래를 시작하기 전에 거래가 무엇인지 알았습니다. 그리고 그것은 GA의 응용에 대한 좋은 이야기입니다. :)


23
"예산 초과"는 말이 많다. 물론 그들은 당신에게 돈을 지불했지만 돈을 지불하지 않았습니다. 정말 대기업이 멋진 프로그래머를 활용할 수있는 방법을 보여줍니다.
Martin Capodici

50

결혼식 피로연에서 좌석 배정을 최적화하기 위해 GA를 사용했습니다. 10 인용 테이블 80 명. 평가 기능은 사람들과 데이트를 유지하고, 공통점이있는 사람들을 모으고, 반대의 견해를 가진 사람들을 별도의 테이블에 두는 것을 기반으로했습니다.

나는 그것을 여러 번 달렸다. 매번 나는 9 개의 좋은 테이블과 1 개의 홀수 공을 얻었다. 결국 아내는 자리를 맡았습니다.

여행하는 세일즈맨 최적화 프로그램은 염색체를 일정에 매핑하는 새로운 방법을 사용하여 잘못된 투어를 생성 할 위험없이 염색체를 번식시키고 돌연변이시키는 것이 쉽지 않았습니다.

최신 정보 : 두 사람이 어떻게 물 었는지 ...

알파벳 순서와 같이 임의의 일관된 순서로 여러 게스트 (또는 도시)로 시작합니다. 이것을 참조 솔루션이라고합니다. 손님의 색인을 좌석 번호로 생각하십시오.

이 순서를 염색체에서 직접 인코딩하는 대신 참조 솔루션을 새로운 솔루션으로 변환하기위한 지침을 인코딩합니다. 구체적으로, 우리는 염색체를 배열에서 교환 할 인덱스 목록으로 취급합니다. 염색체를 해독하기 위해 참조 솔루션으로 시작하여 염색체로 표시된 모든 스왑을 적용합니다. 배열에서 두 항목을 바꾸면 항상 유효한 솔루션이됩니다. 모든 손님 (또는 도시)은 여전히 ​​정확히 한 번 나타납니다.

따라서 염색체는 무작위로 생성, 돌연변이 및 다른 염색체와 교차 할 수 있으며 항상 유효한 솔루션을 생성합니다.


그 소설 매핑은 무엇입니까?
Manuel Aráoz 2019

4
@Manuel : 투어를 "염색체"로 직접 인코딩하는 대신 참조 투어를 솔루션으로 변환하는 변환을 인코딩했습니다. 변환은 인덱스의 도시 간을 바꾼 것입니다. 따라서 어떤 방식 으로든 재결합 할 수 있으며 항상 모든 도시를 정확히 한 번 방문하는 투어를 생성합니다.
Adrian McCarthy

감사! 나는 스와핑 측면과 약간 혼동됩니다. 각 염색체는 교환 할 색인 목록을 인코딩합니다. 이는 염색체에 색인이 두 번 이상 나타날 수 있음을 의미하지 않습니까?
user3019612

1
Chomosome에는 인덱스 c1, c2, c3, ..., cn이 있습니다. "솔루션"은 배열 a입니다. 참조 목록으로를 초기화하십시오. 그런 다음 염색체의 각 색인 쌍에 대해 용액의 두 요소를 교환하십시오 ( temp = a[c1]; a[c1] = a[c2]; a[c2] = temp). 두 개의 색인이 동일한 지 여부는 중요하지 않습니다. 왜냐하면 여전히 모든 손님 (또는 도시)을 정확히 한 번 포함하기 때문입니다.
Adrian McCarthy

33

저는 금 알고리즘이 도난당한 신용 카드를 사용하여 MMO를 지불하지 못하도록하는 위험 관리 시스템에 대한 최상의 설정을 결정하기 위해 유전자 알고리즘 (및 관련 기술)을 사용했습니다. 시스템은 "알려진"값 (사기 여부)을 가진 수천 건의 트랜잭션을 수행하고 잘못된 설정을 너무 많이하지 않으면 서 사기 거래를 올바르게 식별하는 가장 좋은 설정 조합이 무엇인지 알아냅니다.

우리는 거래의 수십 (부울) 특성에 대한 데이터를 가지고 있으며, 각각의 가치가 부여되고 합산되었습니다. 총계가 임계 값보다 높으면 거래가 사기였습니다. GA는 많은 수의 임의의 값 집합을 생성하고 알려진 데이터 모음을 기준으로 평가하고 가장 높은 점수를 얻은 값을 선택 (사기 탐지 및 오 탐지 수 제한) 한 다음 각 세대마다 새로운 세대의 후보자를 배출합니다. 특정 세대에 이어 최고 점수의 가치가 승자로 간주되었습니다.

테스트 할 알려진 데이터의 모음을 만드는 것은 시스템의 아킬레스 건입니다. 지불 거절을 기다리는 경우 사기꾼에 응답하려고 할 때 몇 개월이 지났으므로 누군가가 너무 오래 기다리지 않고 많은 양의 트랜잭션을 수동으로 검토하여 해당 데이터 모음을 작성해야합니다.

이로 인해 대부분의 사기 행위가 식별되었지만, 사기 행위가 많은 항목에서 1 % 미만으로 얻을 수 없었습니다 (수신 거래의 90 %가 사기 행위 일 수 있음).

나는이 모든 것을 펄을 사용하여했다. 상당히 오래된 리눅스 박스에서 소프트웨어를 한 번 실행하려면 1-2 시간이 걸린다 (WAN 링크를 통해 데이터를로드하는 데 20 분, 나머지는 크 런칭하는 데 걸린 시간). 주어진 세대의 크기는 사용 가능한 RAM에 의해 제한되었습니다. 매개 변수를 약간 변경하여 반복해서 실행하여 특히 좋은 결과 집합을 찾았습니다.

결국 수십 가지 사기 지표의 상대적인 값을 수동으로 조정하려고 시도한 일부 기린을 피하고 손으로 만들 수있는 것보다 더 나은 솔루션을 지속적으로 제시했습니다. AFAIK, 그것은 여전히 ​​사용 중입니다 (내가 쓴 후 약 3 년).


신경망을 사용하여 매개 변수 조정을 수행 할 수 있다고 생각합니다 (수동으로하는 것보다 효과가 더 오래 걸리지 만).
alexpinho98

21

축구 팁. AFL (Aussie Rules Football) 게임의 주별 결과를 예측하기 위해 GA 시스템을 구축했습니다.

몇 년 전에 나는 표준 작업 축구 수영장에 지루 해졌고, 모두가 온라인으로 가고 언론의 일부 전문가에게서 선택을하고있었습니다. 그래서 방송 저널리즘 전공을 이기기가 너무 어려울 것 같지 않습니까? 나의 첫 번째 생각은 Massey Ratings 의 결과를 얻은 다음 시즌 말에 명성과 영광을 얻은 후 내 전략을 공개하는 것이 었습니다. 그러나 내가 결코 발견하지 못한 이유로 Massey는 AFL을 추적하지 않습니다. 저의 냉소는 각 AFL 게임의 결과가 기본적으로 무작위 기회가 되었기 때문에 최근에 일어난 규칙 변경에 대한 불만은 다른 포럼에 있다고 생각합니다.

이 시스템은 기본적으로 공격 강도, 방어 강도, 홈 필드 이점, 주별 개선 (또는 부족) 및 각각의 변화 속도를 고려했습니다. 이것은 시즌 동안 각 팀에 대해 다항식 방정식을 만들었습니다. 주어진 날짜에 대한 각 경기의 승자와 점수를 계산할 수 있습니다. 목표는 모든 과거 게임의 결과와 가장 일치하는 계수 세트를 찾고 다가오는 주 게임을 예측하는 데 사용하는 계수 세트를 찾는 것이 었습니다.

실제로이 시스템은 과거 게임 결과의 90 % 이상을 정확하게 예측 한 솔루션을 찾습니다. 그런 다음 다가오는 주 (훈련 세트에없는 주) 동안 약 60-80 %의 게임을 성공적으로 선택합니다.

결과 : 팩 중간 바로 위. 베가스를 이길 수있는 주요 상금이나 시스템은 없었습니다. 그래도 재미 있었다.

프레임 워크를 사용하지 않고 처음부터 모든 것을 만들었습니다.


21

Traveling Salesman 및 Roger Alsing의 Mona Lisa 프로그램 변형과 같은 몇 가지 일반적인 문제뿐만 아니라 진화하는 스도쿠 솔버 도 작성 했습니다. (다시 구현하는 것이 아니라 내 생각에 좀 더 독창적 인 생각이 필요했습니다. 다른 사람의 아이디어). 스도쿠를 해결하기위한보다 신뢰할 수있는 알고리즘이 있지만 진화 적 접근 방식은 상당히 효과적입니다.

지난 며칠 동안 나는 이 기사를 본 후 포커를위한 "콜드 데크"를 찾기위한 진화적인 프로그램을 가지고 놀았습니다. Reddit 를 . 현재로서는 만족스럽지 않지만 향상시킬 수 있다고 생각합니다.

내가 가진 내 자신의 프레임 워크 내가 진화 알고리즘 사용하는 것이 있습니다.


17

회사가 1992 년화물 산업을 위해 개발 한 3D 레이저 표면 프로파일 시스템을위한자가 추출 GA를 개발했습니다.이 시스템은 3 차원 삼각 측량에 의존하고 512x512 카메라 (맞춤 캡처 hw 포함) 맞춤형 레이저 라인 스캐너를 사용했습니다. 카메라와 레이저 사이의 거리는 정확하지 않았으며 카메라의 초점은 256,256 위치에서 찾을 수 없었습니다!

표준 지오메트리와 시뮬레이션 된 어닐링 스타일 방정식 해석을 사용하여 교정 매개 변수를 시도하고 해결하는 것은 악몽이었습니다.

저녁에 유전자 알고리즘을 채웠고 테스트를 위해 교정 큐브를 만들었습니다. 큐브 크기를 고정밀 도로 알고 있었기 때문에 GA가 생산 편차를 극복 할 각 스캔 장치에 대해 사용자 정의 삼각 측량 매개 변수 세트를 발전시킬 수 있다는 아이디어가있었습니다.

트릭은 치료를했습니다. 나는 가장 말을 불쾌하게했다! 10 세대 내에서 '가상'큐브 (원시 스캔에서 생성되고 교정 매개 변수에서 재생성)는 실제로 큐브처럼 보였습니다! 약 50 대 후 교정이 필요했습니다.


11

집을 페인트 할 때 정확한 색상 조합을 얻는 것이 어려운 경우가 많습니다. 종종 색상을 염두에 두지 만 색상 중 하나가 아닌 경우 공급 업체가 표시합니다.

어제 GA 연구자 인 독일 교수는 독일의 실화에 대해 언급했습니다 (죄송합니다. 더 이상 언급 할 것이 없습니다. 요청이 있으면 찾을 수 있습니다). 이 사람 (그를 컬러 사람 이라고 부릅니다 )은 사람들 이 고객이 생각한 것과 가장 가까운 정확한 색상 코드 ( RGB ) 를 찾는 데 도움을주기 위해 문 에서 나갔습니다. 그가하는 방법은 다음과 같습니다.

색깔은 사람 그와 GA를 사용하는 소프트웨어 프로그램을 수행하는 데 사용. 그는 4 가지 색상으로 시작했습니다. 각 색상은 코딩 된 염색체 (디코딩 된 값이 RGB 값임)로 코딩되었습니다. 소비자는 4 가지 색상 중 하나를 선택합니다 (가장 가까운 것을 염두에 두십시오). 그런 다음 프로그램은 해당 개인 에게 최대 체력 을 할당하고 돌연변이 / 교차를 사용하여 다음 세대 로 넘어갑니다 . 소비자가 정확한 색상을 찾은 다음 컬러 녀석 이 RGB 조합을 알려주기 까지 위의 단계가 반복 됩니다!

색상에 최대 체력을 할당하면 소비자가 생각한 것과 가장 가깝게, 색상 담당자 의 프로그램은 색상에 수렴 할 가능성을 높이고 소비자는 정확하게 생각합니다. 나는 꽤 재미를 발견했다!

이제 -1을 얻었으므로 더 많은 -1을 계획하고 있다면 pls. 그렇게하는 이유를 분명히하십시오!


6
난 당신을 downvote하지 않을 것이지만, 당신이 직접하지 않았기 때문인 것 같아요. OP는 구체적으로 자신이 한 일을 요구했습니다.
jprete

이것은 Richard Dawkins의 생체 변형의 단순화 된 버전입니다.
Nick Johnson

1
색상에 대한 재미있는 점은 색상 자체를 고려할 수 없다는 것입니다. 색상 컨설턴트는 단 하나의 색상으로 나타나지 않으며 팔레트와 구성표로 제공됩니다. 하나의 색상 만 선택해도 아무런 의미가 없습니다. 나는 공감하지 않았지만 당신의 대답은 GA의 정의를 확장하고 있습니다. 한 가지 색상을 어떻게 변경 / 교차합니까? 이것은 정직하게 제한된 데이터 세트를 좁히는 것을 보여줍니다.
커크 브로드 허스트

2
이것은 아마도 downvotes를 설명 할 수 있습니다. 이것은 GA가 아닌 언덕 등반과 비슷합니다.
Eric Normand

8

몇 주 전에 저는 그래프 레이아웃 문제를 해결하기 위해 유전자 알고리즘을 사용하여 SO에 대한 솔루션을 제안했습니다 . 제한된 최적화 문제의 예입니다.

또한 기계 학습 분야에서 처음부터 c / c ++로 GA 기반 분류 규칙 프레임 워크를 구현했습니다.
또한 유명한 역 전파 알고리즘 을 사용하는 대신 인공 신경망 (ANN) 을 훈련시키기 위해 샘플 프로젝트에서 GA 를 사용했습니다 .

또한 대학원 연구의 일환으로 GA를 EM 기반 Baum-Welch 알고리즘 (c / c ++에서 다시)에 대한 추가 접근법으로 Hidden Markov Models 교육에 GA를 사용했습니다 .


안녕하세요. backprop와 GA로 얻은 결과를 완전히 비교 했습니까? 그렇다면 비교 결과를 우리와 공유 할 수 있습니까? 두 명의 NN에 대한 크로스 오버 단계를 어떻게 구현 했습니까?
lmsasu

@lmsasu : 공상 없음 : 모집단의 각 문자열 또는 염색체는 네트워크의 가중치 및 바이어스 값을 나타내며 간단한 1 또는 2 포인트 크로스 오버 연산자가 사용되었습니다. 내가 기억하는 것에서 네트워크가 GA를 사용하여 훈련하는 데 오랜 시간이 걸렸습니다. 내 구현은 다른 것보다 개념 증명에 더 가깝습니다 ( 가상 지뢰 찾기를 제어하는 ​​장난감 예제는 여기 참조 ) ... 어쨌든 GA를 사용하여 가중치를 배우고 진화시킬 수있는 많은 논문이 있어야합니다. 네트워크 구조.
Amro

8

학부 CompSci 학위의 일환으로 우리는 Jikes 리서치 가상 머신을위한 최적의 jvm 플래그를 찾는 문제를 배정했습니다. 이것은 콘솔로 시간을 돌려주는 Dicappo 벤치 마크 제품군을 사용하여 평가되었습니다. 벤치 마크 스위트의 런타임을 개선하기 위해 이러한 플래그를 전환 한 분산 생식 알고리즘을 작성했지만 결과에 영향을 미치는 하드웨어 지터를 보상하는 데 며칠이 걸렸습니다. 유일한 문제는 컴파일러 이론에 대해 제대로 배우지 못했다는 것입니다 (이것은 과제의 의도였습니다).

기존의 기본 플래그를 사용하여 초기 모집단을 시딩 할 수 있었지만 흥미로운 점은 알고리즘이 O3 최적화 수준과 매우 유사한 구성을 발견했지만 실제로는 많은 테스트에서 더 빠르다는 것입니다.

편집 : 또한 할당을 위해 Python으로 자체 유전자 알고리즘 프레임 워크를 작성하고 popen 명령을 사용하여 다양한 벤치 마크를 실행했습니다. 평가 된 할당이 아닌 경우 pyEvolve를 보았을 것입니다.


7

우선, Jonathan Koza ( on amazon )의 "Genetic Programming" 은 유전자 및 진화 알고리즘 / 프로그래밍 기술에 관한 많은 책과 함께 많은 예제가 있습니다. 나는 그것을 확인하는 것이 좋습니다.

유전자 알고리즘을 사용하는 것에 관해서는 (집에서 자란) 유전자 알고리즘을 사용하여 객체 수집 / 파괴 시나리오를위한 무리 알고리즘을 발전 시켰습니다 (실제 목적은 지뢰밭을 비 웠을 수도 있습니다). 여기 에 종이에 대한 링크가 있습니다. 내가 한 일 중 가장 흥미로운 부분은 다단계 피트니스 기능이었습니다. 단순한 피트니스 기능은 인구 집단을 충분히 구별 할 수있는 유전자 알고리즘에 대한 충분한 정보를 제공하지 않았기 때문에 필수적이었습니다.


GP에 대한 Koza의 시리즈는 매우 조밀하며 GP를 처음 접하는 사람에게는 적합하지 않을 수 있습니다. Riccardo Poli의 유전자 프로그래밍에 대한 현장 가이드 (무료 HTML 사본으로 제공) 또는 Melanie Mitchell의 유전자 알고리즘 소개
아무도

7

기존 프로그램의 버그를 자동으로 수정하기 위해 EC (Evolutionary Computation) 사용을 조사하는 팀의 일원입니다. 실제 소프트웨어 프로젝트에서 다수의 실제 버그를 성공적으로 복구했습니다 ( 이 프로젝트의 홈페이지 참조 ).

이 EC 수리 기술은 두 가지 용도로 사용됩니다.

  • 첫번째 ( 프로젝트 페이지를 통해 사용 가능한 코드 및 재생산 정보 )는 기존 C 프로그램에서 구문 분석 된 추상 구문 트리를 발전시키고 자체 사용자 정의 EC 엔진을 사용하여 Ocaml에서 구현됩니다.

  • 두번째 (프로젝트에 개인적으로 기여한 프로젝트 페이지를 통해 사용 가능한 코드 및 재생산 정보 )는 여러 프로그래밍 언어로 작성된 프로그램에서 컴파일 된 x86 어셈블리 또는 Java 바이트 코드를 발전시킵니다. 이 응용 프로그램은 Clojure에서 구현되며 자체 맞춤형 EC 엔진도 사용합니다.

Evolutionary Computation의 좋은 점 중 하나는 기술의 단순성이 너무 많은 어려움없이 자신만의 맞춤형 구현을 작성할 수 있다는 것입니다. 유전자 프로그래밍에 대한 유용한 무료 입문 텍스트를 보려면 유전자 프로그래밍 필드 가이드를 참조하십시오 .


6

동료와 저는 회사에서 요구하는 다양한 기준을 사용하여화물을 트럭에 적재하기위한 솔루션을 개발하고 있습니다. 공격적인 가지 치기와 함께 Branch And Bound를 사용하는 동안 Genetic Algorithm 솔루션을 연구하고 있습니다. 우리는 여전히이 솔루션을 구현하는 과정에 있지만 지금까지 좋은 결과를 얻었습니다.


5

몇 년 전 저는 ga 's를 사용하여 인식률을 높이기 위해 asr (자동 음성 인식) 문법을 최적화했습니다. 나는 매우 간단한 선택 목록 (GA가 각 슬롯에 대해 가능한 용어 조합을 테스트하는 곳)으로 시작하여 더 개방적이고 복잡한 문법으로 나아갔습니다. 체음은 일종의 발음 거리 함수 하에서 용어 / 시퀀스 사이의 분리를 측정함으로써 결정되었다. 또한 문법에 약하게 동등한 변형을 만들어보다 간단한 표현으로 컴파일 된 것을 찾아 냈습니다 (결국 직접 알고리즘을 사용하여 응용 프로그램에서 사용할 수있는 "언어"의 크기를 크게 늘 렸습니다) .

최근에는 다양한 알고리즘에서 생성 된 솔루션의 품질을 테스트하기위한 기본 가설로 사용했습니다. 여기에는 분류 및 다양한 종류의 피팅 문제 (즉, 데이터 집합에 대해 검토자가 선택한 선택 사항을 설명하는 "규칙"생성)가 주로 포함되었습니다.


4

많은 문제를 해결하기 위해 'GALAB'이라는 완전한 GA 프레임 워크를 만들었습니다.

  • 중첩 및 공백 위치를 줄이기 위해 GSM ANT (BTS)를 찾습니다.
  • 자원 제한 프로젝트 일정.
  • 혁신적인 사진 제작. ( 이보 틱 )
  • 세일즈맨 여행 문제.
  • N- 퀸 & N- ​​컬러 문제.
  • 기사 여행 및 배낭 문제.
  • 매직 스퀘어 및 스도쿠 퍼즐.
  • 수퍼 스트링 문제에 따른 문자열 압축.
  • 2D 패키징 문제.
  • 작은 인공 생활 APP.
  • 루빅 퍼즐.

예, 소스는 내 GA 책에 게시되어 있습니다.
MShams

4

한 번은 GA를 사용하여 메모리 주소에 대한 해시 함수를 최적화했습니다. 주소는 4K 또는 8K 페이지 크기이므로 주소의 비트 패턴에서 약간의 예측 가능성을 보여주었습니다 (중요한 비트는 모두 0, 중간 비트는 정기적으로 증가하는 등). 원래 해시 함수는 "chunky"-클러스터 적중 경향이 있습니다. 세 번째 해시 버킷마다. 개선 된 알고리즘은 거의 완벽한 분포를 가졌습니다.


3

숙제가 중요한지 모르겠다 ...

공부하는 동안 Traveling Salesman 문제를 해결하기 위해 자체 프로그램을 시작했습니다.

아이디어는 몇 가지 기준 (문제, 성능 등을 매핑하기 어려움)을 비교하고 Simulated annealing 과 같은 다른 기술도 사용했습니다 .

꽤 잘 작동했지만 '복제'단계를 올바르게 수행하는 방법을 이해하는 데 시간이 걸렸습니다. 문제를 유전자 프로그래밍에 적합한 것으로 모델링하는 것이 실제로 가장 어려운 부분이었습니다.

우리가 신경망 등을 다루었 기 때문에 재미있는 코스였습니다.

누군가가 '프로덕션'코드에서 이런 종류의 프로그래밍을 사용했는지 알고 싶습니다.


3

음악이 재생 될 때 주파수 스펙트럼에서 유용한 패턴을 추출하기 위해 간단한 GA를 만들었습니다. 출력은 윈앰프 플러그인에서 그래픽 효과를 유도하는 데 사용되었습니다.

  • 입력 : 몇 개의 FFT 프레임 (2D 수레 배열을 상상)
  • 출력 : 단일 부동 소수점 값 (가중 입력 합계), 0.0 또는 1.0으로 임계 값
  • 유전자 : 입력 가중치
  • 피트니스 기능 : 합리적인 범위 내에서 듀티 사이클, 펄스 폭 및 BPM의 조합.

스펙트럼의 다른 부분과 다른 BPM 한계에 맞게 조정 된 GA가 몇 개 있었으므로 동일한 패턴으로 수렴하는 경향이 없었습니다. 각 모집단의 상위 4 개 출력은 렌더링 엔진으로 전송되었습니다.

흥미로운 부작용은 인구 전체의 평균 체력이 음악의 변화에 ​​대한 좋은 지표라는 것이었지만 일반적으로 그것을 알아내는 데 4-5 초가 걸렸습니다.


3

내 논문의 일부로 나는 진화 개념을 사용하는 GA 인 다중 목표 최적화 알고리즘 mPOEMS (진화 개선 단계를 통한 다중 목표 프로토 타입 최적화)에 대한 일반적인 Java 프레임 워크를 작성했습니다. 모든 문제 독립 부품이 문제 종속 부품과 분리 된 방식으로 일반적이며, 문제 종속 부품 만 추가하여 프레임 워크를 사용하도록 인터페이스가 제공됩니다. 따라서 알고리즘을 사용하려는 사람은 0부터 시작할 필요가 없으며 많은 작업을 용이하게합니다.

코드는 여기에서 찾을 수 있습니다 .

이 알고리즘으로 찾을 수있는 솔루션은 최신 알고리즘 인 SPEA-2 및 NSGA와의 과학적 작업에서 비교되었으며, 사용자의 메트릭에 따라 알고리즘이 비교할 수 있거나 더 나은 것으로 입증되었습니다 특히 측정하려는 최적화 문제에 따라 성능을 측정하십시오.

여기에서 찾을 수 있습니다 .

또한 논문 및 작업 증명의 일부로이 프레임 워크를 포트폴리오 관리에서 발견 된 프로젝트 선택 문제에 적용했습니다. 회사에 가장 큰 가치를 부여하거나 회사의 전략을 대부분 지원하거나 다른 임의의 목표를 지원하는 프로젝트를 선택하는 것입니다. 예를 들어 특정 카테고리에서 특정 수의 프로젝트 선택 또는 프로젝트 시너지 효과 극대화 ...

이 프레임 워크를 프로젝트 선택 문제에 적용하는 논문 : http://www.ub.tuwien.ac.at/dipl/2008/AC05038968.pdf

그 후 저는 포춘 500 대 중 한 곳의 포트폴리오 관리 부서에서 일하면서 프로젝트 선택 문제 / 포트폴리오 최적화에 GA를 적용한 상용 소프트웨어를 사용했습니다.

추가 자료 :

프레임 워크 문서화 : http://thomaskremmel.com/mpoems/mpoems_in_java_documentation.pdf

mPOEMS 프레젠테이션 용지 : http://portal.acm.org/citation.cfm?id=1792634.1792653

실제로 약간의 열정으로 모든 사람이 임의의 다목적 최적화 문제에 일반 프레임 워크의 코드를 쉽게 적용 할 수있었습니다.


2

직장에서 나는 다음과 같은 문제가 있었다 : M 개의 작업과 N 개의 DSP가 주어지면 DSP에 작업을 할당하는 가장 좋은 방법은 무엇입니까? "최고"는 "가장 많이로드 된 DSP의 부하 최소화"로 정의되었습니다. 서로 다른 유형의 작업이 있었으며, 다양한 작업 유형에 할당 된 위치에 따라 다양한 성능 저하가 있었으므로 작업 -DSP 할당 세트를 "DNA 문자열"로 인코딩 한 다음 유전자 알고리즘을 사용하여 "품종"했습니다. 내가 할 수있는 최고의 할당 문자열.

그것은 상당히 잘 작동했습니다 (사소한 문제 크기에서 가능한 모든 조합을 평가하는 이전의 방법보다 훨씬 낫습니다 ... 완벽하지 않은 문제 크기에서 완료하는 데 몇 년이 걸렸습니다!), 유일한 문제는 말할 수있는 방법이 없다는 것입니다 최적의 솔루션에 도달했는지 여부 현재의 "최선의 노력"이 충분한 지 판단하거나 더 오래 실행하여 더 잘할 수 있는지 확인할 수 있습니다.


2

codechef.com (매우 훌륭한 사이트, 월간 프로그래밍 경쟁)에 경쟁이 있었는데, 해결할 수없는 스도쿠를 해결해야합니다 (가능한 한 적은 잘못된 열 / 행 / 등으로 가능한 한 가까이 와야합니다).

내가 할 일은 먼저 완벽한 스도쿠를 생성 한 다음 주어진 필드를 재정의하는 것이 었습니다. 이 꽤 좋은 기초에서 나는 유전 프로그래밍을 사용하여 솔루션을 개선했습니다.

이 경우 결정 론적 접근 방식을 생각할 수 없었습니다. 스도쿠는 300x300이고 검색 시간이 너무 오래 걸렸기 때문입니다.


2

간단한 유전자 알고리즘을 사용하여 이진 문자열로 표현 된 파도의 신호 대 잡음비를 최적화했습니다. 몇 백만 세대에 걸쳐 비트를 특정 방식으로 뒤집 음으로써 그 웨이브의 신호 대 잡음비가 더 높은 변환을 생성 할 수있었습니다. 알고리즘은 "Simulated Annealing"일 수도 있지만이 경우에는 사용되지 않았습니다. 기본적으로 유전자 알고리즘은 간단하며 이것은 내가 본 유스 케이스와 거의 비슷하므로 생성 생성 및 선택을위한 프레임 워크를 사용하지 않았습니다. 임의의 시드와 신호 대 잡음비 만 손에 기능.


2

학교 세미나에서는 음악 모드를 기반으로 음악을 생성하는 응용 프로그램을 개발합니다. 이 프로그램은 Java로 빌드되었으며 출력은 노래와 함께 미디 파일이었습니다. 우리는 음악을 생성하기 위해 GA의 독특한 방식을 사용합니다. 이 프로그램이 새로운 작곡을 탐구하는 데 유용 할 수 있다고 생각합니다.


: 위대한 나는 비슷한 시도 링크
Todor Balabanov

2

언더 그레이드에서는 NERO (신경망과 유전자 알고리즘의 조합)를 사용하여 게임 내 로봇에게 지능적인 결정을 내릴 수있었습니다. 꽤 시원했습니다.


2

나는 음식 소스와 광산의 무작위 그리드 지형을 통해 로봇 네비게이션의 다중 스레드 스윙 기반 시뮬레이션을 개발했으며 로봇 행동의 최적화와 로봇 염색체에 대한 가장 적합한 유전자의 생존을 탐구하는 유전자 알고리즘 기반 전략을 개발했습니다. 이는 각 반복주기의 차트 및 매핑을 사용하여 수행되었습니다.

그 이후로 더 많은 게임 행동을 개발했습니다. 내가 최근에 내가 만든 응용 프로그램의 예는 출발 및 목표 상태뿐만 아니라 하나 / 여러 연결 지점, 지연, 취소, 건설 공사, 러시아워, 가장 빠른 경로와 가장 저렴한 경로 사이의 고려. 그런 다음 주어진 날에 노선에 대한 균형 잡힌 추천을 제공하십시오.

일반적으로 내 전략은 POJO 기반의 유전자 표현을 사용하는 것입니다. 그런 다음 선택, 돌연변이, 교차 전략 및 기준점에 대한 특정 인터페이스 구현을 적용합니다. 체력 기능은 기본적으로 휴리스틱 측정에 적용해야하는 전략과 기준에 따라 상당히 복잡해집니다.

또한 알고리즘이 논리를 이해하고 코드 수정에 대한 권장 사항으로 버그 보고서를 확인하려고하는 체계적인 돌연변이주기를 사용하여 코드 내에서 유전자 알고리즘을 자동화 된 테스트에 적용하는 방법을 살펴 보았습니다. 기본적으로 내 코드를 최적화하고 개선을위한 권장 사항을 제공하고 새로운 프로그래밍 코드 검색을 자동화하는 방법을 제공합니다. 또한 다른 응용 프로그램 중에서 음악 제작에 유전자 알고리즘을 적용하려고 시도했습니다.

일반적으로 대부분의 메타 휴리스틱 / 글로벌 최적화 전략과 같은 진화 전략을 발견했습니다. 처음에는 배우기가 느리지 만 솔루션이 목표 상태에 더 가깝고 가까워지고 체력 기능과 휴리스틱이 생산에 잘 부합하는 한 선택하기 시작합니다. 검색 공간 내에서 수렴합니다.


1

나는 한때 독점적으로 유전자 프로그래밍을 기반으로 한 Go 게임용 컴퓨터 플레이어를 만들려고했습니다. 각 프로그램은 일련의 이동에 대한 평가 기능으로 취급됩니다. 비록 생산 된 프로그램은 비록 아주 작은 3x4 보드에서도별로 좋지 않았다.

나는 Perl을 사용했고 모든 것을 직접 코딩했다. 나는 오늘 다르게 일을 할 것입니다.


1

블라인드 워치 메이커 (Blind Watchmaker)를 읽은 후 , 도킨스는 파스칼 프로그램에 관심이 있었으며, 시간이 지남에 따라 진화 할 수있는 유기체 모델을 만들기 위해 개발했다고 말했다. Swarm을 사용하여 나만의 글을 작성하는 데 관심이있었습니다 . 나는 그가 한 멋진 동물 그래픽을 모두 만들지는 않았지만, 나의 '염색체'는 생물의 생존 능력에 영향을 미치는 특성을 통제했다. 그들은 단순한 세상에서 살았으며 서로와 환경에 맞서 싸울 수있었습니다.

유기체는 우연히 부분적으로 살거나 죽었지 만 지역 환경에 얼마나 효과적으로 적응했는지, 영양소를 얼마나 잘 섭취했는지, 얼마나 성공적으로 재생산했는지에 따라 결정됩니다. 재미 있었지만 아내가 내가 괴짜라는 증거가 더 많았습니다.


1

얼마 전만해도 허블 우주 망원경 (HST) 이미지에서 우주 광선 추적을 제거하기 위해 이미지 처리 커널에 영향을 미쳤습니다. 표준 방법은 허블을 사용하여 여러 번 노출하여 모든 이미지에서 동일한 항목 만 유지하는 것입니다. HST 시간이 매우 소중하기 때문에 천문학 애호가이며 최근에 진화 계산 회의에 참석 한 적이 있습니다. GA를 사용하여 단일 노출을 정리하는 방법에 대해 생각했습니다.

개인은 3x3 픽셀 영역을 입력으로 사용하고 일부 계산을 수행하며 중앙 픽셀을 수정할지 여부와 방법에 대한 결정을 내린 나무 형태였습니다. 출력은 전통적인 방식으로 정리 된 이미지 (스태킹 노출)와 출력을 비교하여 판단했습니다.

실제로는 일종의 효과가 있었지만 원래의 접근법을 앞서 보증하기에는 충분하지 않습니다. 논문에 시간 제약을받지 않았다면 알고리즘에서 사용할 수있는 유전자 부분을 확장했을 수 있습니다. 나는 그것을 크게 향상시킬 수 있다고 확신합니다.

사용 된 라이브러리 : 올바르게 불러 오면 천체 이미지 데이터 처리 및 I / O를위한 IRAF 및 cfitsio가 사용됩니다.


1

나는 젊었을 때 GA를 실험했다. 파이썬으로 시뮬레이터를 작성하여 다음과 같이 작동했습니다.

유전자는 신경 네트워크의 가중치를 인코딩했습니다.

신경망의 입력은 터치를 감지 한 "안테나"였습니다. 값이 높을수록 매우 가깝고 0은 닿지 않는 것을 의미합니다.

출력은 두 개의 "바퀴"로 이루어졌습니다. 두 바퀴가 앞으로 나아 갔다면 그 남자는 앞으로 나아갔습니다. 바퀴가 반대 방향에 있다면 남자는 돌았습니다. 출력 강도에 따라 휠 회전 속도가 결정되었습니다.

간단한 미로가 생성되었습니다. 정말 간단했습니다. 화면 하단에 시작과 상단에 목표가 있었고 그 사이에 4 개의 벽이있었습니다. 각 벽에는 무작위로 공간이 나왔으므로 항상 길이있었습니다.

나는 처음에 임의의 사람들을 시작했습니다 (버그라고 생각했습니다). 한 사람이 목표에 도달하거나 시간 제한에 도달하자마자 피트니스가 계산되었습니다. 당시 목표까지의 거리에 반비례했습니다.

그런 다음 그것들을 연결 해제하고 "육성"하여 다음 세대를 창조했습니다. 번식하도록 선택 될 확률은 체력에 비례합니다. 때때로 이것은 상대적인 체력이 매우 높으면 반복적으로 자란다는 것을 의미했습니다.

나는 그들이 "왼쪽 벽 껴안기"행동을 개발할 것이라고 생각했지만 그들은 항상 덜 최적의 것을 따르는 것처럼 보였다. 모든 실험에서 버그는 나선형 패턴으로 수렴되었습니다. 그들은 오른쪽 벽에 닿을 때까지 바깥쪽으로 나선다. 그들은 그것을 따라 간 다음에 틈새에 도달했을 때, 틈에서 멀어지면서 나선형으로 움직였습니다. 그들은 왼쪽으로 270도 회전 한 다음 일반적으로 간격을 입력합니다. 이것은 벽의 대부분을 통과하고 종종 목표에 도달하게합니다.

내가 추가 한 한 가지 특징은 개인간에 관련성을 추적하기 위해 유전자에 색 벡터를 넣는 것이었다. 몇 세대가 지나면 모두 같은 색이되어 더 나은 육종 전략을 세워야한다고 말합니다.

나는 그들이 더 나은 전략을 개발하도록 노력했다. 신경망을 복잡하게 만들었습니다. 메모리와 모든 것을 추가했습니다. 도움이되지 않았습니다. 나는 항상 같은 전략을 보았다.

나는 100 세대 후에 만 ​​재조합 된 별도의 유전자 풀을 갖는 것과 같은 다양한 것을 시도했습니다. 그러나 더 나은 전략으로 이끌 수는 없습니다. 어쩌면 불가능했을 수도 있습니다.

또 다른 흥미로운 점은 시간에 따른 체력을 그래프로 나타내는 것입니다. 최대 체력이 올라 가기 전에 내려가는 것과 같은 명확한 패턴이있었습니다. 나는 그 가능성에 대한 진화 책 이야기를 본 적이 없다.

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