상하좌우 중에서 3면 이상이 정위치에 있는 블럭 혹은 벽으로 막혀 있을 때 그 위치에 블럭을 넣으려면 반드시 이미 자리 잡은 블럭중 하나를 움직어야 됨.
그래서 3면 이상이 막힌 자리가 존재하지 않게 만들기 위해서 움직여야 하는 블럭의 갯수*2 를 맨하탄 휴리스틱에 더해도 admissible heuristic이 될거임.
위치를 옮겼다가 다시 제자리에 놓아야 하니까 *2를 하는거고.
문제는 linear conflict랑 같이 쓰려면 골아플듯.
linear conflict 자체도 여러개 있을때 서로 충돌하는것 때문에 카운팅 하기 어려워 보이던데.
그리고 당장 고쳐야될게 너무 많아 ㅋㅋ 이거 이번주 안으로 해보기 힘들것 같아.
(예시)
1 3 * *
8 6 * *
9 5 * *
* * * *
이렇게 되있으면 1, 6, 9를 움직이지 않고 8을 꺼낼 방법이 없잖아.
셋중에 적어도 2개는 움직여야 8을 꺼내고 그 자리에 5를 넣을 수 있음.
2개를 움직였다가 다시 제자리로 놓으려면 최소 2*2 = 4번을 더 움직여야 함.
따라서 (h_manhattan + 4)를 휴리스틱으로 쓸 수 있음.
님 너무 똑똑해서 이해 안 됨 - 우끽끼
예시 써봄
linear conflict는 또 뭐임? - 우끽끼
한 줄 위에 x, y, x의 정위치, y의 정위치가 있을 때 x y순서랑 정위치들의 순서가 거꾸로면 x y중 적어도 한개를 그 줄 바깥으로 옮겼다가 다시 가져와야됨.
그래서 linear conflict가 한개 있으면 적어도 2번을 추가로 움직여야 함.
문제는 줄 1개에 linear conflict가 2개 있으면 추가로 4번이 아니라 2번만 움직여도 되는 경우가 있음
그래서 그런거 다 고려하면 꽤 복잡해보이더라고
역시 님은 똑똑한 듯 ㅇㅅㅇ - 우끽끼
설명 고마워 - 우끽끼