寻路:一颗星从 A 到 B 的长度与从 B 到 A 的长度不同
Path finding: A star not same length from A to B than from B to A
我正在为 8 谜题实施具有曼哈顿距离的 A 星算法。 [解呈螺旋状]
1 2 3
8 0 4
7 6 5
在某些情况下,从 A 到 B 的步数与从 B 到 A 的步数不同。
我认为这是因为它不会在 open list 上选择相同的状态,当它们具有相同的成本时,因此不会扩展相同的节点。
来自
7 6 4
1 0 8
2 3 5
(A -> B)
7 6 4
1 8 0
2 3 5
(B -> A)
7 6 4
1 3 8
2 0 5
两者使用曼哈顿距离具有相同的值。
我应该探索具有相同价值的所有路径吗?
还是我应该更改启发式以进行某种决胜局?
这是代码的相关部分
def solve(self):
cost = 0
priority = 0
self.parents[str(self.start)] = (None, 0, 0)
open = p.pr() #priority queue
open.add(0, self.start, cost)
while open:
current = open.get()
if current == self.goal:
return self.print_solution(current)
parent = self.parents[str(current)]
cost = self.parents[str(current)][2] + 1
for new_state in self.get_next_states(current):
if str(new_state[0]) not in self.parents or cost < self.parents[str(new_state[0])][2]:
priority = self.f(new_state) + cost
open.add(priority, new_state[0], cost)
self.parents[str(new_state[0])] = (current, priority, cost)
在浪费了这么多时间以多种不同的方式重写我的 "solve" 函数之后,没有任何收获,
终于找到问题了
def get_next_states(self, mtx, direction):
n = self.n
pos = mtx.index(0)
if direction != 1 and pos < self.length and (pos + 1) % n:
yield (self.swap(pos, pos + 1, mtx),pos, 3)
if direction != 2 and pos < self.length - self.n:
yield (self.swap(pos, pos + n, mtx),pos, 4)
if direction != 3 and pos > 0 and pos % n:
yield (self.swap(pos, pos - 1, mtx),pos, 1)
if direction != 4 and pos > n - 1:
yield (self.swap(pos, pos - n, mtx),pos, 2)
就是在这个函数中。最后一个if曾经是"if 4 and pos > n:"
所以有未开发的状态..
“-1”需要 2 天
它会教我做更多的单元测试
我正在为 8 谜题实施具有曼哈顿距离的 A 星算法。 [解呈螺旋状]
1 2 3
8 0 4
7 6 5
在某些情况下,从 A 到 B 的步数与从 B 到 A 的步数不同。
我认为这是因为它不会在 open list 上选择相同的状态,当它们具有相同的成本时,因此不会扩展相同的节点。
来自
7 6 4
1 0 8
2 3 5
(A -> B)
7 6 4
1 8 0
2 3 5
(B -> A)
7 6 4
1 3 8
2 0 5
两者使用曼哈顿距离具有相同的值。 我应该探索具有相同价值的所有路径吗? 还是我应该更改启发式以进行某种决胜局?
这是代码的相关部分
def solve(self):
cost = 0
priority = 0
self.parents[str(self.start)] = (None, 0, 0)
open = p.pr() #priority queue
open.add(0, self.start, cost)
while open:
current = open.get()
if current == self.goal:
return self.print_solution(current)
parent = self.parents[str(current)]
cost = self.parents[str(current)][2] + 1
for new_state in self.get_next_states(current):
if str(new_state[0]) not in self.parents or cost < self.parents[str(new_state[0])][2]:
priority = self.f(new_state) + cost
open.add(priority, new_state[0], cost)
self.parents[str(new_state[0])] = (current, priority, cost)
在浪费了这么多时间以多种不同的方式重写我的 "solve" 函数之后,没有任何收获, 终于找到问题了
def get_next_states(self, mtx, direction):
n = self.n
pos = mtx.index(0)
if direction != 1 and pos < self.length and (pos + 1) % n:
yield (self.swap(pos, pos + 1, mtx),pos, 3)
if direction != 2 and pos < self.length - self.n:
yield (self.swap(pos, pos + n, mtx),pos, 4)
if direction != 3 and pos > 0 and pos % n:
yield (self.swap(pos, pos - 1, mtx),pos, 1)
if direction != 4 and pos > n - 1:
yield (self.swap(pos, pos - n, mtx),pos, 2)
就是在这个函数中。最后一个if曾经是"if 4 and pos > n:" 所以有未开发的状态.. “-1”需要 2 天
它会教我做更多的单元测试