在8难题游戏中使用Python计算曼哈顿距离

Joh*_*hnQ 6 python puzzle search a-star

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

goal = [[1, 2, 3],
        [8, 0, 4], 
        [7, 6, 5]]
Run Code Online (Sandbox Code Playgroud)

我的问题是我不知道如何为目标编写简单的“曼哈顿距离”启发式方法。我知道应该将其定义为一般状态与目标状态之间的距离之和。我认为我应该编写类似以下内容的代码:

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
Run Code Online (Sandbox Code Playgroud)

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

您能给我一些提示来定义我的'x_goal'和'y_goal'变量吗?

谢谢

kir*_*off 1

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

distance += abs(x_value - x_goal) + abs(y_value - y_goal)
Run Code Online (Sandbox Code Playgroud)

wherex_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
Run Code Online (Sandbox Code Playgroud)

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