将进路路径构建时的迭代次数改为由调用者传入

This commit is contained in:
joylink_zhangsai 2021-03-11 10:26:55 +08:00
parent 37c306ac27
commit 9681255916
7 changed files with 31 additions and 31 deletions

View File

@ -400,20 +400,20 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
List<Section> tbSections = new ArrayList<>(); List<Section> tbSections = new ArrayList<>();
if (right) { if (right) {
if (rightStandTrack.isTurnBackTrack() if (rightStandTrack.isTurnBackTrack()
&& !CollectionUtils.isEmpty(CalculateService.queryRoutePathsOnDirection(rightStandTrack, adjacentLeftStandTrack, false))) { && !CollectionUtils.isEmpty(CalculateService.queryRoutePathsOnDirection(rightStandTrack, adjacentLeftStandTrack, false, 10))) {
tbSections.add(rightStandTrack); tbSections.add(rightStandTrack);
} }
if (leftStandTrack.isTurnBackTrack() if (leftStandTrack.isTurnBackTrack()
&& !CollectionUtils.isEmpty(CalculateService.queryRoutePathsOnDirection(adjacentRightStandTrack, leftStandTrack, true))) { && !CollectionUtils.isEmpty(CalculateService.queryRoutePathsOnDirection(adjacentRightStandTrack, leftStandTrack, true, 10))) {
tbSections.add(leftStandTrack); tbSections.add(leftStandTrack);
} }
} else { } else {
if (rightStandTrack.isTurnBackTrack() if (rightStandTrack.isTurnBackTrack()
&& !CollectionUtils.isEmpty(CalculateService.queryRoutePathsOnDirection(adjacentLeftStandTrack, rightStandTrack, false))) { && !CollectionUtils.isEmpty(CalculateService.queryRoutePathsOnDirection(adjacentLeftStandTrack, rightStandTrack, false, 10))) {
tbSections.add(rightStandTrack); tbSections.add(rightStandTrack);
} }
if (leftStandTrack.isTurnBackTrack() if (leftStandTrack.isTurnBackTrack()
&& !CollectionUtils.isEmpty(CalculateService.queryRoutePathsOnDirection(leftStandTrack, adjacentRightStandTrack, true))) { && !CollectionUtils.isEmpty(CalculateService.queryRoutePathsOnDirection(leftStandTrack, adjacentRightStandTrack, true, 10))) {
tbSections.add(leftStandTrack); tbSections.add(leftStandTrack);
} }
} }
@ -431,7 +431,7 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
} }
Section standTrack = station.getNormalStand(right).get(0).getSection(); Section standTrack = station.getNormalStand(right).get(0).getSection();
return turnBackList.stream().filter(section -> !section.isNormalStandTrack()) return turnBackList.stream().filter(section -> !section.isNormalStandTrack())
.filter(section -> !CollectionUtils.isEmpty(CalculateService.queryRoutePathsOnDirection(standTrack, section, right))) .filter(section -> !CollectionUtils.isEmpty(CalculateService.queryRoutePathsOnDirection(standTrack, section, right, 10)))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@ -1404,10 +1404,10 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
runLevelVO.setEndSectionCode(endSection.getCode()); runLevelVO.setEndSectionCode(endSection.getCode());
runLevelVO.setEndStationCode(endSection.getStation().getCode()); runLevelVO.setEndStationCode(endSection.getStation().getCode());
runLevelVO.setRight(right); runLevelVO.setRight(right);
List<RoutePath> routePaths = CalculateService.queryRoutePathsOnDirection(startSection, endSection, right); List<RoutePath> routePaths = CalculateService.queryRoutePathsOnDirection(startSection, endSection, right, 10);
if (CollectionUtils.isEmpty(routePaths)) { if (CollectionUtils.isEmpty(routePaths)) {
// 未找到反方向再找 // 未找到反方向再找
routePaths = CalculateService.queryRoutePathsOnDirection(startSection, endSection, !right); routePaths = CalculateService.queryRoutePathsOnDirection(startSection, endSection, !right, 10);
if (!CollectionUtils.isEmpty(routePaths)) { if (!CollectionUtils.isEmpty(routePaths)) {
log.info(String.format("站间运行等级[%s]与交路[%s]方向相反,实际为[%s]", log.info(String.format("站间运行等级[%s]与交路[%s]方向相反,实际为[%s]",
String.format("%s(%s(%s))->%s(%s(%s))", String.format("%s(%s(%s))->%s(%s(%s))",
@ -1463,7 +1463,7 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
adjacentSections.forEach(endSection -> { adjacentSections.forEach(endSection -> {
//验证是否是进路路径的站间 //验证是否是进路路径的站间
List<RoutePath> routePaths = CalculateService.queryRoutePathsOnDirection(startSection, endSection, right); List<RoutePath> routePaths = CalculateService.queryRoutePathsOnDirection(startSection, endSection, right, 10);
if (CollectionUtils.isEmpty(routePaths)) { if (CollectionUtils.isEmpty(routePaths)) {
log.warn(String.format("站间运行等级数据生成失败:没有找到[%s(%s) ——> %s(%s)]对应方向[%s]的进路路径可达的站间", log.warn(String.format("站间运行等级数据生成失败:没有找到[%s(%s) ——> %s(%s)]对应方向[%s]的进路路径可达的站间",
startSection.getStation().getName(), startSection.getName(), endSection.getStation().getName(), endSection.getName(), right ? "右向" : "左向")); startSection.getStation().getName(), startSection.getName(), endSection.getStation().getName(), endSection.getName(), right ? "右向" : "左向"));

View File

@ -40,7 +40,7 @@ public class SimulationSupportService {
VirtualRealityTrain train = simulation.getRepository().getOnlineTrainBy(groupNumber); VirtualRealityTrain train = simulation.getRepository().getOnlineTrainBy(groupNumber);
Section startSection = train.getHeadPosition().getSection(); Section startSection = train.getHeadPosition().getSection();
List<RoutePath> routePaths = CalculateService.queryRoutePathsOnDirection(startSection, destination, train.isRight()); List<RoutePath> routePaths = CalculateService.queryRoutePathsOnDirection(startSection, destination, train.isRight(), 10);
return routePaths.stream() return routePaths.stream()
.map(routePath -> CalculateService.selectUniqueRoutes(routePath, false) .map(routePath -> CalculateService.selectUniqueRoutes(routePath, false)
.stream().map(MapElement::getCode).collect(Collectors.toList())) .stream().map(MapElement::getCode).collect(Collectors.toList()))

View File

@ -95,9 +95,9 @@ public class AtsRouteSettingService {
return destDefinition.queryNextRoute(headSection); return destDefinition.queryNextRoute(headSection);
} else if (train.getEstimatedArriveStandTrack() != null) { } else if (train.getEstimatedArriveStandTrack() != null) {
Section targetSection = repository.getByCode(train.getEstimatedArriveStandTrack(), Section.class); Section targetSection = repository.getByCode(train.getEstimatedArriveStandTrack(), Section.class);
routePaths = CalculateService.queryRoutePathsOnDirection(headSection, targetSection, true); routePaths = CalculateService.queryRoutePathsOnDirection(headSection, targetSection, true, 10);
if (CollectionUtils.isEmpty(routePaths)) { if (CollectionUtils.isEmpty(routePaths)) {
routePaths = CalculateService.queryRoutePathsOnDirection(headSection, targetSection, false); routePaths = CalculateService.queryRoutePathsOnDirection(headSection, targetSection, false, 10);
} }
} else { } else {
// 目的地定义存在根据目的地定义查询路径办理进路 // 目的地定义存在根据目的地定义查询路径办理进路

View File

@ -515,7 +515,7 @@ public class AtsTrainService {
Section tbSection = strategy.getSectionList().get(0); Section tbSection = strategy.getSectionList().get(0);
switch (strategy.getType()) { switch (strategy.getType()) {
case FIRST: case FIRST:
List<RoutePath> routePaths = CalculateService.queryRoutePathsOnDirection(headSection, tbSection, standRight); List<RoutePath> routePaths = CalculateService.queryRoutePathsOnDirection(headSection, tbSection, standRight, 10);
if (routePaths.stream().anyMatch(path -> !path.isOccupied())) { if (routePaths.stream().anyMatch(path -> !path.isOccupied())) {
nextTarget = tbSection; nextTarget = tbSection;
} }
@ -532,7 +532,7 @@ public class AtsTrainService {
if (section.isNormalStandTrack()) { if (section.isNormalStandTrack()) {
continue; continue;
} }
List<RoutePath> routePaths = CalculateService.queryRoutePathsOnDirection(headSection, section, standRight); List<RoutePath> routePaths = CalculateService.queryRoutePathsOnDirection(headSection, section, standRight, 10);
if (routePaths.stream().anyMatch(path -> !path.isOccupied())) { if (routePaths.stream().anyMatch(path -> !path.isOccupied())) {
nextTarget = section; nextTarget = section;
break; break;
@ -563,7 +563,7 @@ public class AtsTrainService {
break; break;
} }
nextTarget = adjacentStation.getNormalStand(!standRight).get(0).getSection(); nextTarget = adjacentStation.getNormalStand(!standRight).get(0).getSection();
if (CollectionUtils.isEmpty(CalculateService.queryRoutePathsOnDirection(headSection, nextTarget, standRight))) { if (CollectionUtils.isEmpty(CalculateService.queryRoutePathsOnDirection(headSection, nextTarget, standRight, 10))) {
nextTarget = adjacentStation.getNormalStand(standRight).get(0).getSection(); nextTarget = adjacentStation.getNormalStand(standRight).get(0).getSection();
} }
} else { } else {
@ -582,7 +582,7 @@ public class AtsTrainService {
if (nextTarget == null) { if (nextTarget == null) {
nextTarget = headStation.getNormalStand(destinationRight).get(0).getSection(); nextTarget = headStation.getNormalStand(destinationRight).get(0).getSection();
if (!headSection.equals(nextTarget)) { if (!headSection.equals(nextTarget)) {
List<RoutePath> routePaths = CalculateService.queryRoutePathsOnDirection(headSection, nextTarget, destinationRight); List<RoutePath> routePaths = CalculateService.queryRoutePathsOnDirection(headSection, nextTarget, destinationRight, 10);
if (!CollectionUtils.isEmpty(routePaths)) { if (!CollectionUtils.isEmpty(routePaths)) {
break; break;
} }

View File

@ -869,7 +869,7 @@ public class InterlockBuilder2 {
Section startSection = runLevel.getStartSection(); Section startSection = runLevel.getStartSection();
Section endSection = runLevel.getEndSection(); Section endSection = runLevel.getEndSection();
boolean right = runLevel.isRight(); boolean right = runLevel.isRight();
List<RoutePath> routePaths = CalculateService.queryRoutePathsOnDirection(startSection, endSection, right); List<RoutePath> routePaths = CalculateService.queryRoutePathsOnDirection(startSection, endSection, right, 10);
if (CollectionUtils.isEmpty(routePaths)) { if (CollectionUtils.isEmpty(routePaths)) {
errMsgList.add(String.format("站间运行等级[%s]无法找到路径", errMsgList.add(String.format("站间运行等级[%s]无法找到路径",
runLevel.debugStr(), startSection.debugStr(), endSection.debugStr())); runLevel.debugStr(), startSection.debugStr(), endSection.debugStr()));

View File

@ -157,10 +157,10 @@ public class SimulationBuilder {
String key = RoutePath.buildKey(start, end); String key = RoutePath.buildKey(start, end);
if (!routePathMap.containsKey(key)) { if (!routePathMap.containsKey(key)) {
// 路径不存在尝试构建 // 路径不存在尝试构建
List<RoutePath> routePaths = CalculateService.queryRoutePathsOnDirection(start, end, tripPlan.isRight()); List<RoutePath> routePaths = CalculateService.queryRoutePathsOnDirection(start, end, tripPlan.isRight(), 10);
if (CollectionUtils.isEmpty(routePaths)) { if (CollectionUtils.isEmpty(routePaths)) {
// 计划方向路径未找到反向尝试 // 计划方向路径未找到反向尝试
routePaths = CalculateService.queryRoutePathsOnDirection(start, end, !tripPlan.isRight()); routePaths = CalculateService.queryRoutePathsOnDirection(start, end, !tripPlan.isRight(), 10);
} }
if (CollectionUtils.isEmpty(routePaths)) { if (CollectionUtils.isEmpty(routePaths)) {
// 依然未找到 // 依然未找到

View File

@ -635,11 +635,11 @@ public class CalculateService {
return false; return false;
} }
public static List<RoutePath> queryRoutePathsOnDirection(Section start, Section end, Boolean right) { public static List<RoutePath> queryRoutePathsOnDirection(Section start, Section end, Boolean right, int iterTimes) {
List<RoutePath> list = new ArrayList<>(); List<RoutePath> list = new ArrayList<>();
List<String> warnList = new ArrayList<>(); List<String> warnList = new ArrayList<>();
RoutePath routePath = new RoutePath(start, end, right); RoutePath routePath = new RoutePath(start, end, right);
queryRoutePaths(0, start, routePath, list, warnList); queryRoutePaths(0, iterTimes, start, routePath, list, warnList);
if (!CollectionUtils.isEmpty(list)) { if (!CollectionUtils.isEmpty(list)) {
for (RoutePath path : list) { for (RoutePath path : list) {
path.calculateDistance(); path.calculateDistance();
@ -659,7 +659,7 @@ public class CalculateService {
* @param preferredSections 优先经过这些区段可以为null * @param preferredSections 优先经过这些区段可以为null
*/ */
public static RoutePath queryLeastSwitchRoutePath(Section startSection, Section endSection, Collection<Section> preferredSections, boolean toRight) { public static RoutePath queryLeastSwitchRoutePath(Section startSection, Section endSection, Collection<Section> preferredSections, boolean toRight) {
List<RoutePath> routePaths = CalculateService.queryRoutePathsOnDirection(startSection, endSection, toRight); List<RoutePath> routePaths = CalculateService.queryRoutePathsOnDirection(startSection, endSection, toRight, 100);
if (CollectionUtils.isEmpty(routePaths)) { if (CollectionUtils.isEmpty(routePaths)) {
return null; return null;
} else { } else {
@ -695,14 +695,14 @@ public class CalculateService {
} }
} }
private static void queryRoutePaths(int iter, Section section, RoutePath routePath, private static void queryRoutePaths(int iter, int iterTimes, Section section, RoutePath routePath,
List<RoutePath> list, List<String> warnList) { List<RoutePath> list, List<String> warnList) {
if (section == null) { if (section == null) {
warnList.add(String.format("进路路径[%s]未找到,找到的最后区段为[%s],下一区段为null", warnList.add(String.format("进路路径[%s]未找到,找到的最后区段为[%s],下一区段为null",
routePath.debugStr(), routePath.getLastSection().debugStr())); routePath.debugStr(), routePath.getLastSection().debugStr()));
return; return;
} }
if (iter > 100) { if (iter > iterTimes) {
warnList.add(String.format("进路路径[%s]未找到迭代100次,最后区段为[%s]", warnList.add(String.format("进路路径[%s]未找到迭代100次,最后区段为[%s]",
routePath.debugStr(), routePath.getLastSection().debugStr())); routePath.debugStr(), routePath.getLastSection().debugStr()));
return; return;
@ -721,20 +721,20 @@ public class CalculateService {
} else { } else {
// 添加并进行迭代 // 添加并进行迭代
routePath.addSection(next); routePath.addSection(next);
queryRoutePaths(iter + 1, next, routePath, list, warnList); queryRoutePaths(iter + 1, iterTimes, next, routePath, list, warnList);
} }
} else if (section.isSwitchTrack()) { // 道岔区段 } else if (section.isSwitchTrack()) { // 道岔区段
Switch relSwitch = section.getRelSwitch(); Switch relSwitch = section.getRelSwitch();
if (relSwitch.isA(section)) { if (relSwitch.isA(section)) {
RoutePath path1 = routePath.cloneNew(); RoutePath path1 = routePath.cloneNew();
path1.addSection(relSwitch.getB()); path1.addSection(relSwitch.getB());
queryRoutePaths(iter + 1, relSwitch.getB(), path1, list, warnList); queryRoutePaths(iter + 1, iterTimes, relSwitch.getB(), path1, list, warnList);
RoutePath path2 = routePath.cloneNew(); RoutePath path2 = routePath.cloneNew();
path2.addSection(relSwitch.getC()); path2.addSection(relSwitch.getC());
queryRoutePaths(iter + 1, relSwitch.getC(), path2, list, warnList); queryRoutePaths(iter + 1, iterTimes, relSwitch.getC(), path2, list, warnList);
} else { } else {
routePath.addSection(relSwitch.getA()); routePath.addSection(relSwitch.getA());
queryRoutePaths(iter + 1, relSwitch.getA(), routePath, list, warnList); queryRoutePaths(iter + 1, iterTimes, relSwitch.getA(), routePath, list, warnList);
} }
} else { } else {
warnList.add(String.format("区段[%s]的[%s]区段不存在", warnList.add(String.format("区段[%s]的[%s]区段不存在",
@ -760,7 +760,7 @@ public class CalculateService {
list.add(routePath); list.add(routePath);
} else { } else {
routePath.addSections(sectionList); routePath.addSections(sectionList);
queryRoutePaths(iter + 1, route.getLastRouteSection(), routePath, list, warnList); queryRoutePaths(iter + 1, iterTimes, route.getLastRouteSection(), routePath, list, warnList);
} }
return; return;
} }
@ -823,7 +823,7 @@ public class CalculateService {
} else { } else {
for (RoutePath clone : iterList) { for (RoutePath clone : iterList) {
Section next = clone.getLastSection(); Section next = clone.getLastSection();
queryRoutePaths(iter + 1, next, clone, list, warnList); queryRoutePaths(iter + 1, iterTimes, next, clone, list, warnList);
} }
} }
} else { } else {
@ -845,7 +845,7 @@ public class CalculateService {
for (Section next : sectionList) { for (Section next : sectionList) {
routePath.addSection(next); routePath.addSection(next);
if (next.getSignalOf(right) != null) { if (next.getSignalOf(right) != null) {
queryRoutePaths(iter + 1, next, routePath, list, warnList); queryRoutePaths(iter + 1, iterTimes, next, routePath, list, warnList);
break; break;
} }
} }
@ -1113,7 +1113,7 @@ public class CalculateService {
// if (distance == null) { // if (distance == null) {
// return null; // return null;
// } // }
List<RoutePath> routePaths = queryRoutePathsOnDirection(train.getHeadPosition().getSection(), target, right); List<RoutePath> routePaths = queryRoutePathsOnDirection(train.getHeadPosition().getSection(), target, right, 10);
if (CollectionUtils.isEmpty(routePaths)) { if (CollectionUtils.isEmpty(routePaths)) {
return null; return null;
} }