Commit eddbe1cc authored by duanruiming's avatar duanruiming

[add] 优化计算算法

parent c85b4a40
......@@ -93,6 +93,9 @@ public class HisenseGreenChartTask {
// 1.根据绿波带长度和速度计算行程时间
// 2.根据相位差,行程时间,海信环图计算绿灯红灯点位 正向 crossRedTimesMap 反向backCrossRedTimesMap
// todo test
//List<GreenCrossDirDTO> collect = greenCrossDirCache.stream().filter(dto -> dto.getGreenId() == 1).collect(Collectors.toList());
Map<Integer, List<GreenCrossDirDTO>> greenMap = greenCrossDirCache.stream().collect(Collectors.groupingBy(GreenCrossDirDTO::getGreenId));
List<GreenBeltChartDTO> greenBeltChartDTOS = new ArrayList<>();
for (Map.Entry<Integer, List<GreenCrossDirDTO>> entry : greenMap.entrySet()) {
......@@ -219,7 +222,7 @@ public class HisenseGreenChartTask {
Map<String, List<List<Double>>> greenStartMap = new LinkedHashMap<>();
List<List<Double>> firstGreenStartList = new ArrayList<>();
List<List<Double>> secondGreenStartList = new ArrayList<>();
List<Double> firstStartEndList = new ArrayList<>();
GreenCrossDirDTO firstDto = value.get(i);
String firstCrossId = firstDto.getCrossId();
Integer inCrossDir = null;
......@@ -248,7 +251,8 @@ public class HisenseGreenChartTask {
}
if (2 == type) {
beltDir = greenBeltChartDTO.getBackDir();
} }
}
}
if (Objects.equals(greenId, beltGreenId) && Objects.equals(inCrossDir, beltDir)) {
Double travelTime = getTravelTime(i, greenBeltChartDTO, type);
Map<String, List<List<Double>>> crossGreenTimesMap = null;
......@@ -266,11 +270,6 @@ public class HisenseGreenChartTask {
List<Double> greenStartEnd = firstList.get(i1);
Double greenStart = greenStartEnd.get(0);
Double greenEnd = greenStartEnd.get(1);
int index = 0;
Double start = 0.0;
Double end = 0.0;
Double start2 = 0.0;
Double end2 = 0.0;
for (int j = greenStart.intValue(); j <= greenEnd.intValue(); j++) {
int firstStartPoint = j + travelTime.intValue();
for (int i3 = 0; i3 < secondList.size(); i3++) {
......@@ -281,21 +280,30 @@ public class HisenseGreenChartTask {
if (greenStart <= j && j <= greenEnd
&& greenStart2 <= firstStartPoint && firstStartPoint <= greenEnd2) {
if (index == 0) {
start = j * 1.0;
start2 = firstStartPoint * 1.0;
} else {
Double tempEnd = j * 1.0;
end = end > tempEnd ? end : tempEnd;
Double tempEnd2 = firstStartPoint * 1.0;
end2 = end2 > tempEnd2 ? end2 : tempEnd2;
Double temp = j * 1.0;
firstStartEndList.add(temp);
}
}
++index;
}
}
}
if (!CollectionUtils.isEmpty(firstStartEndList)) {
Double start = firstStartEndList.get(0);
Double end = firstStartEndList.get(0);
for (int k = 1; k < firstStartEndList.size(); k++) {
Double next = firstStartEndList.get(k);
Double prev = firstStartEndList.get(k - 1);
if (next - prev == 1.0) {
end = firstStartEndList.get(k);
if (k + 1 == firstStartEndList.size()) {
firstGreenStartList.add(Arrays.asList(start, end));
secondGreenStartList.add(Arrays.asList(start + travelTime.intValue(), end + travelTime.intValue()));
}
} else {
firstGreenStartList.add(Arrays.asList(start, end));
secondGreenStartList.add(Arrays.asList(start2, end2));
secondGreenStartList.add(Arrays.asList(start + travelTime.intValue(), end + travelTime.intValue()));
start = firstStartEndList.get(k);
end = firstStartEndList.get(k);
}
}
}
......@@ -303,6 +311,7 @@ public class HisenseGreenChartTask {
greenStartMap.put(secondCrossId, secondGreenStartList);
}
}
}
greenwaveStartGroup.add(greenStartMap);
}
}
......@@ -373,20 +382,23 @@ public class HisenseGreenChartTask {
// 绿灯时间
crossGreenTimes.add(Arrays.asList(cycleIndex + offset + greenStartTime, cycleIndex + offset + greenEndTime));
} else if (i > 0 && i < cycleSum) {
crossRedTimes.add(Arrays.asList(cycleIndex + offset + greenEndTime, cycleIndex * (i + 1) + offset));
crossRedTimes.add(Arrays.asList(cycleIndex + offset + greenEndTime, cycleLen * (i + 1) + offset));
// 绿灯时间
crossGreenTimes.add(Arrays.asList(cycleIndex + offset + greenStartTime, cycleIndex + offset + greenEndTime));
} else if (i == cycleSum) {
// a最后一个周期补充相位差
crossRedTimes.add(Arrays.asList(cycleIndex + offset + greenEndTime, cycleIndex + offset + endCycleExt));
// 绿灯时间
if (greenStartTime > endCycleExt) {
//crossGreenTimes.add(Arrays.asList(cycleIndex + offset + greenStartTime, cycleIndex + offset + endCycleExt));
} else {
if (endCycleExt <= greenStartTime) {
crossRedTimes.add(Arrays.asList(cycleIndex + offset, cycleIndex + offset + endCycleExt));
} else if (greenStartTime <= endCycleExt && endCycleExt <= greenEndTime) {
crossRedTimes.add(Arrays.asList(cycleIndex + offset, cycleIndex + offset + greenStartTime));
crossGreenTimes.add(Arrays.asList(cycleIndex + offset + greenStartTime, cycleIndex + offset + endCycleExt));
} else {
crossRedTimes.add(Arrays.asList(cycleIndex + offset, cycleIndex + offset + greenStartTime));
crossGreenTimes.add(Arrays.asList(cycleIndex + offset + greenStartTime, cycleIndex + offset + greenEndTime));
crossGreenTimes.add(Arrays.asList(cycleIndex + offset + greenEndTime, cycleIndex + offset + endCycleExt));
}
}
} else { // 红灯结束时间 < 相位差, 相位差包含绿灯,endCycleExt都是红灯
// 相位差中绿灯时间
if (i == 0) {
......@@ -401,7 +413,7 @@ public class HisenseGreenChartTask {
crossGreenTimes.add(Arrays.asList(cycleIndex + offset + greenStartTime, cycleIndex + offset + greenEndTime));
} else if (i > 0 && i < cycleSum) {
crossRedTimes.add(Arrays.asList(cycleIndex + offset, cycleIndex + offset + greenStartTime));
crossRedTimes.add(Arrays.asList(cycleIndex + offset + greenEndTime, cycleIndex * (i + 1) + offset));
crossRedTimes.add(Arrays.asList(cycleIndex + offset + greenEndTime, cycleLen * (i + 1) + offset));
// 绿灯时间
crossGreenTimes.add(Arrays.asList(cycleIndex + offset + greenStartTime, cycleIndex + offset + greenEndTime));
}
......@@ -466,7 +478,8 @@ public class HisenseGreenChartTask {
if (StringUtils.isBlank(str)) {
continue;
}
List<RingPhaseInfoDTO> ringPhaseInfoDTOS = mapper.readValue(str, new TypeReference<List<RingPhaseInfoDTO>>() {});
List<RingPhaseInfoDTO> ringPhaseInfoDTOS = mapper.readValue(str, new TypeReference<List<RingPhaseInfoDTO>>() {
});
// 遍历绿波路口协调方向
if (StringUtils.isNotBlank(greenDirStr)) {
String[] greenDirArray = greenDirStr.split(",");
......@@ -543,7 +556,8 @@ public class HisenseGreenChartTask {
String dir = entity.getDir();
Integer inDir = GreenBeltDirEnum.getInDir(dir);
Double greenWidthTime = entity.getGreenWidthTime();
List<GreenBeltInfoVO.CrossGreenDetail> crossGreenDetailList = mapper.readValue(crossGreenDetail, new TypeReference<List<GreenBeltInfoVO.CrossGreenDetail>>() {});
List<GreenBeltInfoVO.CrossGreenDetail> crossGreenDetailList = mapper.readValue(crossGreenDetail, new TypeReference<List<GreenBeltInfoVO.CrossGreenDetail>>() {
});
if (!CollectionUtils.isEmpty(crossGreenDetailList)) {
// 默认神思优化方案100,相位101
int index = 100;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment