바둑이나 체스, 오목같은 턴제 대전게임에서 사용되는 기법들 중에서 기반이 되는 알고리즘은 최소최대 알고리즘(MinMax Algorithm)과 이를 약간 고도화한 알파-베타 가지치기 알고리즘 (Alpha-Beta pruning Algorithm)이다.
위와 같은 게임들은 분명한 것은 이기기 위해서 "나"는 내가 "최대"의 이익을 얻을 수 있는 방향으로 움직이며 "상대방"은 나의 이익이 "최소"로 하는 방향으로 움직여야한다. 그래야 서로가 이길 수 있으며 그런 방식으로 수읽기를 한다.
MinMax 알고리즘은 다음과 같이 구현될 수 있다. 아래 코드는 DFS이다.
Max_value(Node)는 v에 가장 작은 수로 넣어놓고 모든 노드를 탐색해서 가장 최대의 수를 찾는 것이고 Min_value(Node)는 v에 가장 큰 수를 넣어놓고 모든 노드 중 가장 작은 수를 찾는다. 이는 서로 Cross하면서 recursive하게 구현하는 것이 핵심이다.
아래의 예를 보자.
Max는 "나"이고 다음 수에서 최대의 이익을 얻는 수를 둔다. Min은 "상대방"이고 "나"의 이익이 최소화 하는 수를 둔다. (서로 최선을 다한다는 가정하에)
그럼 결국 다음처럼 수 읽기를 하면 될 것이다.
탐색은 왼쪽에서 오른쪽으로 이루어진다고 하자.
이를 약간 발전시킨 방식이 Alpha-Beta pruning이다. (알파 베타 가지치기라고 부른다.)
필요없는 search를 없애는 즉 가지치는 방식으로 동작한다고 하여 Alpha-Beta pruning이다.
Alpha : 클수록 나에게 유리하다.
Beta : 작을수록 나에게 불리하다.
내 차례(Max)에서 beta cut : Value가 beta보다 크거나 같을 때, ( V >= beta )
상대방 차례(Min)에서 alpha cut : Value가 alpha보다 작거나 같을 때, ( V<= alpha )
왼쪽->오른쪽으로 탐색을 한다고 하면 Min의 경우에 2번째 depth(2->2,4,6)에서 2를 먼저 탐색을 했으니 나머지 4와 6은 볼 필요가 없으니 cut한다는 것이다.
알고리즘은 다음과 같다.
Maximum node에서 𝛼에 그 노드의 child 값 중에서 가장 큰 값을 저장하고, Minimum node에서 𝛽에 그 노드의 child 값 중에서 가장 작은 값을 저장한다.
만약 Minimum node k 에서 현재 𝛽 값이 𝛽 ≤ 𝛼 이 되면 root node에서 현재 node k 까지 경로에서 Maximum node의 가장 큰 값이 𝛼 가 되므로 node k 이하는 더 체크할 필요가 없다.
반대로 만약 Maximum node I 에서 현재 𝛼값이 𝛽 ≤ 𝛼 이 되면 root node에서 현재 node I 까지 경로에서 Minimum node의 가장 작은 값이 𝛽가 되므로 node I 이하는 더 체크할 필요가 없다.
2019년 10월 19일 토요일
2019년 10월 10일 목요일
[ERROR] HdfsBridge::recordReaderFillBuffer - Unexpected error encountered filling record reader buffer: ClassCastException:
Polybase로 EXTERNAL TABLE을 만드려고 할 때 다음과 같은 에러가 발생했다.
HdfsBridge::recordReaderFillBuffer - Unexpected error encountered filling record reader buffer: ClassCastException:
원인은 confidence 컬럼의 DECIMAL 타입이 문제였고 confidence이 부동소수점으로 간주되어 DECIMAL(NUMERIC) 타입을 사용할 수가 없는 것이었다.
이를 근사치를 표현하는 부동소수점 표현 타입인 FLOAT으로 바꾸면 바로 해결이 된다.
아래처럼 FLOAT 형식으로 바꾸어서 실행한다.
결과는 다음처럼 잘 나온다.
그래도 같은 에러가 떨어진다면 이상한 문자가 섞여있는 것으로 추정할 수 있다.
예를 들어서 float형식에 2.0834406E-5 같이 E가 섞여서 들어온다면 같은 문제가 발생한다.
저런 경우 E를 제거하고 0.00002083441 식으로 넘기던지 하면 해결될 것이다.
(예외상황 제보해주신 김현경님 감사합니다.)
HdfsBridge::recordReaderFillBuffer - Unexpected error encountered filling record reader buffer: ClassCastException:
이를 근사치를 표현하는 부동소수점 표현 타입인 FLOAT으로 바꾸면 바로 해결이 된다.
아래처럼 FLOAT 형식으로 바꾸어서 실행한다.
결과는 다음처럼 잘 나온다.
그래도 같은 에러가 떨어진다면 이상한 문자가 섞여있는 것으로 추정할 수 있다.
예를 들어서 float형식에 2.0834406E-5 같이 E가 섞여서 들어온다면 같은 문제가 발생한다.
저런 경우 E를 제거하고 0.00002083441 식으로 넘기던지 하면 해결될 것이다.
(예외상황 제보해주신 김현경님 감사합니다.)
피드 구독하기:
글 (Atom)
2022년 회고
올해는 블로그 포스팅을 열심히 못했다. 개인적으로 지금까지 경험했던 내용들을 리마인드하자는 마인드로 한해를 보낸 것 같다. 대부분의 시간을 MLOps pipeline 구축하고 대부분을 최적화 하는데 시간을 많이 할애했다. 결국에는 MLops도 데이...
-
MSSQL에는 저장프로시저가 아주 강력하고 문법 자체도 편하기(?) 때문에 토이프로젝트를 진행할 때 DB를 MSSQL을 주로 사용한다. 본인 노트북, 혹은 데스크탑에 MSSQL을 설치하고 SSMS로 접속을 하려고 할 때 서버이름에 loc...
-
화면에서 프린트 기능을 구현했는데 글자들은 잘 나오지만 CSS가 안먹는 경우가 간혹 발생했다. 마크업된 CSS를 불러오지 못해 발생하는 문제로 판단했고 약간의 트릭으로 해결할 수 있었다. 아래는 구현된 화면이다. 이 화면을 출력하고자 다...
-
요즘같이 디스크 용량 걱정이 없는 세상에서는 MSSQL Shrink를 볼 일이 없을 것 같았는데 얼마 전 회사에서 SHRINK를 할 일이 생겨서 진행했었다. 디스크 용량이 약 4테라이고 해당 디스크는 db file만 존재하여 딱히 지울 파일이 없었...