2

포지션이 64 개 미만이거나 더 간단한 배열 기반 사서함 구현이 더 실용적 일 것이라는 점을 고려해보십시오.전략 보드 게임을위한 효율적인 보드 표현 AI

우리 학교의 AI 수업은 교수가 보드 게임을 만드는 연례 경쟁이 있으며 우리는 게임을하는 AI를 만드는 데 4 주가 걸립니다. 일반적으로 조각은 유사한 규칙을 가진 체스 조각의 하위 집합이며 작은 보드에서 재생됩니다. 즉 8x5, 7x7 등입니다. 저는 40 비트 만 사용하는 것이 체스의 전형적인 64와 어떻게 비교되는지 전혀 모릅니다.

내 유일한 문제는 C 또는 C++에 익숙하지 않아 Java로 프로그램을 구현하는 것이 더 편할 것이라는 점입니다. 비트 보드 표현을 구현할 수있는 비트 조작을위한 Java에서의 충분한 지원이 있습니까? 이것이 효율성을 추가 할 경우 추가 된 복잡성의 가치가 있습니까? 학습 곡선이 너무 가파릅니까?

내 계획은 시간에 따라 AB 가지 치기, 기본 검색, 전치 표, 살인자 이동 등과 같은 Negamax 검색을 사용하는 것입니다. 짧은 시간 내에 경쟁력있는 인공 지능을 만들 수있는 다른 방법은 없습니까?

답변

2

비트 보드가 작동하지만 내 생각에 제대로 작동하려면 추가 된 노력과 복잡성만으로는 나중에 컴퓨팅 효율을 향상시킬만한 가치가 없습니다. (심지어 또는 List 또는 Map)를 배열의 요소를 가져 오는하는 것은 주로 어떤 AI에 의해 가려 또는 알고리즘 검색 될 사물의 전체 규모에서

, 마스킹 비트 ( & 또는 |)에서 어떤 효율성을 통해 당신이 사용하고자하는 .

즉, 지수 또는 다항식 복잡도 알고리즘은 여전히 ​​O(e^n) 또는 O(n^d)을 사용하며 포인터 역 참조를 통해 이진 산술로 저장하는 몇 개의 CPU 사이클이 중요하지 않습니다.

이 시점에서 사용할 수있는 가장 쉬운 데이터 구조 (아마도 배열 또는 기타 Collection)를 사용하고 알고리즘 작동에 집중하십시오.

나중에 시간이 있다면 프로그램을 프로파일 링 할 수 있습니다. 그러면 배열 조회가 실행 시간의 20 %를 차지하는 것을 발견하면 모든 것을 비트 연산으로 리팩토링하는 것이 좋습니다.

개인적으로 솔루션 공간 검색을 병렬로 수행하거나 여러 CPU 코어를 최대화하거나 더 나은 방법으로 여러 컴퓨팅 노드에 분산 될 수있는 방법을 살펴 보겠습니다. 네, 정말 영리한 것을 발견하면 적어도 석사 학위를받을 자격이 있습니다. :)

+0

나는 더 간단한 방법으로 작업하게하고 나중에 시간과 성능에 따라 조정하는 아이디어를 좋아합니다. 게임 트리를 동시에 검색하면 내 다음 질문이됩니다. 제안에 감사드립니다. – npearson

+0

4-8 코어 머신에서 실행될 때 병렬 실행으로 얻는 이득은 비트 - 바이올린에서 얻을 수있는 이득 근처에 없습니다. 탭하는 것이 더 쉽지만 (예 : 어쨌든 기능적 스타일로 프로그래밍하는 경우). 그러나 방대한 병렬 처리는 비트 - 바이올린 (bit-fiddling)과 비교하여 매우 복잡합니다 (예 : GPU). – ziggystar

+0

당신은 알고리즘 최적화를 비트 - 바이올린 최적화보다 더 똑똑하게 만드는 방법에 대해서 더 많은 것을 배우게 될 것입니다. – ziggystar

0

비트 스케일에서 개별 비트를 설정하는 것은 부울 배열의 설정 요소보다 일반적으로 느립니다. 전자는 읽기 + 비트 AND/OR + 쓰기가 필요하고 후자는 쓰기 만 필요하기 때문입니다.

비트 스케일의 개별 비트 읽기도 느립니다 : 읽기 + 비트 AND/OR + 시프트와 읽기 전용.

AI에서 개별 보드 셀에 대해 많은 읽기/쓰기 상태가 필요한 경우 부울 배열이 더 효과적입니다. 동시에 보드가 적은 메모리를 사용할 때, 즉 셀이 비트로 패킹 될 때 전체 보드의 복제를 만드는 작업이 더 빠릅니다. AI가 보드를 자주 복제하고 복제 작업간에 몇 가지 get/set 작업 만 수행하면 보드 크기에 관계없이 비트 스케일이 더 좋습니다.

+0

좋은 make와 unmake move 기능을 구현한다면 보드를 전혀 복제 할 필요가 없습니다. 문제는 이동 세대에서 발생합니다 ... 나는 비트 보드를 사용하지 않고도 매우 신속하게 이동을 생성 할 수 있습니까? – npearson

1

대학에서 나는 AI 게임 대회를 당신과 비슷하게 만들었습니다. '정적으로 빠르게 코딩하는 것'이나 '프로그램을 느리게 할 것인가'와 같은 작은 minutae에 대해 걱정하지 않을 때 가장 빠른 스피드 업을 달성했습니다. 그러나 'AI를 더 스마트하게 작성하면 효율성이 향상되고이라는 수치가 수준으로 향상 될 것이므로이 멋진 트릭을 구현할 것입니다.'

비틀 거리는 속도 향상의 일반적인 예는 알파 베타 제거, 킬러 경험적 발견 및 게임 상태의 강도 계산을위한 좋은 알고리즘 선택입니다 (좋은! = 더 정확함 - 더 빠르고 정확한 의미도 있음). 점수 계산이 더 간단하면 더 많은 움직임을 볼 수 있습니다. 즉, 스페이드에서이를 보상합니다.

+0

평가를 더 빠르고 정확하게 만드는 것이 더 좋습니까? 둘 다 좋은 균형이 맞습니까? – npearson

+0

그런 종류의 질문은 서로에 대해 서로 다른 봇을 피팅하고 어떤 이닝을 볼 수 있는지에 의해서만 대답 될 수 있습니다. :) – Patashu

1

비트 보드를 사용할 수도 있습니다. 실제로 그렇게 복잡한 것은 아니며 이동 생성 및 정적 교환 평가에서 상당한 속도 향상을 얻습니다. AI 알고리즘은 아무리 똑똑하더라도 아무리 많은 것을 할 필요가 있습니다. 당신의 보드 이후 chessprogramming.wikispaces.com/Bitboards

몇 가지 트릭 당신이 사각형에 비트를 할당하는 방식에 따라 적용되지 않을 수 있습니다 다른 크기 : 주제에 아주 좋은 웹 사이트가있다

. 반면에 조각의 부분 집합이기 때문에 비트 보드로 해결하기 위해 전통적으로 문제가되었던 몇 가지 문제가 존재하지 않을 수 있습니다.

관련 문제