A*算法返回启发式值(JavaScript)

A*算法返回启发式值(JavaScript),javascript,algorithm,path-finding,a-star,Javascript,Algorithm,Path Finding,A Star,我为JavaScript创建了一个a*算法重要的是,它必须搜索最长的路径,而不是最短的路径。当路径完成搜索时,我只想得到路径的深度/长度。该算法只返回最大长度,而不是路径 当调试结果时,我认为这个算法只是返回启发式的值 我有带ID的stage对象和活动对象,它们通过持有fromId和toId连接两个stage 例如: 我有状态对象的ID 一, 二, 三, 四, 五, 以及活动 (1,2) (1,3) (2,3) (3,5) (5,1) 我预计会有这样的结果: 距离阶段1:0 距离阶段2

我为JavaScript创建了一个a*算法重要的是,它必须搜索最长的路径,而不是最短的路径。当路径完成搜索时,我只想得到路径的深度/长度。该算法只返回最大长度,而不是路径

当调试结果时,我认为这个算法只是返回启发式的值

我有带ID的stage对象和活动对象,它们通过持有fromId和toId连接两个stage

例如:

我有状态对象的ID

  • 一,
  • 二,
  • 三,
  • 四,
  • 五,
以及活动

  • (1,2)
  • (1,3)
  • (2,3)
  • (3,5)
  • (5,1)
我预计会有这样的结果:

  • 距离阶段1:0
  • 距离阶段2:1
  • 距离阶段3:2
  • 距离阶段4:0(因为没有连接)
  • 距离阶段5:3
但我得到的结果是

为什么我认为我可以用A*表示最长的路径?

A*比较距离,取较低的距离。应该是 通过更改比较语句,可以以更高的成本获得更高的距离

我在这里提供了一个工作代码示例

//#########################################
//我的初始化脚本中有一些虚假数据
// #########################################
$(文档).ready(()=>{
常量路径=新路径(活动,1);
for(设i=0;i{
var me=这个;
var targetId=targetStage.id;
var openList=[];
var closedList=[];
this.addNodeToList(openList,this.createNode(initialId,this.activities));
设maxDistance=0;
while(openList.length>0){
var currentNode=openList[this.getHighestCostIndex(openList)];
if(currentNode.id==targetId){
maxDistance=this.getPathLength(currentNode);
打破
}
此.removeNodeFromList(openList,currentNode);
此.addNodeToList(closedList,currentNode);
currentNode.Neighturids.forEach(id=>{
var nexture=me.createNode(id,me.activities);
让lookuptable元素;
如果(!me.listContainsNode(closedList,neighbor)){
var tempIncrementalCost=currentNode.incrementalCost+1;
if(me.listContainsNode(openList,neighbor)){
if(tempIncrementalCost{
返回新的PathNode(id、活动);
};
this.getHighestCostIndex=(openList)=>{
设最高成本指数=0;
for(设i=0;iopenList[highestCostIndex].totalCost){
最高成本指数=i;
}
}
返回最高成本指数;
};
this.addNodeToList=(列表,节点)=>{
列表推送(节点);
};
this.listContainsNode=(列表,节点)=>{
返回list.some(x=>x.id==node.id);
};
this.removeNodeFromList=(列表,节点)=>{
var index=list.indexOf(节点);
拼接列表(索引,1);
};
this.getPathLength=(节点)=>{
设currentNode=node;
设计数器=0;
while(currentNode.parent){
currentNode=currentNode.parent;
计数器++;
}
返回计数器;
};
这是活动=活动;
this.lookUpTable=新的lookUpTable(this.activities,initialId).table;
}
// #########################################
//A的节点类*
// #########################################
功能路径节点(id、活动){
this.getNeightUrids=(活动)=>{
返回活动
.filter(x=>x.fromId==id)
.map(x=>x.toId);
};
this.setParent=(parentNode)=>{
this.parent=parentNode;
};
this.changeHeuristic=(heuristic)=>{
这个。启发式=启发式;
这个.updateTotalCost();
};
this.changeIncrementalCost=(incrementalCost)=>{
this.incrementalCost=incrementalCost;
这个.updateTotalCost();
};
this.updateTotalCost=()=>{
this.totalCost=this.incrementalCost+this.heuristic;
};
this.id=id;
这个参数=0;
此.incrementalCost=0;
此值为0.totalCost=0;
this.parent=null;
this.neighbourIds=this.getNeighbourIds(活动);
}
// #########################################
//启发式代码
// #########################################
函数可查找(activ