오목 AI 알고리즘 6 편 - 반복 심화
AI 가 최 적 화 를 찾 지 못 했 습 니 다.
앞의 모든 알고리즘 에 따라 이 루어 진 후에 (물론 계산 살 포함 되 지 않 음) 비교적 심각 한 문 제 를 발견 할 수 있다. 바로 컴퓨터 가 자신 이 이미 승산 이 있 는 상황 에서 (쌍 삼 같은 바둑 은 갈 수 있다) 4 와 같은 바둑 을 가지 고 놀 수 있다 는 것 이다
.이런 주 법 이 나타 난 본질은 지금의 AI 가 최종 결과 만 비교 하고 경로 의 장단 점 을 고려 하지 않 았 기 때문이다.그래서 6 층 에서 하나, 둘, 셋 을 검색 하기 쉬 우 며, 사실 4 층 에 도 하나, 둘, 셋 이 있 는데, 점수 가 같 기 때문에 AI 가 무 작위 로 하 나 를 선택 하기 때문이다.2 보 로 이 길 수 있 는데 도 AI 가 굳이 3 보 를 걷 게 되면 서 게이머 들 에 게 는 사람 을 희롱 하 는 느낌 이 들 었 다.그래서 여기 서 우 리 는
의 개념 을 정의 한다. 점수 가 가장 높 은 방법 중 경로 가 가장 짧 은 방법 이다.그렇다면 지금 문 제 는 우리 가 어떻게 최 적 화 를 찾 느 냐 하 는 것 이다.반복 심화
우 리 는 AB 검색 을 통 해 모든 최고 분 주 법 을 찾 을 수 있다. 직관 적 인 생각 은 우리 가 모든 방법 을 찾 은 다음 에 그들의 길 이 를 비교 하고 길이 가 가장 짧 은 방법 을 선택 하 는 것 이다.
이것 은 확실히 방법 이지 만 우 리 는 효율 적 이 고 높 은 방법 을 찾 을 수 있다. 바로
을 통 해 최 단 경 로 를 우선적으로 찾 는 것 이다.교체 심화 란 2 층 부터 승리 의 방법 을 찾 거나 깊이 제한 에 도달 할 때 까지 검색 깊이 를 점차 늘 리 는 것 이다.예 를 들 어 우리 가 6 층 깊이 를 검색 하면 우 리 는 먼저 2 층 을 시도 하고 이 길 수 있 는 방법 을 찾 지 못 하면 4 층 을 시도 하고 마지막 으로 6 층 을 시도 한다.우 리 는 짝수 층 만 시도 한다.홀수 층 은 사실 컴퓨터 가 게이머 보다 한 걸음 더 걸 었 기 때문에 게이머 들 의 수 비 를 무시 하고 더 좋 은 해법 을 찾 지 못 할 것 이다.
그래서 이 알고리즘 을 실현 하 는 것 은 매우 간단 하 다.
var deeping = function(board, deep) {
deep = deep === undefined ? config.searchDeep : deep;
//
// , , ,
var result;
for(var i=2;i<=deep; i+=2) {
result = maxmin(board, i);
if(math.greatOrEqualThan(result.score, SCORE.FOUR)) return result;
}
return result;
}
이곳 은 한 층 의 검색 을 줄 이기 위해 살 아 있 는 4 만 검색 하면 최고 점 수 를 받 았 다 고 생각한다.
반복 심화 의 우세
교체 심 화 는 가장 좋 은 해 를 찾 는 동시에 아주 작은 추가 시간 비용 만 증가 하고 심지어 비용 을 줄 일 수 있다.만약 에 우리 가 평균 50 가지 선택 을 한다 면 4 층 검색 은 6 층 검색 1 / 2500 분 의 1 의 시간 만 필요 하 다 는 것 을 증명 할 수 있 습 니 다. 그래서 우리 가 추가 로 진행 하 는 얕 은 층 검색 은 모두 결 과 를 찾 지 못 하 더 라 도 무시 할 수 있 는 시간 을 추가 로 증가 시 켰 습 니 다.또 얕 은 층 의 검색 으로 최 적 화 를 찾 을 수 있 으 며 효율 을 극 대화 할 수 있다.
이에 비해 전체 최고 분 해 를 검색 하고 경로 의 길 이 를 비교 하면 시간 복잡 도가 배로 증가한다.
집산 살
교체 가 깊 어 진 후에 우 리 는 통합 적 으로 계산 하여 죽 일 수 있다. 첫 번 째 단 계 는 계산 알고리즘 도 교체 심화 로 개조 하여 매번 계산 하여 찾 는 것 이 가장 좋 은 해 임 을 확보 해 야 한다.
var c = function(board, role, deep) {
deep = deep || config.checkmateDeep;
if(deep <= 0) return false;
var start = new Date();
debugNodeCount = 0;
//
for(var i=1;i<=deep;i++) {
var result = max(board, role, i);
if(result) break; //
}
var time = Math.round(new Date() - start);
if(result) console.log(" ("+time+" , "+ debugNodeCount + " ):" + JSON.stringify(result));
else {
//console.log(" ("+time+" )");
}
return result;
}
그리고 우 리 는 검색 한 잎 노드 에서 계산 살 해 를 할 수 있다.잎 노드 가 많 기 때문에 잎 노드 가 계산 살 을 넣 으 면 검색 시간 이 길 어 집 니 다.
var negamax = function(board, deep, alpha, beta, role) {
var v = evaluate(board);
count ++;
if(deep <= 0 || win(board)) {
return v;
}
var best = MIN;
var points = gen(board, deep);
for(var i=0;i<points.length;i++) {
var p = points[i];
board[p[0]][p[1]] = role;
//pvs
/*var pv = - negamax(board, deep-1, -alpha-1, -alpha, R.reverse(role));
if(math.littleThan(pv, alpha) {
PVcut ++;
board[p[0]][p[1]] = R.empty;
//console.log(pv, alpha);
return pv;
}*/
alpha = Math.max(best, alpha);
var v = - negamax(board, deep-1, -beta, -alpha, R.reverse(role));
board[p[0]][p[1]] = R.empty;
if(math.greatThan(v, best)) {
best = v;
}
if(math.greatOrEqualThan(v, beta)) { //AB
ABcut ++;
return v;
}
//
if( (deep <= 2 ) && role == R.com && math.littleThan(best, SCORE.FOUR) && math.greatThan(best, SCORE.FOUR * -1)) {
var mate = checkmate(board, R.com);
if(mate) {
return SCORE.FIVE * Math.pow(.8, mate.length);
}
}
}
return best;
}
상기 코드 에서 우 리 는 AI 자신 에 게 만 계산 살 해 를 했 고 게이머 에 게 계산 살 해 를 하지 않 았 다. 주로 현재 의 계산 살 해 는 효율 이 비교적 낮 기 때문에 게이머 에 게 도 계산 살 해 를 하면 시간 이 배로 증가 할 수 있다.
또한 상기 극 대 극소 치 검색 은 마이너스 극 대 치 검색 으로 바 뀌 었 으 나 원리 적 으로 다 르 지 않 고 코드 만 더욱 간결 하고 통일 되 었 다.
현재 의 계산 살 과 검색 효율 로 4 + 7, 즉 4 층 마이너스 극 대치 검색 에 7 층 계산 살 을 더 하면 기력 이 이전 보다 뚜렷하게 향상 된다.
내부 반복 심화
위 에서 말 한 교체 심 화 는 마이너스 최대 치 검색 에 대해 한 층 의 포장 만 했 을 뿐 사실은 좀 더 깊이 있 을 수 있 습 니 다. 매번
negamax
검색 에 대해 교체 심 화 를 했 습 니 다. 구체 적 인 효 과 는 아직 검증 되 지 않 았 습 니 다. 관심 이 있 으 면 시도 해 보 겠 습 니 다. 나중에 저도 이 방법 을 시도 해 보 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Codility Lesson3】FrogJmpA small frog wants to get to the other side of the road. The frog is currently located at position X and wants to get to...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.