8

我正在尝试用 Python 编写一个简单的 A* 求解器,用于一个简单的 8-Puzzle 游戏。我以这种方式表达了我的游戏目标:

goal = [[1, 2, 3],
        [8, 0, 4], 
        [7, 6, 5]]

我的问题是我不知道如何为我的目标编写一个简单的曼哈顿距离启发式。我知道它应该被定义为通用状态和我的目标状态之间的距离之和。我想我应该编写如下代码:

def manhattan_distance(state):
    distance = 0
    for x in xrange(3):
        for y in xrange(3):
            value = state[x][y]
            x_value = x
            y_value = y
            x_goal = ...?
            y_goal = ...?
            distance += abs(x_value - x_goal) + abs(y_value - y_goal)
    return distance

我的问题是我没有明确表示目标状态下棋子的坐标,所以我不知道如何为棋盘的“价值”棋子定义“x_goal”和“y_goal”。我正在尝试使用除法和模块操作来做到这一点,但这很困难。

你能给我一些提示来定义我的“x_goal”和“y_goal”变量吗?

谢谢

4

4 回答 4

1

曼哈顿距离是与曼哈顿相似的道路上的出租车距离。你的公式是对的

distance += abs(x_value - x_goal) + abs(y_value - y_goal)

x_value, y_value你在哪里x_goal, y_goal,你想去哪里。

这个使用 mhd 的实现使用了这个启发式方法:在当前位置由每个 '12346578' 的索引定义的点和由每个 '12346578' 的索引定义的点之间的 mhdgoal

def h(self, node):
    """Heuristic for 8 puzzle: returns sum for each tile of manhattan
    distance between it's position in node's state and goal"""
    sum = 0
    for c in '12345678':
        sum =+ mhd(node.state.index(c), self.goal.index(c))
    return sum

还没试过。也许链接有一些帮助。

于 2013-05-01T13:46:07.200 回答
1

您可以找到大多数 pythonic 实现。

假如说,

0 1 2

3 4 5

6 7 8

是目标状态...并且,

1 5 3

4 2 6

7 8 9

是最终状态。

initial_state = [1,5,3,4,2,6,7,8,0]
goal_state = [0,1,2,3,4,5,6,7,8]
def calculateManhattan(initial_state):
    initial_config = initial_state
    manDict = 0
    for i,item in enumerate(initial_config):
        prev_row,prev_col = int(i/ 3) , i % 3
        goal_row,goal_col = int(item /3),item % 3
        manDict += abs(prev_row-goal_row) + abs(prev_col - goal_col)
    return manDict

我不知道还能如何解释这一点。它只是工作。享受 !:D

于 2018-10-25T19:13:50.007 回答
0

我遇到了与您完全相同的问题,我通过编写一个不同的函数来解决它,该函数采用您拥有的表示并将其转换为您确定的表示(值/坐标对的字典)。

def make_dict(state):
    coordinate_dict = {}
    for x, row in enumerate(state):
        for y, value in enumerate(row):
            coordinate_dict[value] = (x, y)
    return coordinate_dict

这样,您就可以两全其美。每当您想将网格视为网格时,都可以使用原始列表形式,但如果您只需要快速查找曼哈顿距离函数的值,您可以使用新的字典已创建。

于 2013-11-24T23:24:04.490 回答
0

你也许可以使用它

def manhatan_dist(board,goal_stat):
    #Manhattan priority function. The sum of the Manhattan distances 
    #(sum of the vertical and horizontal distance) from the blocks to their goal positions, 
    #plus the number of moves made so far to get to the search node.
    import math
    b = board
    g = goal_stat

    manh_dist = 0
    for i in range (0,3,1):
        for j in range (0,3,1):
            bij = b[i][j]
            i_b = i
            j_b = j

            i_g, j_g = value_index(g,bij) 

            manh_dist += (math.fabs(i_g - i_b) + math.fabs(j_g - j_b))

    return manh_dist
于 2017-06-08T04:33:27.343 回答