<?xml version="1.0" encoding="UTF-8" ?><feed xmlns="http://www.w3.org/2005/Atom">
	<title type="text">유전 알고리즘</title>
		<updated>2026-05-25T23:52:54+00:00</updated>
	<id>https://aidev.co.kr/genetic/atom</id>
	<link rel="alternate" type="text/html" hreflang="ko" href="https://aidev.co.kr/genetic"/>
	<link rel="self" type="application/atom+xml" href="https://aidev.co.kr/genetic/atom"/>
	<generator uri="http://www.xpressengine.com/">XpressEngine</generator>
   <entry>
		<title><![CDATA[유전 알고리즘와 강화학습으로 만든 인공크리처 - Unimals]]></title>
		<id>https://aidev.co.kr/10859</id>
		<published>2021-10-28T15:30:12+00:00</published>
		<updated>2021-10-28T15:30:12+00:00</updated>
		<link rel="alternate" type="text/html" href="https://aidev.co.kr/10859"/>
		<link rel="replies" type="text/html" href="https://aidev.co.kr/10859#comment"/>
		<author>
			<name><![CDATA[깊은바다]]></name>
					</author>
				<content type="html"><![CDATA[<div class="xe_content"><p>유전 알고리즘은 1975년 John Holland에 의해 개발된 기법입니다. 신경망이 인간의 두뇌를 모사했듯이, 유전 알고리즘은 자연의 진화를 시뮬레이션했습니다.</p>

<p>&nbsp;</p>

<p>먼저 01101 같은 유전자형을 만들고, 각 자리수마다 어떤 의미를 뜻하는지 표현형을 구현합니다. 예를 들어, 미로찾기라면 각 갈림길마다 0이면 왼쪽, 1이면 오른쪽으로 정할 수 있습니다. 그다음 실제 환경에서 각 개체를 수행하고, 그 결과를 적합도 수치로 뽑아냅니다. 만약 100개의 개체라면 적합도가 높은 상위 10개만 선택하여 교차와 돌연변이를 적용합니다. 교차는 두 유전자를 잘라 서로 붙이는 것이고, 돌연변이는 특정 위치의 유전자 몇개만 값을 바꿉니다. 이런 방법으로 새로 90개를 만들어 총 100개를 채우고 다시 돌립니다. 이렇게 세대가 지날수록 환경에 잘 적응한 개체로 진화합니다.</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/JBgG_VSP7f8" title="YouTube video player" width="560"></iframe></p>

<p>&nbsp;</p>

<p>1994년에 Karl Sims이 Evolved Virtual Creatures를 발표합니다. 한 마디로 인공생명체를 만드는 것입니다. 크리처의 외형과 행동 모두를 유전자로 만들고 진화 알고리즘으로 환경에 적응하도록 했습니다.</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/JPFhqrN9DlE" title="YouTube video player" width="560"></iframe></p>

<p>&nbsp;</p>

<p>최근에 스탠포드대에서 Unimals라는 비슷한 프로젝트를 공개했습니다. 다만 외형은 유전 알고리즘으로 진화하지만, 행동은 강화학습으로 결정하는 차이점이 있습니다. 다양한 태스크를 수행했는데 상당히 흥미롭습니다.</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>예전에 저는 진정한 인공지능은 진화에서부터 시작한다고 믿었습니다. 지구와 비슷한 가상환경을 만들고 세포단계부터 진화를 시킵니다. 그리고 인공두뇌를 가진 가상 생명체가 등장할때까지 시뮬레이션을 계속 진행합니다. 문제는 그런 가상환경을 만들고 설계하는게 과연 가능하냐는 것입니다. 지금은 딥러닝처럼 사람이 직접 신경망의 구조와 학습방식을 개발하는게 더욱 빠른 길이 아닐까 하는 생각을 합니다.</p>

<p>&nbsp;</p></div>]]></content>
						
	</entry>
   <entry>
		<title><![CDATA[유전적 알고리즘으로 운전을 학습시켜보았다]]></title>
		<id>https://aidev.co.kr/7721</id>
		<published>2019-05-29T02:25:25+00:00</published>
		<updated>2019-05-29T02:25:25+00:00</updated>
		<link rel="alternate" type="text/html" href="https://aidev.co.kr/7721"/>
		<link rel="replies" type="text/html" href="https://aidev.co.kr/7721#comment"/>
		<author>
			<name><![CDATA[깊은바다]]></name>
					</author>
				<content type="html"><![CDATA[<div class="xe_content"><p><iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/BhxaOkuJOiM" width="560"></iframe></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>유전 알고리즘은 인간의 진화 과정을 컴퓨터로 시뮬레이션 하는 방법입니다. 이를 사용하여 자동차가 길을 찾는 과정을 보여주는 영상입니다.</p>

<p>&nbsp;</p>

<p>유전자는 010020112 같은 숫자의 나열로 이루어져 있습니다. 이를 유전형(genotype)이라 부릅니다. 각 유전자는 개체의 모양이나 행동을 나타냅니다. 여기서는 0-&gt;직진, 1-&gt;좌회전, 2-&gt;우회전 입니다. 이렇게 유전형의 실제 의미가 표현형(phenotype)입니다.</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>초기 유전자풀에서 임의로 두 개씩 짝지어서 교차(crossover)를 수행합니다. 특정 위치를 기준으로 서로 유전자를 교환하는 것을 말합니다. 예를 들어, 다음과 같습니다.</p>

<p>&nbsp;</p>

<p>1번 유전자 : 00112001<br />
2번 유전자 : 11000201<br />
4번째 위치에서 교차 : 00110201, 11002001</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>그다음 각 유전자를 랜덤하게 다른 유전자로 돌연변이(mutation) 시킵니다.</p>

<p>&nbsp;</p>

<p>원본 : 00110201<br />
수정 : 00210201 (3번째 위치에서 돌연변이)</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>이렇게 교차와 돌연변이를 거친 다음 세대를 실제 환경에서 돌립니다. 여기서는 차가 얼마나 멀리 갔는지를 가지고 평가합니다. 이를 적응도(fitness)라고 합니다. 그리고 적응도가 높은 개체들만 뽑아서 다시 위의 과정을 반복합니다.</p>

<p>&nbsp;</p>

<p>실제 생명체들은 환경에서 적자생존을 거쳐 진화를 합니다. 마찬가지로 유전 알고리즘도 주어진 적응도에 최적화된 개체를 찾아냅니다. 이 유전자가 바로 문제의 정답인 파라미터값이 됩니다.</p></div>]]></content>
						
	</entry>
   <entry>
		<title><![CDATA[타이핑 치는 원숭이가 셰익스피어의 소설을 쓸 수 있을까?]]></title>
		<id>https://aidev.co.kr/5363</id>
		<published>2018-07-03T19:47:15+00:00</published>
		<updated>2018-07-03T19:49:31+00:00</updated>
		<link rel="alternate" type="text/html" href="https://aidev.co.kr/5363"/>
		<link rel="replies" type="text/html" href="https://aidev.co.kr/5363#comment"/>
		<author>
			<name><![CDATA[깊은바다]]></name>
					</author>
				<content type="html"><![CDATA[<div class="xe_content"><p><img src="http://aidev.co.kr/files/attach/images/190/363/005/abed5366b880c3fef8f6d8f500a6ff59.jpg" alt="58f554af30e465e921275f4d.jpg" style="" /></p>

<p> </p>

<p> </p>

<p> </p>

<p>딥러닝이 뇌의 뉴런을 시뮬레이션 하였다면 유전 알고리즘은 생명체의 진화 과정을 컴퓨터로 구현한 것입니다. 아시다시피 생명체의 정보는 DNA안에 ACGT 핵염기를 사용해서 4진법으로 구성되어 있습니다. 그리고 생식을 할때 남성과 여성의 염색차가 중간에 끊어지면서 조합되는 교차와 특정 유전자가 변형되는 돌연변이에 의해서 유전 정보가 바뀌면서 조금씩 진화합니다.</p>

<p> </p>

<p>유전 알고리즘도 교차와 돌연변이 방법을 그대로 사용하는데요. 보통 0과 1로 된 유전 정보를 만들고 각각을 특정 형질과 매칭합니다. 예를 들어, 미로를 찾는 생쥐의 움직임을 유전자로 만든다면 0일때 왼쪽 이동, 1일때 오른쪽 이동으로 정의하고 각 순서별로 n번째 갈림길에서의 행동을 나타내도록 설정합니다. 그리고 출구에 가까이 다가간 유전자는 다음 세대로 이어질 확률이 높아집니다. 이렇게 진화를 반복하면 결국 미로를 빠져나가는 행동 유전자를 얻을 수 있습니다.</p>

<p> </p>

<p> </p>

<p> </p>

<p>흔히 진화론을 공격하기 위한 예로 타이핑을 치는 원숭이를 들곤 합니다. 아무렇게나 글자를 입력하는 원숭이가 셰익스피어의 작품을 작성할 가능성은 거의 제로라는 것입니다. 하지만 여기에는 큰 모순이 있는데요. 바로 진화의 가장 큰 특징인 형질의 누적을 고려하지 않았기 때문입니다.</p>

<p> </p>

<p>만약 순서대로 타이핑을 할때 그 위치에 입력한 단어가 책과 일치한다면 그 단어를 고정합니다. 그리고 나머지 부분에 대해서 반복적으로 랜덤하게 입력을 한다면 아주 빠르게 책과 동일한 글을 작성할 수 있습니다.</p>

<p> </p></div>]]></content>
						
	</entry>
   <entry>
		<title><![CDATA[신경망과 유전 알고리즘을 사용한 플래피 버드]]></title>
		<id>https://aidev.co.kr/2099</id>
		<published>2017-08-26T03:24:59+00:00</published>
		<updated>2017-08-26T11:36:21+00:00</updated>
		<link rel="alternate" type="text/html" href="https://aidev.co.kr/2099"/>
		<link rel="replies" type="text/html" href="https://aidev.co.kr/2099#comment"/>
		<author>
			<name><![CDATA[깊은바다]]></name>
					</author>
				<content type="html"><![CDATA[<div class="xe_content"><p><iframe frameborder="0" height="315" src="https://www.youtube.com/embed/aeWmdojEJf0" width="560"></iframe></p>

<p> </p>

<p><a href="http://www.askforgametask.com/tutorial/machine-learning-algorithm-flappy-bird/" target="_blank">http://www.askforgametask.com/tutorial/machine-learning-algorithm-flappy-bird/</a></p>

<p> </p>

<p> </p>

<p> </p>

<p><img alt="Machine Learning Algorithm for Flappy Bird - Neural Network" src="http://www.askforgametask.com/wordpress/wp-content/uploads/2017/07/flappy_06e.png" /></p>

<p> </p>

<p>플래피 버드의 행동을 결정하는 신경망은 위의 그림과 같습니다.</p>

<p>장애물과의 가로와 세로 거리를 입력으로 하고 날아오르는 행동을 출력으로 하는 구조입니다.</p>

<p> </p>

<p>보통 지도학습으로 구현을 하려면 실제 플레이어가 조작했던 데이터가 필요합니다.</p>

<p>하지만 여기서는 신경망의 가중치를 유전 알고리즘을 사용해서 진화를 통해 결정하였습니다.</p>

<p> </p>

<p>살아남은 개체들의 신경망 가중치를 서로 교차와 돌연변이를 수행하여 변경합니다.</p>

<p>그리고 반복적으로 진화를 계속할수록 장애물을 멋지게 통과하는 캐릭터를 볼 수 있습니다.</p>

<p> </p></div>]]></content>
						
	</entry>
   <entry>
		<title><![CDATA[유전 프로그래밍]]></title>
		<id>https://aidev.co.kr/2039</id>
		<published>2017-08-19T01:24:31+00:00</published>
		<updated>2017-08-21T00:25:24+00:00</updated>
		<link rel="alternate" type="text/html" href="https://aidev.co.kr/2039"/>
		<link rel="replies" type="text/html" href="https://aidev.co.kr/2039#comment"/>
		<author>
			<name><![CDATA[LegenDUST]]></name>
					</author>
				<content type="html"><![CDATA[<div class="xe_content"><p>아직 여기에는 유전 프로그래밍에 대한 내용이 하나도 없네요..</p>

<p>https://ko.wikipedia.org/wiki/%EC%9C%A0%EC%A0%84_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</p>

<p>위키백과 문서인데, 기본적인 내용은 프로그램 그 자체를 유전 알고리즘을 사용하여 만들어 낸다는 것입니다.</p>

<p> </p>

<p>그러면 유전적 프로그래밍을 하기 쉽게 하는 난해한 프로그래밍 언어를 하나 만들어서 프로그램을 스스로 만들게 하면 어떨까요? 난해한 프로그래밍 언어는 만들기 그렇게 어렵지도 않더만...(제 블로그에 가보면 하나 있습니다. <s>홍보글 아니에요</s>)</p>

<p> </p>

<p>뭐 또 이거 관련해서 온라인에서 뭐 찾으면 올려주시면 감사하겠습니다</p></div>]]></content>
						<category term="유전프로그래밍"/>
				<category term="유전알고리즘"/>
				
	</entry>
   <entry>
		<title><![CDATA[유전 알고리즘을 설명하는 동영상]]></title>
		<id>https://aidev.co.kr/567</id>
		<published>2016-03-27T00:57:26+00:00</published>
		<updated>2017-08-19T00:58:33+00:00</updated>
		<link rel="alternate" type="text/html" href="https://aidev.co.kr/567"/>
		<link rel="replies" type="text/html" href="https://aidev.co.kr/567#comment"/>
		<author>
			<name><![CDATA[깊은바다]]></name>
					</author>
				<content type="html"><![CDATA[<div class="xe_content"><p><iframe frameborder="0" height="315" src="https://www.youtube.com/embed/Yr_nRnqeDp0" width="560"></iframe></p>

<p> </p>

<p><iframe frameborder="0" height="315" src="https://www.youtube.com/embed/c-qePE1GCQY" width="560"></iframe></p>

<p> </p>

<p> </p>

<p>유전 알고리즘은 역시 최적화에 뛰어난 성능을 발휘하네요.</p>

<p>그런데 이런 물리엔진을 구현한 것이 더 대단한 것 같습니다^^;</p>

<p> </p></div>]]></content>
						
	</entry>
   <entry>
		<title><![CDATA[유전 알고리즘으로 하스스톤 카드덱 조합]]></title>
		<id>https://aidev.co.kr/427</id>
		<published>2016-03-24T03:35:01+00:00</published>
		<updated>2018-07-03T19:03:46+00:00</updated>
		<link rel="alternate" type="text/html" href="https://aidev.co.kr/427"/>
		<link rel="replies" type="text/html" href="https://aidev.co.kr/427#comment"/>
		<author>
			<name><![CDATA[깊은바다]]></name>
					</author>
				<content type="html"><![CDATA[<div class="xe_content"><p><img src="http://aidev.co.kr/files/attach/images/190/427/91f3f9302a8c92154294fe9a5ba25840.jpg" alt="hts_2_hs-540x413.jpg" style="" /></p>

<p> </p>

<p><a href="http://ppss.kr/archives/53276" target="_blank">http://ppss.kr/archives/53276</a></p>

<p> </p>

<p> </p>

<p>하스스톤이라는 유명한 카드게임이 있습니다.</p>

<p>턴방식으로 한장씩 카드를 받고 내 카드를 내면서 카드의 특성을 이용하여 게임을 진행합니다.</p>

<p>수백장의 카드중 30장의 카드만 골라 덱을 만든후 플레이를 합니다.</p>

<p> </p>

<p>게임의 가장 중요한 요소 중 하나가 어떻게 카드를 구성하느냐 입니다.</p>

<p>한 고등학생이 유전알고리즘을 이용해서 이러한 카드덱을 진화를 통해 조합한다는 논문입니다.</p>

<p>새로운 기술은 없지만 인공지능을 이렇게 활용할 수 있다는 것이 매우 흥미롭습니다.</p>

<p> </p>

<p>실제로 게임회사에서는 밸런스 테스트를 위해 유전알고리즘을 많이 사용한다고 합니다.</p></div>]]></content>
						
	</entry>
   <entry>
		<title><![CDATA[유전 알고리즘을 이용한 우주선 게임]]></title>
		<id>https://aidev.co.kr/424</id>
		<published>2016-03-24T03:33:47+00:00</published>
		<updated>2018-04-28T18:15:45+00:00</updated>
		<link rel="alternate" type="text/html" href="https://aidev.co.kr/424"/>
		<link rel="replies" type="text/html" href="https://aidev.co.kr/424#comment"/>
		<author>
			<name><![CDATA[깊은바다]]></name>
					</author>
				<content type="html"><![CDATA[<div class="xe_content"><p><img src="http://aidev.co.kr/files/attach/images/190/424/27e88b2d804a245def68390d311b6607.jpg" alt="spaceship.jpg" style="" /></p>

<p> </p>

<p> </p>

<p> </p>

<p>'쉽게 풀어쓴 인공지능 게임 프로그래밍'(Mat Buckland, 김석중 역, 정보문화사)이란 책에서 나온 유전자 알고리즘을 이용한 프로그램을 하나 소개해 드리겠습니다.</p>

<p> </p>

<p>두 개의 프로그램이 포함되어 있는데 하나는 사람이 직접 우주선을 조종하여 바닥에 안전하게 착륙하도록 하는 프로그램입니다. 다른 하나는 유전자 알고리즘을 사용하여 우주선이 무사히 착륙할 수 있는 방법을 진화를 통해 스스로 터득합니다.</p>

<p> </p>

<p> </p>

<p> </p>

<p>우주선의 조종방법은 다음의 4가지가 있습니다.</p>

<p> </p>

<p>1. 분출한다.</p>

<p>2. 왼쪽으로 회전한다.</p>

<p>3. 오른쪽으로 회전한다.</p>

<p>4. 현재 상태를 유지한다.</p>

<p> </p>

<p>유전자의 인코딩은 우주선이 취하는 행동과 그 지속시간의 쌍으로 구성됩니다.</p>

<p> </p>

<p> </p>

<p> </p>

<p>그리고 적합도 함수는 다음의 4가지를 사용하였습니다.</p>

<p> </p>

<p>1. 착륙목표 지점과 실제 착륙지점과의 거리</p>

<p>2. 착륙시의 속도</p>

<p>3. 착륙시의 우주선의 각도</p>

<p>4. 우주선의 비행시간</p>

<p> </p>

<p>우주선의 비행시간은 착륙이 좀 더 사실적으로 보이게 하기위해 추가하였습니다.</p>

<p> </p>

<p> </p>

<p> </p>

<p>직접 해보시면 알겠지만 키보드로 조종하여 우주선을 착륙시키는 것이 상당히 어렵더군요. 하지만 유전자 알고리즘을 사용하니 몇 십 세대만에 금방 멋지게 착륙에 성공하였습니다.</p>

<p> </p>

<p>유전자 알고리즘을 사용한 방법뿐만아니라 프로그램에 사용된 벡터, 행렬, 물리법칙 등이 책에 매우 자세하게 설명되어 있습니다. 관심있는 분들은 참고하시면 좋을 것 같습니다.</p></div>]]></content>
						
	</entry>
   <entry>
		<title><![CDATA[유전 알고리즘을 사용한 인공진화]]></title>
		<id>https://aidev.co.kr/421</id>
		<published>2016-03-24T03:32:38+00:00</published>
		<updated>2018-04-28T18:15:20+00:00</updated>
		<link rel="alternate" type="text/html" href="https://aidev.co.kr/421"/>
		<link rel="replies" type="text/html" href="https://aidev.co.kr/421#comment"/>
		<author>
			<name><![CDATA[깊은바다]]></name>
					</author>
				<content type="html"><![CDATA[<div class="xe_content"><p><iframe frameborder="0" height="315" src="https://www.youtube.com/embed/JBgG_VSP7f8" width="420"></iframe></p>

<p> </p>

<p><a href="http://www.karlsims.com/evolved-virtual-creatures.html" target="_blank">http://www.karlsims.com/evolved-virtual-creatures.html</a></p>

<p> </p>

<p> </p>

<p> </p>

<p>인공지능 연구로 유명한 MIT 미디어랩의 Karl Sims가 1994년 발표한 내용입니다. 유전자 알고리즘을 사용하여 가상의 크리쳐를 인공적으로 진화시켰습니다.</p>

<p> </p>

<p>유전자는 크게 두 가지 종류로 나누어 집니다. 하나는 크리쳐의 외형에 대한 정보이고, 다른 하나는 행동방식에 대한 것입니다.</p>

<p> </p>

<p> </p>

<p> </p>

<p><img src="http://aidev.co.kr/files/attach/images/190/421/937c7617db74102b32a05d80b458a935.jpg" alt="vcreature.jpg" style="" /></p>

<p> </p>

<p>외형의 정보는 그림과 같이 body와 body 사이를 연결하는 각도와 연결부위의 움직이는 범위 등으로 이루어집니다.</p>

<p> </p>

<p> </p>

<p> </p>

<p><img src="http://aidev.co.kr/files/attach/images/190/421/ea71067917a9875740e00b20c7a2a75e.jpg" alt="vcreature2.jpg" style="" /></p>

<p> </p>

<p>크리쳐의 행동방식은 신경망과 비슷하게 명령어셋을 네트워크로 연결하고 각각의 가중치값에 대한 정보들로 구성되어 있습니다.</p>

<p> </p>

<p> </p>

<p> </p>

<p>그리고 이런 유전자를 가지고 생성된 크리쳐들을 물리법칙이 적용되는 가상공간에서 적합도 검사를 하여 진화를 수행합니다. 크리쳐의 진화를 결정하는 적합도에는 영상에서 보시는 것처럼 멀리 움직이기, 높이 점프하기, 불빛을 따라가기, 녹색 블럭을 움직이기 등으로 되어 있습니다.</p>

<p> </p>

<p>진화를 거듭할수록 실제 자연에서 다양한 생물체가 탄생한 것처럼 사람이 직접 설계하지 않은 매우 복잡한 모양의 크리쳐들이 만들어진 것을 볼 수 있습니다.</p>

<p> </p>

<p> </p>

<p> </p>

<p>게임에서도 월드에 돌아다니는 몬스터들을 이렇게 진화를 통해 다양한 외형과 행동방식을 가지는 개체들로 만들어가면 좋을 것 같다는 생각이 듭니다. 그러면 유저들이 게임세계를 더욱 살아있는 것처럼 느낄 수 있을 것입니다.</p>

<p> </p>

<p>물론 현실적으로 이렇게 구현하는 것 자체가 쉽지는 않겠지만 만약 가능하다면 상당히 독창적이고 재미있는 게임이 될 것입니다.</p></div>]]></content>
						
	</entry>
   <entry>
		<title><![CDATA[유전 알고리즘의 소개]]></title>
		<id>https://aidev.co.kr/420</id>
		<published>2016-03-24T03:30:50+00:00</published>
		<updated>2018-05-27T14:42:22+00:00</updated>
		<link rel="alternate" type="text/html" href="https://aidev.co.kr/420"/>
		<link rel="replies" type="text/html" href="https://aidev.co.kr/420#comment"/>
		<author>
			<name><![CDATA[깊은바다]]></name>
					</author>
				<content type="html"><![CDATA[<div class="xe_content"><p><a href="http://gameai.net/Article/GA_Instruction/GA_Instruction.htm" target="_blank">유전자 알고리즘의 소개</a> - 정현철   &lt;출처 : <a href="http://myhome.naver.com/altoz/" target="_blank">ALTOZ</a>&gt;</p>

<p> </p>

<p><a href="http://gameai.net/Article/GA_Instruction/GA_Instruction.htm" target="_blank">http://gameai.net/Article/GA_Instruction/GA_Instruction.htm</a></p>

<p> </p>

<p> </p>

<p> </p>

<p>&lt; 인공지능 개발자 모임 &gt;</p>

<p>- 페이스북 그룹에 가입하시면 인공지능에 대한 최신 정보를 쉽게 받으실 수 있습니다.</p>

<p>- <a href="https://www.facebook.com/groups/AIDevKr/" target="_blank">https://www.facebook.com/groups/AIDevKr/</a></p>

<p> </p></div>]]></content>
						
	</entry>
   <entry>
		<title><![CDATA[유전 알고리즘을 사용한 인공생태계 구현]]></title>
		<id>https://aidev.co.kr/417</id>
		<published>2016-03-24T03:30:27+00:00</published>
		<updated>2018-06-17T15:44:18+00:00</updated>
		<link rel="alternate" type="text/html" href="https://aidev.co.kr/417"/>
		<link rel="replies" type="text/html" href="https://aidev.co.kr/417#comment"/>
		<author>
			<name><![CDATA[깊은바다]]></name>
					</author>
				<content type="html"><![CDATA[<div class="xe_content"><p><img src="http://aidev.co.kr/files/attach/images/190/417/37f56b4dacd19ce4ef31a7a12f8d0ed4.jpg" alt="K-2.jpg" style="" /></p>

<p> </p>

<p>소스코드 : 첨부파일</p>

<p> </p>

<p> </p>

<p> </p>

<p align="justify"><b>유전자 알고리즘(Genetic Algorithm)</b></p>

<p align="justify"> </p>

<p align="justify">유전자 알고리즘은 자연의 진화과정을 모델링하여 구현한 탐색 알고리즘이라 할 수 있다. 기본적인 개념은 주어진 문제에 대해 가능한 해들을 정해진 형태로 표현한 후 이들을 변화시키고, 그 결과들 중 적합도가 높은 것들을 선택하여 변화를 계속함으로써 보다 좋은 해에 도달한다는 것이다. 이는 마치 부모의 유전인자 중 우성의 형질을 지닌 개체가 번성해간다는 다윈의 진화론적 적자생존의 법칙과 유사하다.</p>

<p align="justify"> </p>

<p align="justify">주어진 문제에 가능한 해, 즉 각 개체들의 유전적 구조는 보통 고정된 길이의 이진값으로 표현되다. 이러한 유전자는 다음과 같이 두 가지 방법으로 부모개체로부터 새로운 개체로 생성된다. 첫째는 교차변이(crossover)라고 하는 것으로 부모 개체들의 특정 교차점에서 그 이후의 값들을 서로 교환하는 것이다. 둘째는 돌연변이(mutation)로 0을 1로, 혹은 1을 0으로 비트값을 반대값으로 변환하는 것이다.</p>

<p align="justify"> </p>

<p align="justify">이렇게 새로운 자식 개체들을 생성한 후에 적합도 함수(fitness function)을 통해서 주어진 문제에 적합한 개체들만을 골라 선택하고, 다시 선택된 개체들을 교차변이와 돌연변이를 통해 새로운 개체들을 생성함으로써 보다 좋은 해에 도달할 때까지 반복한다.</p>

<p align="justify"> </p>

<p><img src="http://aidev.co.kr/files/attach/images/190/417/8f6ed1edf8ba58d2adce2cd7e5f4c396.jpg" alt="figure1.jpg" style="" /></p>

<p> </p>

<p> </p>

<p> </p>

<p align="justify"><b>진화하는 간단한 인공생계태의 구현</b></p>

<p align="justify"> </p>

<p align="justify">위와 같은 유전자 알고리즘을 사용하여 인공적인 환경안에서 진화하는 가상생명체들을 구현하여 보았다. 인공환경안에는 저글링, 파이어뱃, 질럿이라는 세 종류의 종족이 존재하고 각 종족은 저다마 다른 육체적 특징을 갖고 있다. 그리고 이러한 특성은 유전자 코드에 저장되어 있고, 번식을 수행할 때 개체의 유전적 특성이 전달되어 부모개체의 특징들이 자식개체에게로 이어진다.</p>

<p align="justify"> </p>

<p align="justify">이때 특정한 확률로 임의의 유전코드가 돌연변이를 통해 변이를 함으로써 부모개체의 특성을 유지하지만 조금 변형된 특성을 물려받게 되고 만약 변형된 특성이 환경에서 살아남기에 더 적합하다면 그러한 특성이 개체들이 더욱 번성하게 될 것이다.</p>

<p align="justify"> </p>

<p align="justify">유전자 종류가 많지 않은 특성상 교차변이는 사용하지 않고 돌연변이 방법만 사용하였다. 그리고 특정한 적합도 함수는 존재하지 않고 환경안에서 보다 많은 먹이를 먹고 싸움에 이기는 개체들은 자식개체를 생성하고 그렇지 못한 개체들은 죽음으로써 자연스럽게 환경에 적합한 특성을 가진 개체들만이 살아남아 번성하게 될 것이다.</p>

<p align="justify"> </p>

<p align="justify">처음에는 랜덤하게 선택된 유전자 특성들로 시작하지만, 시간이 흐를수록 환경에 유리한 개체들만이 살아남아 번식을 하게 될 것이다. 이 프로그램의 목적은 서로 다른 육체적 특징을 갖고 있는 세 종족이 어떻게 환경에 적응을 하고 어떠한 방향으로 유전적 특징들이 발전하는지를 살펴보는데 있다.</p>

<p align="justify"><b> </b></p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"><b>개체의 유전자 종류</b></p>

<p align="justify"> </p>

<p align="justify">개체의 유전자 특성은 다음과 같이 4가지가 있다.</p>

<p align="justify"> </p>

<p align="justify">- 시야(Sight)<br />
    : 개체가 바라볼 수 있는 거리. 시야가 넓을수록 먹이를 먼저 발견하여 다가간다.<br />
    : 각 종족마다 가질 수 있는 시야의 범위는 저글링(5~10), 파이어뱃(3~7), 질럿(1~5)</p>

<p align="justify"> </p>

<p align="justify">- 힘(Strength)<br />
    : 개체의 전투 능력. 힘이 높을수록 싸움에서 이길 확률이 높다.<br />
    : 각 종족마다 가질 수 있는 힘의 범위는 저글링(1~5), 파이어뱃(3~7), 질럿(5~10)</p>

<p align="justify"> </p>

<p align="justify">- 이동성향(Move)<br />
    : 높을수록 이동할 확률이 높고 낮을수록 움직이지 않을 확률이 높다.<br />
    : 세 종족 모두 (1~10)</p>

<p align="justify"> </p>

<p align="justify">- 공격성향(Attack)<br />
    : 높을수록 다른 종족과 전투할 확률이 높고 낮을수록 전투를 회피할 확률이 높다. <br />
    : 세 종족 모두 (1~10)</p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"><b>기타 규칙들</b></p>

<p align="justify"> </p>

<p align="justify">- 각 종족의 기본체력은 저글링(50), 파이어뱃(70), 질럿(100)<br />
- 미네랄을 먹으면 체력이 20 증가<br />
- 미네랄은 턴마다 설정된 개수만큼 증가(0~5)<br />
- 시야내에 미네랄이 있으면 그쪽으로 이동<br />
- 한 칸 이동시 체력이 일정수치 감소. 저글링(-1), 파이어뱃(-2), 질럿(-5)<br />
- 대기시에도 체력이 일정수치 감소. 저글링(-1), 파이어뱃(-1), 질럿(-1)<br />
- 주위에 다른 종족 발견시 전투여부 결정 : 공격성향1+공격성향2+랜덤치 &gt; 일정수치<br />
- 전투발생시 공식에 의해 승패 결정 : 힘x(체력/10+랜덤치)<br />
- 전투승리시 상대 만큼 체력 증가<br />
- 기본체력의 2배가 되면 번식<br />
- 번식시 특정한 확률로 각 특성값이 돌연변이됨<br />
- 체력이 '0'이 되면 죽음<br />
- 전투시 빨간색 테투리 표시<br />
- 번식시 파란색 테투리 표시</p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"><b>결과 분석</b></p>

<p align="justify"> </p>

<p align="justify">예외가 있긴 하지만 보통 충분한 시간이 흐른뒤에 각 종족의 특성을 살펴보면 다음과 같다.</p>

<p align="justify"> </p>

<p align="justify">- 저글링<br />
    : 시야와 힘이 높다<br />
    : 이동성향이 높다<br />
    : 공격성향이 낮다</p>

<p align="justify"> </p>

<p align="justify">- 파이어뱃<br />
    : 시야와 힘이 높다<br />
    : 이동성향이 높다<br />
    : 공격성향이 높다</p>

<p align="justify"> </p>

<p align="justify">- 질럿<br />
    : 시야와 힘이 높다<br />
    : 이동성향이 낮다<br />
    : 공격성향이 높다</p>

<p align="justify"> </p>

<p align="justify">세 종족 모두 공통적으로 시야와 힘이 높은 개체들이 번성하였다. 이는 먹이 발견과 싸움시 유리하게 작용하기 때문이다.저글링은 육체적 특성이 시야가 넓은 대신 힘이 약하기 때문에 빨리 이동하고 싸움을 피하는 특성을 보였다. 파이어뱃은 육체적 특성이 중간치이기 때문이라 그런지 이동성이 높아 먹이도 빨리먹고 공격성향도 높아 저글링에 경우 공격하는 것이 유리하게 작용한다. 질럿은 시야가 좁고 이동시 체력이 많이 드는 대신 힘이 좋기 때문에 이동은 적게 하고 주로 공격을 통해 체력을 높이는 방향으로 발전하였다.</p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify">[참고자료]</p>

<p align="justify">    - AI Game Programming Wisdom, Francois Laramee, p.841 ~ p.853<br />
    - 인공생명, 스티븐 프레이타, p.201 ~ p.226</p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"> </p>

<p>&lt; 인공지능 개발자 모임 &gt;</p>

<p>- 페이스북 그룹에 가입하시면 인공지능에 대한 최신 정보를 쉽게 받으실 수 있습니다.</p>

<p>- <a href="https://www.facebook.com/groups/AIDevKr/" target="_blank">https://www.facebook.com/groups/AIDevKr/</a></p></div>]]></content>
						
	</entry>
   <entry>
		<title><![CDATA[자동 그림생성 프로그램 - Evolving Image]]></title>
		<id>https://aidev.co.kr/413</id>
		<published>2016-03-24T03:28:29+00:00</published>
		<updated>2018-04-28T18:16:21+00:00</updated>
		<link rel="alternate" type="text/html" href="https://aidev.co.kr/413"/>
		<link rel="replies" type="text/html" href="https://aidev.co.kr/413#comment"/>
		<author>
			<name><![CDATA[깊은바다]]></name>
					</author>
				<content type="html"><![CDATA[<div class="xe_content"><p><img src="http://aidev.co.kr/files/attach/images/190/413/4b80817f6651223dfb9d327ed76cf24a.jpg" alt="eimage_main.jpg" style="" /></p>

<p> </p>

<p>소스코드 : 첨부파일</p>

<p> </p>

<p> </p>

<p> </p>

<p align="justify"><b>Evolving Image - Artificial Evolution</b></p>

<p align="justify"> </p>

<p align="justify">인공지능의 기법 중 하나인 유전자 알고리즘을 사용하여 사용자의 선택에 따라 자동으로 자동으로 그림을 그리는 프로그램이다. 1991년도 Karl Sims가 발표했던 "Artificail Evolution for Computer Graphics"라는 논문을 바탕으로 간단하게 구현하였다.</p>

<p align="justify"> </p>

<p align="justify">그림을 특정한 수식들의 집합으로 표현하고, 이들 수식을 유전 알고리즘에 따라 변화시킴으로써 다양한 그림이 생성되고 점점 복잡해지며 사용자가 원하는 방향으로 그림이 그려지게 된다.</p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"><b>유전자 알고리즘(Genetic Algorithm)</b></p>

<p align="justify"> </p>

<p align="justify">유전자 알고리즘은 자연의 진화과정을 모델링하여 구현한 탐색 알고리즘이라 할 수 있다. 기본적인 개념은 주어진 문제에 대해 가능한 해들을 정해진 형태로 표현한 후 이들을 변화시키고, 그 결과들 중 적합도가 높은 것들을 선택하여 변화를 계속함으로써 보다 좋은 해에 도달한다는 것이다. 이는 마치 부모의 유전인자 중 우성의 형질을 지닌 개체가 번성해간다는 다윈의 진화론적 적자생존의 법칙과 유사하다.</p>

<p align="justify"> </p>

<p align="justify">주어진 문제에 가능한 해, 즉 각 개체들의 유전적 구조는 보통 고정된 길이의 이진값으로 표현되다. 이러한 유전자는 다음과 같이 두 가지 방법으로 부모개체로부터 새로운 개체로 생성된다. 첫째는 교차변이(crossover)라고 하는 것으로 부모 개체들의 특정 교차점에서 그 이후의 값들을 서로 교환하는 것이다. 둘째는 돌연변이(mutation)로 0을 1로, 혹은 1을 0으로 비트값을 반대값으로 변환하는 것이다.</p>

<p align="justify"> </p>

<p align="justify">이렇게 새로운 자식 개체들을 생성한 후에 적합도 함수(fitness function)을 통해서 주어진 문제에 적합한 개체들만을 골라 선택하고, 다시 선택된 개체들을 교차변이와 돌연변이를 통해 새로운 개체들을 생성함으로써 보다 좋은 해에 도달할 때까지 반복한다.</p>

<p> </p>

<p><img src="http://aidev.co.kr/files/attach/images/190/413/a42d7257b7b08b7f173910e9f9e54007.jpg" alt="figure1.jpg" style="" /></p>

<p> </p>

<p> </p>

<p> </p>

<p align="justify"><b>프로그램 구현방법</b></p>

<p align="justify"> </p>

<p align="justify">사용한 유전자, 즉 수식들의 집합은 다음과 같다.</p>

<p align="justify"> </p>

<p>    X, Y, CONST ,ADD, SUB, MUL, DIV, AND, OR, XOR, DISTXY,<br />
    CIRC, SIN, COS, LN, NOT, RAND, MAX, MIN, AVG, INV,<br />
    RAND_RANGE, POLAR_1, POLAR_2, MANH, MDISTXY</p>

<p> </p>

<p align="justify">각 유전자마다 x, y 좌표에 따라 그림의 색깔을 계산하는 함수가 있고, 여러 유전자가 혼합된 구조일 때는 순서대로 수식을 계산하고 마지막에 나온 결과값에 따라 최종 좌표의 색깔을 결정한다.</p>

<p align="justify"> </p>

<p align="justify">유전자의 변이를 위해 돌연변이 기법을 사용하여 특정 유전자 집합의 수식을 다른 코드로 변화하거나 새로운 코드를 추가하여 변이를 수행하였다. 교차변이 기법은 사용하지 않았다.</p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"><b>결과 이미지들</b></p>

<p> </p>

<p><img src="http://aidev.co.kr/files/attach/images/190/413/5759e9cac5b66217ae9dcc87c2496985.jpg" alt="K-1.jpg" style="" /></p>

<p> </p>

<p> </p>

<p> </p>

<p align="justify">[참고자료]</p>

<p align="justify">    - 인공지능 개념 및 응용, 도용태, 사이텍 미디어, p.261 ~ p.264</p></div>]]></content>
						
	</entry>
</feed> 
