From 233ff9e9e82c67ac33695b479fd31df6ffb77b22 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期一, 02 十二月 2024 15:44:30 +0800
Subject: [PATCH] #
---
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/RetreatNavigateService.java | 210 ++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 163 insertions(+), 47 deletions(-)
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/RetreatNavigateService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/RetreatNavigateService.java
index 0a57d35..fa4c317 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/RetreatNavigateService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/RetreatNavigateService.java
@@ -1,24 +1,26 @@
package com.zy.acs.manager.core.service;
-import com.zy.acs.framework.common.Cools;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.acs.common.utils.RedisSupport;
import com.zy.acs.common.utils.Utils;
+import com.zy.acs.framework.common.Cools;
import com.zy.acs.manager.common.utils.MapDataUtils;
import com.zy.acs.manager.core.constant.MapDataConstant;
+import com.zy.acs.manager.core.domain.Lane;
import com.zy.acs.manager.core.service.astart.*;
+import com.zy.acs.manager.core.service.astart.domain.DynamicNode;
+import com.zy.acs.manager.manager.entity.Code;
import com.zy.acs.manager.manager.entity.Jam;
import com.zy.acs.manager.manager.entity.Route;
-import com.zy.acs.manager.manager.service.AgvModelService;
-import com.zy.acs.manager.manager.service.AgvService;
-import com.zy.acs.manager.manager.service.CodeService;
-import com.zy.acs.manager.manager.service.RouteService;
+import com.zy.acs.manager.manager.entity.Segment;
+import com.zy.acs.manager.manager.enums.JamStateType;
+import com.zy.acs.manager.manager.service.*;
+import com.zy.acs.manager.system.service.ConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.PriorityQueue;
+import java.util.*;
import java.util.stream.Collectors;
/**
@@ -27,6 +29,10 @@
@Slf4j
@Service
public class RetreatNavigateService {
+
+ private final RedisSupport redis = RedisSupport.defaultRedisSupport;
+
+ public static final int WEIGHT_CALC_FACTOR = 10000;
@Autowired
private CodeService codeService;
@@ -40,6 +46,14 @@
private AgvService agvService;
@Autowired
private AgvModelService agvModelService;
+ @Autowired
+ private LaneService laneService;
+ @Autowired
+ private ConfigService configService;
+ @Autowired
+ private SegmentService segmentService;
+ @Autowired
+ private JamService jamService;
/**
* avoidPathList ===>> [ minor vehicle ] [wave] [ curr vehicle ] [ code2 ] [ code3 ] ......
@@ -50,16 +64,17 @@
return null;
}
Integer lev = null;
+ Integer maxAgvCountInLane = configService.getVal("maxAgvCountInLane", Integer.class);
String breakPoint = avoidPathList.stream().findFirst().orElse(null);
List<String> blackList = Utils.singletonList(sponsor);
Double avoidDistance = MapDataUtils.getVehicleWaveSafeDistance(agvModelService.getById(agvService.selectByUuid(sponsor).getAgvModel()).getDiameter()
- , MapDataConstant.IDLE_DISTANCE_COE);
+ , MapDataConstant.MAX_DISTANCE_BETWEEN_ADJACENT_AGV_FACTOR);
List<String> avoidPathListWave = mapService.getWaveScopeByCodeList(lev, avoidPathList, avoidDistance);
+ DynamicNode[][] dynamicMatrix = mapDataDispatcher.getDynamicMatrix(lev);
String[][] waveMatrix = mapDataDispatcher.getWaveMatrix(lev);
-
RetreatNavigateNode finialNode = null;
@@ -69,6 +84,7 @@
openQueue.add(start);
existNodes.add(start);
+ boolean phaseSecond = true;
while (openQueue.size() > 0 && null == finialNode) {
@@ -77,23 +93,77 @@
List<RetreatNavigateNode> enableNodes = new ArrayList<>();
ArrayList<RetreatNavigateNode> neighborNodes = this.getNeighborNodes(currentNode, existNodes);
- for (RetreatNavigateNode node : neighborNodes) {
+ boolean pointOfTurn = neighborNodes.size() >= 2;
+ label: for (RetreatNavigateNode node : neighborNodes) {
if (node.getCodeData().equals(breakPoint)) { continue; }
+ Code code = codeService.selectByData(node.getCodeData());
int weight = 0;
+ // wave
String waveNode = waveMatrix[node.getX()][node.getY()];
assert !waveNode.equals(WaveNodeType.DISABLE.val);
if (!waveNode.equals(WaveNodeType.ENABLE.val)) {
List<String> waveNodeList = MapDataUtils.parseWaveNode(waveNode);
List<String> otherWaveList = MapDataUtils.hasOtherWave(waveNodeList, agvNo);
- if (!Cools.isEmpty(otherWaveList)) {
+ for (String otherWave : otherWaveList) {
+ if (!Cools.isEmpty(blackList) && blackList.contains(otherWave)) {
+ continue label;
+ }
+ if (1 < mapDataDispatcher.queryCodeListFromDynamicNode(lev, otherWave).size()) {
+ phaseSecond = false; // there is a running way
+ continue label;
+ } else {
+ weight += WEIGHT_CALC_FACTOR;
+ }
+ }
+ }
- if (!Cools.isEmpty(blackList) && !Cools.isEmpty(MapDataUtils.hasIntersection(otherWaveList, blackList))) {
- continue;
+ // lane
+ if (pointOfTurn) {
+ Lane lane = laneService.search(node.getCodeData());
+ if (null != lane) {
+ Set<String> lanVehicleSet = new HashSet<>();
+
+ for (String laneCodeData : lane.getCodes()) {
+ // overlap with sponsor
+ if (avoidPathList.contains(laneCodeData)) {
+ lanVehicleSet.add(sponsor);
+ }
+
+ int[] laneCodeMatrixIdx = mapDataDispatcher.getCodeMatrixIdx(null, laneCodeData);
+ // scan dynamicMatrix or WaveMatrix
+ DynamicNode laneDynamicNode = dynamicMatrix[laneCodeMatrixIdx[0]][laneCodeMatrixIdx[1]];
+ String laneVehicle = laneDynamicNode.getVehicle();
+ assert !laneVehicle.equals(DynamicNodeType.BLOCK.val);
+ if (!laneVehicle.equals(DynamicNodeType.ACCESS.val)) {
+ if (!laneVehicle.equals(agvNo)) {
+ lanVehicleSet.add(laneVehicle);
+// redis.setObject(RedisConstant.AGV_TO_STANDBY_FLAG, laneVehicle, true, 30);
+ }
+ }
}
- weight += otherWaveList.size();
+ if (lanVehicleSet.size() + 1 > maxAgvCountInLane) {
+ phaseSecond = false; // there is a running way
+ continue;
+ }
+ if (lanVehicleSet.contains(sponsor)) {
+ weight += WEIGHT_CALC_FACTOR * 2;
+ }
+ }
+ }
+
+ // judge whether the node has already been marked as a retreat node?
+ // This is a very troublesome matter, if the node be repeatedly mark as a retreat node
+ List<Segment> runningSegments = segmentService.getRunningByEndCode(code.getId());
+ for (Segment runningSeg : runningSegments) {
+ if (0 < jamService.count(new LambdaQueryWrapper<Jam>()
+ .eq(Jam::getAvoSeg, runningSeg.getId())
+ .ne(Jam::getState, JamStateType.DEPRECATED.toString()))) {
+ weight += WEIGHT_CALC_FACTOR * 3;
+ } else {
+ weight += WEIGHT_CALC_FACTOR;
}
}
@@ -121,15 +191,17 @@
}
- if (null == finialNode) {
+ if (null == finialNode && phaseSecond) {
// assert openQueue.size() == 0;
existNodes.clear();
openQueue.add(start);
existNodes.add(start);
- RetreatNavigateNode firstPointOfTurn = null;
- List<String> firstPointWaveScopeOfTurn = new ArrayList<>();
+ RetreatNavigateNode availablePointOfTurn = null;
+ List<String> availablePointWaveScopeOfTurn = new ArrayList<>();
+ int actualLanesOfTurn = 0;
+ int filterPointOfTurnTimes = 0;
while (openQueue.size() > 0 && null == finialNode) {
@@ -137,31 +209,81 @@
List<RetreatNavigateNode> enableNodes = new ArrayList<>();
ArrayList<RetreatNavigateNode> neighborNodes = this.getNeighborNodes(currentNode, existNodes);
- int forks = neighborNodes.size();
- if (firstPointOfTurn == null && forks >= 2 && !isSame(start, currentNode)) {
- firstPointOfTurn = currentNode;
- firstPointWaveScopeOfTurn = mapService.getWaveScopeByCode(lev, firstPointOfTurn.getCodeData(), avoidDistance)
- .stream().map(NavigateNode::getCodeData).distinct().collect(Collectors.toList());
+
+ // 绗竴姝ワ細鑾峰彇鏈夋晥杞集鐐�
+ if (null == availablePointOfTurn) {
+ // 璁$畻鏄惁涓哄彲鐢ㄨ浆寮偣
+ if (neighborNodes.size() >= 2 && !isSame(start, currentNode)) {
+ filterPointOfTurnTimes ++;
+ if (filterPointOfTurnTimes > 2) { break; }
+
+ for (RetreatNavigateNode node : neighborNodes) {
+ // lane
+ Lane lane = laneService.search(node.getCodeData());
+ if (null != lane) {
+ Set<String> lanVehicleSet = new HashSet<>();
+
+ for (String laneCodeData : lane.getCodes()) {
+ int[] laneCodeMatrixIdx = mapDataDispatcher.getCodeMatrixIdx(null, laneCodeData);
+ // scan dynamicMatrix or WaveMatrix
+ DynamicNode laneDynamicNode = dynamicMatrix[laneCodeMatrixIdx[0]][laneCodeMatrixIdx[1]];
+ String laneVehicle = laneDynamicNode.getVehicle();
+ assert !laneVehicle.equals(DynamicNodeType.BLOCK.val);
+ if (!laneVehicle.equals(DynamicNodeType.ACCESS.val)) {
+ if (!laneVehicle.equals(agvNo)) {
+ lanVehicleSet.add(laneVehicle);
+// redis.setObject(RedisConstant.AGV_TO_STANDBY_FLAG, laneVehicle, true, 30);
+ }
+ }
+ }
+
+ if (lanVehicleSet.size() + 1 > maxAgvCountInLane) {
+ continue;
+ }
+ }
+
+ actualLanesOfTurn ++;
+ }
+
+ // 鏈変袱鏉′互涓婂彲璧板贩閬擄紝鍒欒涓烘湁鏁堣浆寮偣
+ if (actualLanesOfTurn >= 2) {
+ availablePointOfTurn = currentNode;
+ availablePointWaveScopeOfTurn = mapService.getWaveScopeByCode(lev, availablePointOfTurn.getCodeData(), avoidDistance)
+ .stream().map(NavigateNode::getCodeData).distinct().collect(Collectors.toList());
+ } else {
+ actualLanesOfTurn = 0;
+ }
+ }
}
- for (RetreatNavigateNode node : neighborNodes) {
-
+ // 寤朵几杞集鐐瑰贩閬�
+ label: for (RetreatNavigateNode node : neighborNodes) {
int weight = 0;
+ // wave
String waveNode = waveMatrix[node.getX()][node.getY()];
assert !waveNode.equals(WaveNodeType.DISABLE.val);
if (!waveNode.equals(WaveNodeType.ENABLE.val)) {
List<String> waveNodeList = MapDataUtils.parseWaveNode(waveNode);
List<String> otherWaveList = MapDataUtils.hasOtherWave(waveNodeList, agvNo);
- if (!Cools.isEmpty(otherWaveList)) {
+ for (String otherWave : otherWaveList) {
+ if (!Cools.isEmpty(blackList) && blackList.contains(otherWave)) {
+ continue;
+ }
+ if (1 < mapDataDispatcher.queryCodeListFromDynamicNode(lev, otherWave).size()) {
- weight += otherWaveList.size();
+ if (null != availablePointOfTurn && actualLanesOfTurn > 0) {
+ actualLanesOfTurn --;
+ }
+ continue label;
+ } else {
+ weight += WEIGHT_CALC_FACTOR;
+ }
}
}
- // have cross turn road
- if (null != firstPointOfTurn) {
- if (!firstPointWaveScopeOfTurn.contains(node.getCodeData())) {
+ if (null != availablePointOfTurn) {
+ if (!availablePointWaveScopeOfTurn.contains(node.getCodeData())) {
enableNodes.add(node);
}
}
@@ -173,10 +295,16 @@
existNodes.add(node);
}
- if (!Cools.isEmpty(enableNodes)) {
- Collections.sort(enableNodes);
- finialNode = enableNodes.stream().findFirst().orElse(null);
- jam.setCycleAvo(1);
+ if (actualLanesOfTurn < 2) {
+ availablePointOfTurn = null;
+ availablePointWaveScopeOfTurn = new ArrayList<>();
+ actualLanesOfTurn = 0;
+ } else {
+ if (!Cools.isEmpty(enableNodes)) {
+ Collections.sort(enableNodes);
+ finialNode = enableNodes.stream().findFirst().orElse(null);
+ jam.setCycleAvo(1);
+ }
}
}
@@ -184,18 +312,6 @@
}
return finialNode;
- }
-
- private int calcNodeWeightVal(List<String> otherWaveList) {
- int weightVal = 0;
-
- if (!Cools.isEmpty(otherWaveList)) {
-
-
- }
-
-
- return weightVal;
}
// 鑾峰彇鍥涘懆鑺傜偣
--
Gitblit v1.9.1