[url]http://chengkehan.wordpress.com/2010/03/28/%E5%B9%BF%E5%BA%A6%E6%90%9C%E7%B4%A2/[/url]
广度搜索法更像是一个怪物,它的触须会沿着路径逐渐的遍及整个网络,直到找到目标点,这些触须的每一次增长都将会使得触须所涉及的半径范围增加一个单位,生长的代价是如此之大,每一条触须都会汲取养料来发展自己,使自己更长或者分叉。那这些养料就是计算机提供的内存和cpu的运算时间了。
这里引入了一个消耗的概念(expending),对于在不带权的栅格中进行这样的搜索,这个参数似乎就没什么用了。而在通道交织无规律的图中,或者是带权的图中,可以在递归的时候就把消耗记录在这里,在反向遍历生成路径的同时就把每条路径的消耗计算出来,就能很方便的对所有的路径进行一个排序
广度搜索法更像是一个怪物,它的触须会沿着路径逐渐的遍及整个网络,直到找到目标点,这些触须的每一次增长都将会使得触须所涉及的半径范围增加一个单位,生长的代价是如此之大,每一条触须都会汲取养料来发展自己,使自己更长或者分叉。那这些养料就是计算机提供的内存和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),对于在不带权的栅格中进行这样的搜索,这个参数似乎就没什么用了。而在通道交织无规律的图中,或者是带权的图中,可以在递归的时候就把消耗记录在这里,在反向遍历生成路径的同时就把每条路径的消耗计算出来,就能很方便的对所有的路径进行一个排序