예제 #1
0
        /// <summary>
        /// 递归查找起始点到终点的所有路段集合
        /// </summary>
        /// <param name="StartMarkPoint"></param>
        /// <param name="EndMarkPoint"></param>
        /// <param name="BeforeMarkPoint"></param>
        /// <param name="AllRoads"></param>
        /// <param name="PassedRoads"></param>
        public async Task <Boolean> GetCombination(MarkPointInfo StartMarkPoint, MarkPointInfo EndMarkPoint, MarkPointInfo BeforeMarkPoint, List <RoadInfo> AllRoads, List <RoadInfo> PassedRoads, List <RoadInfo> GetRoadInfoList)
        {
            //地标点和路径信息全获取
            MarkPointInfo StartMarkPointTmp  = new MarkPointInfo();
            MarkPointInfo EndMarkPointTmp    = new MarkPointInfo();
            MarkPointInfo BeforeMarkPointTmp = new MarkPointInfo();
            MarkPointInfo TmpMarkPointTmp    = new MarkPointInfo();

            StartMarkPointTmp = StartMarkPoint;
            EndMarkPointTmp   = EndMarkPoint;
            Boolean FindOneRoutes = false;

            if (!Equals(GetRoadInfoList, null))
            {
                BeforeMarkPointTmp = BeforeMarkPoint;

                foreach (var foreachData in GetRoadInfoList)
                {
                    //针对有反向线段不检索
                    if (Equals(foreachData.EndMarkPointInfo, StartMarkPointTmp))
                    {
                        continue;
                    }
                    //起始地标点和终点地标点都在同一个Road中
                    if (Equals(foreachData.StartMarkPointInfo, StartMarkPointTmp) && Equals(foreachData.EndMarkPointInfo, EndMarkPointTmp))
                    {
                        //添加终点路段和经过路段
                        AllRoads.Add(foreachData);
                        if (!Equals(PassedRoads, null))
                        {
                            PassedRoads.Reverse();
                            AllRoads.AddRange(PassedRoads);
                            PassedRoads.Reverse();
                        }
                        FindOneRoutes = true;
                    }
                    else
                    {
                        TmpMarkPointTmp = foreachData.EndMarkPointInfo;
                        //符合递归条件:路段起始点相同  此路段不是上一个路段的反向   走过的路段不能重复  走过的点不能重复
                        if ((Equals(foreachData.StartMarkPointInfo, StartMarkPointTmp)) && (!Equals(foreachData.EndMarkPointInfo, BeforeMarkPointTmp)) &&
                            ((PassedRoads.FindIndex(a => Equals(a.StartMarkPointInfo, foreachData.EndMarkPointInfo))) == -1))
                        //&& (PassedRoads.IndexOf(foreachData) == -1))
                        {
                            PassedRoads.Add(foreachData);
                            //添加相同的起始点的路径到AllRoads
                            FindOneRoutes = await GetCombination(TmpMarkPointTmp, EndMarkPointTmp, StartMarkPointTmp, AllRoads, PassedRoads, GetRoadInfoList);

                            //移除最后一个
                            PassedRoads.RemoveAt(PassedRoads.Count - 1);
                        }
                    }
                }
            }
            else
            {
                AllRoads.Clear();
            }
            return(FindOneRoutes);
        }
예제 #2
0
        /// <summary>
        /// [AIBegin]
        /// 関数初回実行時に呼ばれるコールバック関数
        /// 引数1: 通常実行→終了する関数, 割り込み実行の場合→現在の通常実行関数, 存在しない場合null
        /// 引数2: 並列関数として実行?
        /// </summary>
        public override void AIBegin(BaseAIFunction beforeFunction, bool isParallel)
        {
            m_markTarget = m_thisGoingFunction.markTarget;
            if (m_markTarget == null)
            {
                return;
            }

            var message = m_markTarget.GetComponent <MarkingMessage>();

            if (message == null)
            {
                return;
            }

            m_markingObjectInfo = new MarkPointInfo(m_markTarget,
                                                    message, transform, m_markingRotation);
        }
예제 #3
0
        public async Task <IHttpActionResult> Generate(params Agv.Dtos.RouteInfoInputDto[] dto)
        {
            //地标点和路径信息全获取
            List <MarkPointInfo> TmpMarkPointList = MarkPointInfoContract.MarkPointInfos?.ToList();

            //起始点
            MarkPointInfo StartMarkPoint = new MarkPointInfo();
            //终止点
            MarkPointInfo EndMarkPoint = new MarkPointInfo();
            //中间层起始点
            MarkPointInfo   BeforeMarkPoint = new MarkPointInfo();
            List <RoadInfo> AllRoads        = new List <RoadInfo>();
            List <RoadInfo> PassedRoads     = new List <RoadInfo>();

            List <RoadInfo> GetRoadInfoList = RoadInfoContract.RoadInfos.ToList();
            //反向所有路段
            List <RoadInfo> GetReverseRoadInfoList = RoadInfoContract.RoadInfos.ToList();
            MarkPointInfo   TmproadInfo            = new MarkPointInfo();

            Agv.Dtos.RouteInfoInputDto RouteInfo = new Agv.Dtos.RouteInfoInputDto();
            OperationResult            result    = new OperationResult();

            dto = new Agv.Dtos.RouteInfoInputDto[1] {
                RouteInfo
            };
            int StartMarkPointOfMarkPoints = 0;
            int EndMarkPointOfMarkPoints   = -1;
            //相同起点和终点的路段编号
            int RoutesNum = 0;

            if (!Equals(TmpMarkPointList, null))
            {
                //得到无相路段
                GetReverseRoadInfoList.ForEach((a) =>
                {
                    TmproadInfo          = a.StartMarkPointInfo;
                    a.StartMarkPointInfo = a.EndMarkPointInfo;
                    a.EndMarkPointInfo   = TmproadInfo;
                });
                GetRoadInfoList.AddRange(GetReverseRoadInfoList);
                //起始点和终止点全排列
                for (int i = 0; i < TmpMarkPointList.Count; i++)
                {
                    for (int j = 0; j < TmpMarkPointList.Count; j++)
                    {
                        if (i != j)
                        {
                            RoutesNum       = 0;
                            StartMarkPoint  = TmpMarkPointList[i];
                            BeforeMarkPoint = TmpMarkPointList[i];
                            EndMarkPoint    = TmpMarkPointList[j];

                            if (!Equals(AllRoads, null))
                            {
                                AllRoads.Clear();
                            }
                            if (!Equals(PassedRoads, null))
                            {
                                PassedRoads.Clear();
                            }
                            //用递归找到可以到达的路径的集合
                            var V = await RouteInfoContract.GetCombination(StartMarkPoint, EndMarkPoint, BeforeMarkPoint, AllRoads, PassedRoads, GetRoadInfoList);

                            if (AllRoads.Count > 0)
                            {
                                //list翻转
                                AllRoads.Reverse();
                                //用来区分路段集合中的多段路径
                                for (int k = 0; k < AllRoads.Count; k++)
                                {
                                    //记录每一次开始地标点存在的位置在MarkPoints
                                    if (Equals(AllRoads[k].StartMarkPointInfo, StartMarkPoint))
                                    {
                                        StartMarkPointOfMarkPoints = k;
                                    }
                                    //记录每一次结束地标点存在的位置在MarkPoints
                                    if (Equals(AllRoads[k].EndMarkPointInfo, EndMarkPoint))
                                    {
                                        EndMarkPointOfMarkPoints = k;
                                    }
                                    //每次找到结束点添加多段路径的表中
                                    if (EndMarkPointOfMarkPoints >= 0)
                                    {
                                        ++RoutesNum;
                                        dto?.ToList().ForEach((a) =>
                                        {
                                            a.TotalDistance     = 0;
                                            a.MarkPoints        = "";
                                            a.Id                = CombHelper.NewComb();
                                            a.CreatorUserId     = User.Identity.Name;
                                            a.CreatedTime       = DateTime.Now;
                                            a.LastUpdatedTime   = a.CreatedTime;
                                            a.LastUpdatorUserId = a.CreatorUserId;

                                            for (int m = StartMarkPointOfMarkPoints; m <= EndMarkPointOfMarkPoints; m++)
                                            {
                                                a.RouteStatus    = AllRoads[m].RoadStatus;
                                                a.TotalDistance += AllRoads[m].Distance;
                                                //if (a.MarkPoints.IndexOf(MarkPoints[m].StartMarkPointInfo.MarkPointName) == -1)
                                                //{
                                                a.MarkPoints += AllRoads[m].StartMarkPointInfo.MarkPointName + ",";
                                                //}
                                            }
                                            a.RouteNo   = "Route" + "(" + StartMarkPoint.MarkPointName + "-" + EndMarkPoint.MarkPointName + ")" + "=" + RoutesNum.ToString();
                                            a.RouteName = "路段" + "(" + StartMarkPoint.MarkPointName + "-" + EndMarkPoint.MarkPointName + ")" + "=" + RoutesNum.ToString();
                                            //if (a.MarkPoints.IndexOf(EndMarkPoint.MarkPointName) == -1)
                                            //{
                                            a.MarkPoints += EndMarkPoint.MarkPointName;
                                            //}
                                            a.StartMarkPointInfo    = StartMarkPoint;
                                            a.EndMarkPointInfo      = EndMarkPoint;
                                            a.StartMarkPointInfo_Id = StartMarkPoint.Id;
                                            a.EndMarkPointInfo_Id   = EndMarkPoint.Id;
                                        });
                                        EndMarkPointOfMarkPoints = -1;
                                        result = await RouteInfoContract.Generate(dto);

                                        if (!result.Successed)
                                        {
                                            return(Json(result));
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                return(null);
            }

            return(Json(result));
        }
예제 #4
0
 /// <summary>
 /// [AIEnd]
 /// 関数が実行登録を解除される際に呼ばれるコールバック関数
 /// 引数1: 通常実行→次回実行する関数, 割り込み実行の場合→現在の通常実行関数, 存在しない場合null
 /// 引数2: 並列関数として実行?
 /// </summary>
 public override void AIEnd(BaseAIFunction nextFunction, bool isParallel)
 {
     m_markTarget        = null;
     m_markingObjectInfo = null;
 }