'알고리즘'에 해당되는 글 6건

  1. 2010.06.21 유전알고리즘(2)
  2. 2010.06.10 유전 알고리즘
  3. 2010.05.13 LCD 디스플레이
  4. 2010.05.11 여행(The Trip)
  5. 2010.05.03 지뢰찾기
  6. 2010.05.03 3n+1

유전 알고리즘을 이해하기 위한 간단한 프로그램을 짜보자.


시나리오 -  { } 중 3개를 골라서 20으로 만드는 문제가 있다고 하자. 여기서 유전체는 각 숫자이며, 유전자는 (1,5,3)와 같이 유전체 3개의 집합으로 이루어진다. 적합도 함수를 20과 얼마나 가까운지를 나타내는 값으로 둔다면, (1,5,3)에 대한 적합도는 f( (1,5,3) ) = 11이 된다.

먼저 첫 세대를 아무렇게나 생성한다. 첫 세대가 만약 { (1,5,3) (8,0,9) (9,9,8) (3,7,5) } 으로 형성되었다고 하자. 각각의 적합도를 구하면, { 11, 3, 7, 5 }이 되며, 이 값이 높을수록 20에서 멀기 때문에 해로서 부적당하다는 것을 의미하며, 따라서 세대를 거침에 따라 살아남을 확률이 낮게 된다.

다음 세대를 형성하기 위해, 이 세대의 개체중 2개의 유전자를 선택한다. 이때 선택은 적합도를 기준으로 확률적선택(룰렛 알고리즘이 자주 쓰인다)이다. 따라서 위의 예에서 (8,0,9)는 (9,9,8)에 비해 훨씬 높은 선택 기회를 가진다. 선택된 2개의 유전자의 유전체는 랜덤한 위치에서 교환되어 새로운 세대가 형성된다. 예로 (8,0,9), (9,9,8) 이 선택되었고 교배위치가 2번째 자리로 무작위로 결정되었다면 다음 세대의 개체는 (8,9,8) ,(9,0,9)로 된다.

출처 - 위키백과


1. 먼저 {1~15} 까지 만들고 여기서 랜덤하게 유전자를 3개를 선택하였다.

2. 유전자 3개중 적합도 함수를 통해 20에 가까운 유전자 2개를 선택하였다. (부모유전자) - 선택연산

3. 선택된 2개의 유전자를 부분 결합하여 새로운 해를 만들어 낸다. - 교차연산

4. 부모유전자중 적합도가 낮은 2개의 유전자를 새롭게 만든 유전자 2개랑 바꿔준다. -대치연산

5. 값들이 20이 되기전에 3개가 모두 같아져 버리는 현상이 있다. 이런 현상이 생길때 변이를 시켜준다. -변이연산




원래대로라면 변이연산을 특정한 확률로 랜덤하게 해줘야 되는 거 같은데

프로그램을 하다보니까 대치연산을 하다보면 어느 순간부터 모든 유전자들이 같게 되는 순간이 있다.

그래서 그 순간에 변이연산을 시켜줘서 20이 나올 때 까지 계속 찾게만들었다.

유전알고리즘에 대해서 아주~~~사아아알~~짝 어떤것인지 알 것 같다.

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

유전 알고리즘  (0) 2010.06.10
영향력 분포도  (0) 2010.06.10
연결리스트를 이용한 이진트리의 순회방법  (0) 2010.05.14
트리의 배열표현 방법  (0) 2010.05.14
큐 만들기  (0) 2010.05.14
Posted by 아몰라

열심히 알고리즘도 찾는 중인데 우선 유전 알고리즘이라는걸 찾아서 정리해봤다.

책에 나온 내용은 거의 400 ~500쪽이라서 대략 어떠한 알고리즘인지만 이해했고

더 조사해서 우리 프로젝트에 적합한지 확인해봐야겠다.


유전알고리즘

 

 

100개의 초기 염색체 집단을 만들고 다음과 같이 해보자.

1. 각 염색체게 문제를 푸는데 얼마나 적당한가를 검사하고 그에 상응하는 적응도를 부여한다.

2. 현재 집단에서 두 개를 선택한다. 선택되는 확률은 적응도에 비례한다. 이런 선택 방법은 흔히 룰렛 선택이라고 한다.

3. 두 염색체의 비트들 중에서 임의의 비트를 선택하여 교차 확률로 교차시킨다.

4. 선택된 염색체의 비트들을 돌연변이 확률로 뒤집는다.

5. 100개의 새로운 염색체가 생길 때까지 2, 3, 4단계를 반복한다.

 

 

룰렛선택 염색체를 적응도에 비례하여 선택하는 방법입니다. 적응도가 높은 염색체일수록 선택될 확률은 높다. 적응도가 가장 높은 염색체가 반드시 다음 세대로 유전된다는 것을 보장하지 않는다.

 

  

 


교차 선택된 두 염색체가 새로운 자식 염색체를 만들기 위해서 그들의 비트를 서로 바꾸는 것

 

 

돌연변이 염색체에서 어떤비트가 뒤집어지는 것을 말한다. , 0 1이 되고 1 0이 되는 것을 말한다. 돌연변이는 매우 희박하게 일어난다. 0.001의 확률로 일어난다.

 

 

갼략한 시나리오

-       염색체 집단에서 염색체를 염색체를 선택할 때마다 교차를 적용해야 하는지를 검사해야 한다. 교차 과정이 끝난 자식 염색체들은 돌연변이 적용 여부를 검사한다. , 자식 염색체의 각 비트들에 대해서 돌연변이 확률로 돌연변이를 적용한다.

 

 

 

 

상세 시나리오

1.     초기 염색체 집단을 임의로 생성합니다.

2.     인공 신경망을 훈련시키고 에러에 따라서 적응도를 부여한다. 인공 신경망이 커질수록 적응도를 삭감하는 것도 좋다. 이렇게 하면 적은 수의 뉴런과 연결을 가진 인공 신경망을 얻을 수 있다.

3.     선택 방법(적응도 비례 선택 혹은 토너먼트 선택 등)으로 두 개의 염색체를 선택한다. 선택된 염색체들은 부모가 된다.

4.     교차 연산자를 적용한다.

5.     돌연변시 연산자를 적용한다.

6.     새로운 집단이 원하는 크기의 다다를 때까지 3~5단꼐를 반복한다.

7.     만족스러운 인공 신경망을 얻을 때까지 2단계로 돌아간다.

 

실시간 진화 게임이 실행되는 동안 악당들을 진화시킬 수 있는 간단한 테크닉

              (악당들의 풀을 관리한다.)

 


 

시나리오

1.     게임에서 필요한 개체는 이 풀에서 만들어진다.

2.     게임에서 개체가 사라지는 즉시 새로운 개체가 게임으로 투입된다.

3.     , 게임에서 사라진 개체보다 적응도가 높은 개체를 선택하여(퓰에 있는 최소 적응도보다 낮으면 풀에 들어갈 수 없다) 돌연변이를 적용한 다음 그것을 게임에 투입한다.




참고 - 쉽게 풀어 쓴 인공지능 게임 프로그래밍  (정보문화사)

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

유전알고리즘(2)  (0) 2010.06.21
영향력 분포도  (0) 2010.06.10
연결리스트를 이용한 이진트리의 순회방법  (0) 2010.05.14
트리의 배열표현 방법  (0) 2010.05.14
큐 만들기  (0) 2010.05.14
Posted by 아몰라

입력 파일은 여러 줄로 구성되며 표시될 각각의 숫자마다 한 줄씩 입력된다. 각 줄에는 s와 n이라는 두 개의 정수가 들어있으며 n은 출력될 숫자(0<=n<=99,999,999), s는 숫자를 표시하는 크기(1<=s<=10)를 의미한다. 0이 두 개의 입력된 줄이 있으면 입력이 종료되며 그 줄은 처리되지 않는다.

기본적인 문법이나 활용하는면에서 많이 미숙함을 느꼈던 문제

프로그래밍을 많이안해봐서 그런듯하다. 책보단 역시 코딩을 해봐야되는거같다 -_-

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

큐 만들기  (0) 2010.05.14
스택만들기  (0) 2010.05.13
여행(The Trip)  (0) 2010.05.11
지뢰찾기  (0) 2010.05.03
3n+1  (0) 2010.05.03
Posted by 아몰라
일년에 한번 씩 다른 여행지로 여행을 가는 학생 모임이 있다. 이 학생들은 여행 경비를 모두 똑같이 부담하기로 합의했지만 돈을 쓸 때마다 나눠서 내는 것은 별로 실용적이지 못하다. 그래서 한명씩 식비, 호텔비, 택시비, 비행기표를 부담하기로 한다. 여행이 끝난 후에 각 학생이 지출한 내역을 계산한 다음 1센트 단위 내에서 모든 학생들이 쓴 돈이 같도록 돈을 주고 받는다. 하지만 이전 여행의 경험에 비추어보면 돈을 주고 받는 과정은 정말 지루하고 오랜 시간을 요하는 작업이었다. 지출 내역이 주어졌을 때 모든 학생이 쓴 돈이(1센트 단위 내에서)똑같아지기위해 전달되어야 하는 최소 액수를 구해보자.

각 여행에 대해 각 학생이 사용한 금액이 똑같아지기 위해 전달되어야 하는 금액의 총합을 출력한다.

입력                      출력
3                           10.00
10.00                      12.00
20.00
30.00
4
15.00
15.01
3.00
3.01



재밌는 문제였던거같다. 처음에는 엄청 간단해보였는데 문제를 잘못이해해서 아주 쉽게 생각했었다.
이 문제의 해결은 학생들의 평균을 구해서 그 값보다 큰 것들을 모두 더하면 금액이 같아지기위해서 이동하는 돈의 총액이 된다. 가장 문제였던게 계산후에 자리수를 맞추기위해 반올림을 할려고 했는데 c랑 c++에서는 반올림 함수를 제공해주지 않는걸 몰라서 찾는데 시간이 좀 걸린것같다.

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

스택만들기  (0) 2010.05.13
LCD 디스플레이  (0) 2010.05.13
지뢰찾기  (0) 2010.05.03
3n+1  (0) 2010.05.03
스케줄링 (라운드 로빈)  (0) 2009.12.17
Posted by 아몰라

각 칸에는 최대 여덟 개의 인접한 칸이 있을 수 있다. 아래에서 왼족에 있는 4*4지뢰밭에는 두 개가 있으며 각각은 '*'문자로 표시되어 있다. 이 지뢰밭을 방금 설명한 힌트 숫자로 표기하면 오른쪽에 있는 것과 같은 필드가 만들어진다.


입력                  출력
4 4 
*...                   *100
....                    2210
.*..                   1*10
....                    1110




일단 허접한 알고리즘으로 하긴했는데

두가지 문제점이 있다.

1. 해당 값이 * 일 경우 주변 값도 * 이면 *에 +1을 하지 못하도록 하여야한다.

2. 위에서 . * .
         -> . . . 가장 왼쪽에 점의 경우에 그 점이 지뢰라고하면 그 주위에 값들이 +1을 하게 알고리즘이 구성되었는데 저 위치 같은 경우에는 왼쪽에 아무것도 없는 벽이라는것을 표현해줘야한다. 그것이 안되어서 상단 오른쪽에 값이 엉뚱하게 들어가 버린다.


             . * .

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

LCD 디스플레이  (0) 2010.05.13
여행(The Trip)  (0) 2010.05.11
3n+1  (0) 2010.05.03
스케줄링 (라운드 로빈)  (0) 2009.12.17
병합정렬 & 퀵 정렬 비교 및 기수정렬  (0) 2009.12.17
Posted by 아몰라

이러한 알고리즘이 있다.

n= 10 이면

10 ,5, 16, 8, 4, 2, 1    cnt = 7 (사이클길이)

짝수이면 n/2 로 나누고 , 홀수이면 3n+1 로 한다.

이 알고리즘을 적용을하면 결국에 n 은 1에 이르게 된다.

이 가설은 적어도 1000000까지의 정수에 대해서는 참이라고 한다.


이제부터 문제다.

어떠한  두 정수를 입력받는다.

0~1000000까지만 값을 입력받을수 있도록 하고

예를 들어 1 , 10 을 입력받는다 그러면 1 ~10 사이에 대해 최대 사이클 길이를 구하면 된다.

입력예     출력 예
1 10        1 10 20
100 200   100 200 125


먼저 입력 받는 수를 a와 b 라고 하고 a에 대한 알고리즘을 구했고 그 다음에 a+1 에 대한 결과와 비교하고

또 a+1과 계속 비교해가면서 b까지 비교해서 가장 큰 최대사이클을 구하는 방식으로 하였다.

생각보다 알고리즘 문제 재밌는거 같다 ㅋㅋㅋ

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

여행(The Trip)  (0) 2010.05.11
지뢰찾기  (0) 2010.05.03
스케줄링 (라운드 로빈)  (0) 2009.12.17
병합정렬 & 퀵 정렬 비교 및 기수정렬  (0) 2009.12.17
연결리스트더미有  (0) 2009.12.16
Posted by 아몰라
이전버튼 1 이전버튼