[2017 삼성 육목대회] 12. 하루종일 삽질

속도를 조금 더 개선하기 위해 myBoard를 함수 내의 지역 변수로 copy해서 작업하는 대신 함수의 인자로 받은 2차원 포인터를 통해 직접 myBoard를 건드리고자 했습니다. 이러면 copy하는 시간(361개를 copy해야하고 생각보다 빈번해서 시간을 꽤 많이 잡아먹는다고 생각함)을 절약하니까 더 빨라질 줄 알았는데 전혀 그렇지 않고 도리어 속도가 4배에서 심하게는 10배 가까이 느려졌습니다. 구현에서 실수를 했나 싶어서 코드를 꼼꼼히 살펴보았는데 딱히 그런 것도 없었습니다.


현재 스택에서 멀리 떨어진 곳의 변수를 다룰 때 속도가 급격하게 느려지는 것 같다는 심증만 있을 뿐 정확히 왜 이런 일이 발생했는지는 잘 이해가 가지 않습니다. 어쩔 수 없이 코드를 싹 밀고 원상태로 되돌렸습니다.


그리고 승리조건이 만족될 때 턴을 줄이는 것, 시간을 넘겼을 때 현재 보고있는 탐색 대상은 무시하는 것 등을 짰는데 (-1, -1), (-1, -1)을 기록하라는 명령이 계속 발생했고 왜 이런 오류가 발생했는지 도저히 찾을 수가 없어서 어쩔 수 없이 Find_BestDoubleMovesByDepthSearch 함수도 갈아엎었습니다.


결국 하루종일 한거라고는 유전 알고리즘 결과를 본 것과, 이것저것 짰다가 오류나서 되돌린 것 밖에 없네요. 멘탈 잡고 내일부터는 다시 개선을 해나가야겠습니다.


-------------------------------------------


자기 전에 마지막으로 시도해본다는 생각으로 Find_BestDoubleMovesByDepthSearch를 다시 확인해봤는데 잘못된 점을 찾았습니다. tmpMax의 초기값을 -10000000으로 뒀는데 현재 내가 필패일 때 계산 과정에서 -10000000보다 값이 작아질 수 있어서  (-1, -1), (-1, -1)이 반환되었습니다. 기분 좋으면서도 살짝 허탈하네요.


현재까지 Breadth = 5, Depth = 6까지 시간 내에 통과됩니다. 유전 알고리즘 결과가 어느정도 수렴하는 것으로 보여지면 Factor를 확정하고 Breadth, Depth를 얼마로 할지 고민해봐야겠네요. 아직까지는 1위가 승률 60~70%, 16위가 승률 40%여서 편차가 큰 편입니다.

  Comments