Min-Max, 나무 및 가지 치기, 휴리스틱 및 기타 기본 개념에 대해 이미 알고 있다고 가정하고 여기에 쓰는 내용은 과소 평가되었을 수있는 세부 사항 일뿐입니다.
나는 회사와 친구가 때때로 우리 자신의 체스 엔진을 썼다. 우리가 가진 몇 가지 문제와 아이디어를 공유했으며 유용하다고 생각합니다.
우리 둘 다 자바 프로그래머이기 때문에 우리 언어는 우리를 자바로 바꾸었고 객체 지향 접근법으로 시작했습니다. 조각은 대상, 보드는 대상, 파일 및 순위 (체스 문학의 행과 열)는 대상이었습니다. 그리고 이것은 틀렸다. 오버 헤드는 엄청 났고 프로그램은 검색 트리에서 2 이동 (4 플라이) 이상 진행하기 위해 고심하고있었습니다.
그래서 몇 가지 검색으로 우리는 훌륭한 아이디어 (우리는 아니지만!)로 끝났습니다 : 조각과 보드를 긴 정수 (64 비트)로 나타냅니다. 이것은 체스 판에 64 개의 사각형이 있기 때문에 의미가 있습니다. 나머지는 약간 현명한 작업이었습니다 (cpu에 매우 가깝게 실행 = 매우 빠름). 예를 들어, 이진 64 비트 정수는 조각이 공격 할 수있는 사각형을 보드에 표시합니다. 이제 이와 같이 두 숫자 사이에 논리적 "AND"를 실행하면 0이 아닌 결과는 공격자와 사각형이 있음을 나타냅니다. 체스 판과 조각을 제시하는 방법에는 여러 가지가 있습니다.
1- 보드 프리젠 테이션 결정
그런 다음 데이터베이스가 필요합니다. 체스 오프닝은 어떻게 든 개미를 풀고 개미를 가지고 개설하는 것이 좋습니다. 이 경우, 블리츠 게임에 많은 시간이 필요합니다.
2-첫 책을 찾으십시오.
우리는 이런 일을했지만 여전히 우리는 선하지 못했습니다.
3-좋은 체스 엔진은 6 번의 움직임 (12 플라이)을 볼 수 있어야합니다.
그래서 우리가 한 일은 데드 타임을 사용하는 것이 었습니다 (사람 대 컴퓨터 엔진 인 경우).
4-상대가 당신의 나무를 어느 정도 만들려고 생각하는 시간을 사용하십시오.
그리고 여전히 우리는 12 겹에서 멀리 떨어져있었습니다. 더 많은 연구를 통해 몇 가지 요령을 발견했습니다! 예를 들어 나무의 한 겹을 건너 뛰고 다음 겹에서 시작하는 것이 좋습니다 (상대자가없는 것처럼). 아이디어가 움직임이 극도로 관용적이라면 왜 시간을 낭비하고 상대방이 그 움직임에 반응 하는지를 보는 것입니다. 그러나 하나의 좋은 엔진은 관용적 행동과 천재 여왕 희생을 구별 할 수 있어야합니다.
5- 이 특정 문제 (체스)에 대한 프로그래밍 요령 을 배웁니다 .
이 상태에서 나와 나와 친구는 여전히 나빴습니다. 위치를 계산하는 경우 나중에 저장하십시오! 검색 트리에서 for 루프도 마찬가지입니다. 요점은 효율적으로 저장 / 검색하는 것이 었습니다.
6-생성 한 데이터를 효율적으로 저장하십시오!
그리고 마지막으로:
7-최대 최적화 코드.
이 문제는 CPU 시간과 메모리 모두에서 매우 비쌉니다. 코드를 매우 효율적으로 작성하는 것이 매우 중요합니다. 분기 요소 35에 대해 이야기하고 있음을 기억하십시오. 이는 휴리스틱 어딘가에서 3.3792205e+18
쓸모없는 "if"가 검색 트리의 깊은 곳에서 쓸모없는 "if" 로 바뀔 수 있음 을 의미합니다.
체스 프로그래밍은 매우 흥미로운 과제이며 프로그래밍 기능을 심각한 테스트에 넣을 수있는시기입니다. 내가 제안 할 수있는 몇 가지 사항이 더 있지만 직접 발견 할 것이라고 확신합니다. 내가 모르는 더 많은 포인트가 있지만 인터넷에서 찾을 수 있습니다!
행운을 빌고 재미있게 보내!
추신 : 나는 자바 스크립트를 잘 모르지만 무언가가 문제의 어려움에 기초하고 있다고 말할 수 있습니다. 아마도 C ++이 제공 할 수있는 모든 것을 고려하면 자바 스크립트를 삭제하고 C ++ 로하는 것이 더 좋습니다.