コード例 #1
0
        //没有路径则返回null
        public override ICollection <IPosition_Connected> SearchPath(IPosition_Connected start, IPosition_Connected end)
        {
            List <IPosition_Connected> path = new List <IPosition_Connected>();

            if (start == end)
            {
                path.Add(start);
                return(path);
            }

            //初始化
            Init(start, end);

            IPosition_Connected p = null, p_adj;
            Tag  p_tag, p_adj_tag;
            Real newF, newG;

            open.clear();
            //将起点加入open表
            open.add(start);

            //当open表非空时
            while (open.getSize() > 0)
            {
                //获得下一个最近的点
                p = open.removeFirst();
                //到达终点则结束
                if (p == end)
                {
                    break;
                }

                p_tag        = list[p.GetTagIndex()];
                p_tag.closed = true;

                IEnumerable <IAdjacency> adj_set = p.GetAdjacencyOut();
                foreach (IAdjacency adjacency in adj_set)
                {
                    p_adj     = adjacency.GetPosition_Connected();
                    p_adj_tag = list[p_adj.GetTagIndex()];

                    if (p_adj_tag.timeStamp != time_stamp)
                    {
                        newG                = p_tag.g + adjacency.GetDistance();
                        newF                = newG + evaluator.GetDistance(p_adj, end);
                        p_adj_tag.parent    = p;
                        p_adj_tag.g         = newG;
                        p_adj_tag.f         = newF;
                        p_adj_tag.closed    = false;
                        p_adj_tag.timeStamp = time_stamp;
                        open.add(p_adj);
                    }
                    else
                    {
                        if (!p_adj_tag.closed)
                        {
                            newG = p_tag.g + adjacency.GetDistance();
                            newF = newG + evaluator.GetDistance(p_adj, end);
                            if (newF < p_adj_tag.f)
                            {
                                p_adj_tag.parent = p;
                                p_adj_tag.g      = newG;
                                p_adj_tag.f      = newF;
                                open.update(p_adj);
                            }
                        }
                    }
                }
            }

            GetPath(path, p, end);
            return(path);
        }
コード例 #2
0
 public override int Compare(IPosition_Connected p1, IPosition_Connected p2)
 {
     return(diff(list[p1.GetTagIndex()].g, list[p2.GetTagIndex()].g));
 }