Python 3.x 使用迭代深化的Python3 RushHour解算器
我正在尝试使用迭代深化深度优先搜索创建一个RushHour谜题解算器。现在,当我执行脚本时,它会生成太多的节点,并迅速消耗大约20MB/s的整个内存分配速度。我知道我存储电路板状态的解决方案并不完美,但它不应该占用太多内存。整个项目可以在这里找到Python 3.x 使用迭代深化的Python3 RushHour解算器,python-3.x,artificial-intelligence,puzzle,Python 3.x,Artificial Intelligence,Puzzle,我正在尝试使用迭代深化深度优先搜索创建一个RushHour谜题解算器。现在,当我执行脚本时,它会生成太多的节点,并迅速消耗大约20MB/s的整个内存分配速度。我知道我存储电路板状态的解决方案并不完美,但它不应该占用太多内存。整个项目可以在这里找到 问题是is_solved map.py中的一个bug。即使出现最终状态,它也返回0,因此它从未停止搜索。现在它可以工作了,虽然速度很慢,但这是一个不同的问题。我只是快速阅读了您的所有代码,但似乎您构建了很多列表。你需要到处使用列表吗,或者你能尝试使用生
问题是is_solved map.py中的一个bug。即使出现最终状态,它也返回0,因此它从未停止搜索。现在它可以工作了,虽然速度很慢,但这是一个不同的问题。我只是快速阅读了您的所有代码,但似乎您构建了很多列表。你需要到处使用列表吗,或者你能尝试使用生成器吗?是的,我知道我使用列表太多了。我以前没用过发电机,我会调查的。
import map from node import Node
def all_moves(node): # returns all valid moves for node
state = node.state
output = []
for i in state.cars:
car_id = i[0]
y = i[1]
x = i[2]
for action in actions:
movement = state.is_movable(action, y, x)
if movement[1] != 0:
movement.append(car_id)
movement.append(action)
output.append(movement)
return output
def generate_all_child(node): # creates every new state based on list of valid moves and makes it a child
for move in all_moves(node):
action = move[-1]
car = move[0]
car_id = move[-2]
for step in range(1, move[1]+1):
child_state = node.state.action(car_id, car, action, step)
child_node = Node(child_state, node)
node.add_child(child_node)
def dls(node, node_depth):
if node_depth >= 0:
generate_all_child(node)
if node.state.is_solved():
return node
for child in node.children:
dls(child, node_depth-1)
stack = [] actions = ["left", "right", "up", "down"]
mapa = map.Map() mapa.load("krizovatka.csv") mapa.display_matrix() mapa.load_cars() root = Node(mapa, None) stack.append(root)
depth = 5 for i in range(1, depth+1):
print(i)
final = dls(root, i)
print(len(root.children))