我正在尝试编写一个 python A*。我相信我的遍历和我的启发式是正确的,但我得到了一个我不明白的错误。我无法更改 main
测试功能,但其余部分可以操作。
拼图的代码是:
def pop(self):
pairs = list()
for item in self.frontier:
pairs.append((self.priority[item], item))
(p, item) = min(pairs)
self.frontier.remove(item)
return item
运行代码时出现的错误是:
125
487
36
Traceback (most recent call last):
File "C:/Users/mchri/Desktop/AI/Homework/eightpuzzle/eightpuzzle.py", line 129, in <module>
main()
File "C:/Users/mchri/Desktop/AI/Homework/eightpuzzle/eightpuzzle.py", line 119, in main
path = agent.astar(puzzle, goal)
File "C:/Users/mchri/Desktop/AI/Homework/eightpuzzle/eightpuzzle.py", line 86, in astar
parent = self.pop()
File "C:/Users/mchri/Desktop/AI/Homework/eightpuzzle/eightpuzzle.py", line 106, in pop
(p, item) = min(pairs)
TypeError: '<' not supported between instances of 'Puzzle' and 'Puzzle'
难题几乎自行解决,但开始错放数字,我不明白这是不受支持的 <
的结果实例。
最佳答案
您正在使用 min()
从具有优先值和谜题的元组列表中获取最低优先值。一路min()
有效的是,它比较元组中的两个值,因此它将首先按优先级值排序,然后按拼图排序。但是没有 <
Puzzle 的运算符,因为一个谜题不少于另一个。
我假设您只想按优先级值排序,可以这样做:
(p, item) = min(pairs, key=lambda t: t[0])
如果你确实想按优先级值和拼图排序,你需要实现 lt
一个eq
Puzzle 运算符(参见 Brian Joseph 的回答)
关于python - Puzzle 返回不支持的 TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58012572/