瞎搞的和之前一样
看效果

学了一个名词叫启发式搜索,大概就是在原来bfs寻路的基础上为队列中的点添加一个启发函数,计算出一个大概的值,在搜索的时候按照估值的大小优先寻找某些点。
比如我在扩展点的基础上添加一个计算当前点到终点的曼哈顿距离,然后优先寻找曼哈顿距离最小的点,在bfs的基础上做点修改每次入队都要把曼哈顿距离最小的点放到队首,在搜索就可以了,所以我感觉和优先队列差不多,不过在js中可以使用split模拟优先队列
/**
*@function 曼哈顿距离
*/
function L(x1,y1,x2,y2){
return parseInt(Math.abs((x1-x2)+(y1-y2)));
}
/**
*@function 直线距离
*/
function LL(x1,y1,x2,y2){
return Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
}
/**
* @param {number} row
* @param {number} column
* @param {Array} movList
*/
function Astar(row,column,movList){
let priorityQueue = []; //优先队列
let [x,y,x2,y2] = [point.star,point.estar,point.send,point.end] //起点 and 终点
priorityQueue.push({x,y});
while(priorityQueue != 0){
let position = priorityQueue.pop();
if(position.x == x2 && position.y == y2){
boxArray[position.x][position.y].innerHTML = "终点";
boxArray[position.x][position.y].style.backgroundColor = "black"
return
}else{
for(let i = 0;i<movList.length ;i++ ){
let xx = position.x + movList[i][0];
let yy = position.y + movList[i][1];
if (xx >= 0 && yy >= 0 && xx < row && yy < column && (!vis[xx][yy]) && (!itemArray[xx][yy])) {
vis[xx][yy] = 1;
edge[xx][yy].x = position.x;
edge[xx][yy].y = position.y;
let pp = {};
pp.x = xx;
pp.y = yy;
pp.l = LL(xx,yy,x2,y2)
let f = true;
for(let j = 0;j<priorityQueue.length;j++){ //启发式搜索,贪心,优先寻找曼哈顿距离最小的点
if(pp.l>=priorityQueue[j].l){
f = false;
boxArray[xx][yy].style.backgroundColor = "yellow"
priorityQueue.splice(j,0,pp);
break;
}
}
if(f)priorityQueue.push(pp);
}
}
}
}
}

被折叠的 条评论
为什么被折叠?



