2017-05-14 9 views
2

두 개의 타일 tj와 tk가 tj와 tk가 같은 라인에있는 경우 선형 충돌이 발생하면 tj와 tk의 목표 위치는 모두 해당 라인에 있고 tj는 오른쪽입니다 tk의 목표 위치와 tj의 목표 위치는 tk의 목표 위치의 왼쪽에있다.선형 충돌이 허용을 위반하고 나를 미치게 함

선형 충돌로 인해 서로 충돌하는 두 타일의 맨하탄 거리가 서로를 둘러싸도록하여 두 개 이상의 움직임을 추가합니다. 따라서 휴리스틱 함수는 충돌하는 각 쌍의 타일에 대해 2 개의 이동 비용을 추가합니다.

Linar 충돌 휴리스틱 스는 허용되지만, 때때로 사용하고있는 알고리즘이 허용 가능성을 위반하여 비관적이며 반드시 최적의 위치를 ​​찾지는 못합니다. 가 [3, 1, 2]

의 [1을 가정 해 봅시다 우리가 구성이 하나의 행에 초점을 맞추고있다 말 : 때

private int linearVerticalConflict(State s) { 
    int state[] = s.getState(); 
    int dimension = (int) Math.sqrt(state.length); 
    int linearConflict = 0; 
    int count = 0; 
    for (int row = 0; row < dimension; row++) { 
     int max = -1; 
     for (int column = 0; column < dimension; column++) { 
      int cellValue = state[count]; 
      count++; 
      //int cellValue = newState[row][column]; 
      //is tile in its goal row ? 
      if (cellValue != 0 && (cellValue - 1)/dimension == row) { 
       if (cellValue > max) { 
        max = cellValue; 
       } else { 
        //linear conflict, one tile must move up or down to 
        // allow the other to pass by and then back up 
        //add two moves to the manhattan distance 
        linearConflict += 2; 
       } 
      } 

     } 

    } 
    return linearConflict; 
} 

private int linearHorizontalConflict(State s) { 
    int[] state = s.getState(); 
    int dimension = (int) Math.sqrt(state.length); 
    int linearConflict = 0; 
    int count = 0; 
    for (int column = 0; column < dimension; column++) { 
     int max = -1; 
     for (int row = 0; row < dimension; row++) { 
      int cellValue = state[count]; 
      count++; 
      //is tile in its goal row ? 
      if (cellValue != 0 && cellValue % dimension == column + 1) { 
       if (cellValue > max) { 
        max = cellValue; 
       } else { 
        //linear conflict, one tile must move left or right to allow the other to pass by and then back up 
        //add two moves to the manhattan distance 
        linearConflict += 2; 
       } 
      } 

     } 

    } 
    return linearConflict; 
} 

알고리즘은 적격성을 위반 : 여기

코드입니다 , 2, 3]은 목표 구성입니다.

문제의 총 맨하탄 거리 : 4 (3 동작 2 번, 1 동작 1 시간 및 2 동작 1 시간) 행에 대한 선형 충돌은 4입니다 (1과 2는 둘 다 3보다 작습니다. + 2 + 2)

(8)의 전체 휴리스틱 추정 결과

[3, 1, 2]

답변

3

선형 충돌 휴리스틱은 단지 2 개를 추가하는 것보다 더 복잡하다 6 움직임으로 해결 될 수있다 충돌하는 각 타일 쌍.

휴리스틱 알고리즘이도 5에 설명되고, 행의 모든 ​​충돌을 해결하는 별도의 이동의 최소 수를 계산하는 것을 포함 "Criticizing Solutions to Relaxed Models Yields Powerful Admissible Heuristics" by OTHAR HANSSON and ANDREW MAYER and MOTI YUNG in INFORMATION SCIENCES 63, 207-227 (1992)

설명한다. 당신이 발견했듯이, 이것은 충돌하는 쌍의 두 배와 같지 않습니다.

실제로 제시된 알고리즘은 다음

Begin {Algorithm LC} 
{ s is the current state} 
{ L is the size of a line (row or column) in the puzzle. L = sqrt(N + 1) 
{ C(tj, ri) is the number of tiles in row ri with which tj is in conflict} 
{ C(tj, ci) similarly} 
{ lc(s, rj) is the number of tiles that must be removed from row rj to resolve the linear conflicts} 
{ lc(s, cj) similarly} 
{ md(s, ti) is the Manhattan Distance of tile ti} 
{ MD(s) is the sum of the Manhattan Distances of all the tiles in s} 
{ LC(s) is the minimum number of additional moves needed to resolve the linear conflicts in s} 
For each row ri in the state s 
    lc(s, ri) = 0 
    For each tile tj in ri 
     determine C(tj, ri) 
    While there is a non-zero C(tj, ri) value 
     Find tk such that there is no 
      C(tj, ri) > C(tk, ri) { As tk is the tile with the most conflicts, we choose to move it out of ri } 
     C(tk, ri) = 0 
     For every tile tj which had been in conflict with tk 
      C(tj, ri) = C(tj, ri) - 1 
     lc(s, ri) = lc(s, ri) + 1 
{ Check similarly for linear conflicts in each column ci, computing lc(s, cj). } 
LC(s) = 2[lc(s, r1) + . .. + lc(s, rL) + lc(s,ci) + . . . + lc(s, cL)] 
For each tile tj in s 
    determine md(s, tj) 
MD(s) = ms(s, t1) + ... + md(s, tn) 
h(s) = MD(s) + LC(s) 

이 알고리즘은 경험적 선정 H (S)를 계산