代码拉取完成,页面将自动刷新
第一个是Astar中的stateToNode[state] = child;更新stateToNode的这句是否应该应该只有在节点(原本处于stateToNode中的)的cost大于同一state的节点(新构建的节点)才要将这一节点在stateToNode更新,stateToNode我的理解是用来存储所有节点的cost用来进行比较的,根据Dijkstra应该只有newcost更小的时候才会更新这个存储节点的表
第二个是您对子节点初始化时对节点Goal的处理,133行的注释说是只在Goal状态集中保留与Effects中不同的部分但是如果这样更新的话,那么对再下一个节点的Action进行筛选时INode类中的Expand()中的这段代码
if (effects.HasAny(Goal) &&!Goal.HasAnyConflict(effects,precond)&&!Goal.HasAnyConflict(effects) &&
possibleAction.CheckProceduralCondition(stackData))
{
var newGoal = Goal;
//ReGoapLogger.Log($"{Name}-{GetCost()}的拓扑图新增{possibleAction.GetName()}");
expandList.Add(Instantiate(planner, newGoal, this, possibleAction, settings));
}
判断的第二个条件!Goal.HasAnyConflict(effects,precond)我的理解是用来判断Goal中的state集的某些值和Action的precondition是否有冲突,但是如果每次更新Goal只保留了与Effects中不同的部分那么是不是有可能Action的precondition的值和原本的Goal中的state的值不一样呢?