[转]AS3 广度搜索

[url]http://chengkehan.wordpress.com/2010/03/28/%E5%B9%BF%E5%BA%A6%E6%90%9C%E7%B4%A2/[/url]
广度搜索法更像是一个怪物,它的触须会沿着路径逐渐的遍及整个网络,直到找到目标点,这些触须的每一次增长都将会使得触须所涉及的半径范围增加一个单位,生长的代价是如此之大,每一条触须都会汲取养料来发展自己,使自己更长或者分叉。那这些养料就是计算机提供的内存和cpu的运算时间了。

private static function search(parentNodes:Array/*所有的最外层节点*/):void
{
// 这里存放的是某个外层节点的所有邻居节点
var neighbours:Array;
var neighbour:Node;

// 通过一系列运算后,将会产生新的最外层节点,将存放在这里,进行下一次递归
var nextNodes:Array = new Array();
var parentNode:Node;

// 将所有的最外层节点放入排除列表里,放置触须往会生长
// 触须只能向外生长,否则将无限制的计算已经计算过的节点,直到堆栈溢出
for each(parentNode in parentNodes)
{
_excludeNodes[parentNode] = true;
parentNode.expending = Math.abs(_toNode.row - parentNode.row) + Math.abs(_toNode.col - parentNode.col);
}

for each(parentNode in parentNodes)
{
neighbours = parentNode.neighbors;

for each(neighbour in neighbours)
{
neighbour.expending = Math.abs(_toNode.row - neighbour.row) + Math.abs(_toNode.col - neighbour.col);
}

for each(neighbour in neighbours)
{
// 如果邻居节点已经是我们要找的点了
// 那么把这个节点记录到_endNodes中,继续找其他可能的路径
// 当然也可以直接跳出循环
if (neighbour == _toNode)
{
neighbour.parent = parentNode;
_endNodes.push(parentNode);
_excludeNodes[parentNode] = true;
++_toNodeNeighboursCount;
}
// 如果这是一个还没有计算过的节点,将这个节点的parent指向parentNode
// 因为我们最后将通过反向遍历_endNodes中的所有节点来获得所有的可能路径
else if (_excludeNodes[neighbour] == undefined)
{
neighbour.parent = parentNode;
_excludeNodes[neighbour] = true;
nextNodes.push(neighbour);
}
}
}

// 这里如果length <= 零就说明这条触须已经没办法在生长了
// 生长的空间已经被其他的触须占据了
if (nextNodes.length > 0 && _numberToNodeNeighbours > _toNodeNeighboursCount)
{
search(nextNodes);
}
}

这里引入了一个消耗的概念(expending),对于在不带权的栅格中进行这样的搜索,这个参数似乎就没什么用了。而在通道交织无规律的图中,或者是带权的图中,可以在递归的时候就把消耗记录在这里,在反向遍历生成路径的同时就把每条路径的消耗计算出来,就能很方便的对所有的路径进行一个排序
广度优先搜索(BFS)是一种用于图形搜索的算法,用于遍历或搜索树或图形。在广度优先搜索中,从根节点开始,首先访问所有与根节点相邻的节点,然后访问与这些节点相邻的所有未访问节点,以此类推,直到所有节点都被访问为止。BFS通常用于找到两个节点之间的最短路径,因为它保证在搜索过程中首先访问距离根节点最近的节点。 下面是使用BFS算法求解最短路径的Python代码示例: ```python from collections import deque # 读取文件中的图形数据 def read_graph(file_path): graph = {} with open(file_path, 'r') as f: for line in f: node, neighbors = line.strip().split(':') graph[node] = neighbors.split(',') return graph # 使用BFS算法查找最短路径 def bfs_shortest_path(graph, start, end): # 创建一个队列来存储节点和它的距离 queue = deque([(start, [start])]) # 创建一个集合来存储已经访问过的节点 visited = set() while queue: # 从队列中取出一个节点和它的距离 node, path = queue.popleft() # 如果这个节点是目标节点,返回它的路径 if node == end: return path # 如果这个节点还没有被访问过,将它的邻居加入队列 if node not in visited: visited.add(node) for neighbor in graph[node]: queue.append((neighbor, path + [neighbor])) # 如果没有找到路径,返回None return None # 读取图形数据 graph = read_graph('graph.txt') # 使用BFS算法查找最短路径 path = bfs_shortest_path(graph, 'A', 'F') # 输出最短路径 print(' -> '.join(path)) ``` 在上面的代码中,我们首先使用`read_graph`函数从文件中读取图形数据,然后使用`bfs_shortest_path`函数查找从起点到终点的最短路径。该函数使用一个队列来存储节点和它的距离,以及一个集合来存储已经访问过的节点。在每次迭代中,我们从队列中取出一个节点和它的距离,如果这个节点是目标节点,我们就返回它的路径。否则,我们将它的邻居加入队列,并将它标记为已访问。如果没有找到路径,我们就返回None。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值