我正在尝试用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
我的问题是我没有明确表示目标状态中碎片的坐标,因此我不知道如何为'value'片段定义'x_goal'和'y_goal'板。我试图使用除法和模块操作来完成它,但这很困难。
你能给我一些提示来定义我的'x_goal'和'y_goal'变量吗?
谢谢
答案 0 :(得分:0)
曼哈顿距离是道路上的出租车距离,类似于曼哈顿。你的公式是正确的
distance += abs(x_value - x_goal) + abs(y_value - y_goal)
x_value, y_value
就在哪里,x_goal, y_goal
就在您想去的地方。
This implementation using mhd使用此启发式:在当前位置的每个'12346578'的索引定义的点与由goal
中的每个'12346578'的索引定义的点之间的mhd / p>
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
没试过。也许链接有所帮助。
答案 1 :(得分: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
这样,你就可以获得两全其美。每当您想要将网格视为网格时,您可以使用原始的列表列表表单,但如果只需快速查找曼哈顿距离函数的值,您可以使用新的字典已经创造了。
答案 2 :(得分: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
答案 3 :(得分:0)
您可以找到大多数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