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