Commit 51b67285 authored by hanbing's avatar hanbing

[update] 干线评价,符合策略数算法修改

parent d55f7de6
...@@ -31,8 +31,6 @@ import java.text.SimpleDateFormat; ...@@ -31,8 +31,6 @@ import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.ToDoubleFunction; import java.util.function.ToDoubleFunction;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -661,15 +659,15 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -661,15 +659,15 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
public MainlineSchemeAnalysisVO mainlineSchemeAnalysis(MainlineSchemeAnalysisBO bo) throws ParseException { public MainlineSchemeAnalysisVO mainlineSchemeAnalysis(MainlineSchemeAnalysisBO bo) throws ParseException {
lineSchemeBuffer.clear(); lineSchemeBuffer.clear();
String mainlineName = bo.getName(); String mainlineName = bo.getName();
Date poStartTime = bo.getStartTime(); Date boStartTime = bo.getStartTime();
Date poEndTime = bo.getEndTime(); Date boEndTime = bo.getEndTime();
String poStartTimeStr = sdf.format(poStartTime); String boStartTimeStr = sdf.format(boStartTime);
String poEndTimeStr = sdf.format(poEndTime); String boEndTimeStr = sdf.format(boEndTime);
int poStartTimeStamp = (int) (poStartTime.getTime() / 1000); int boStartTimeStamp = (int) (boStartTime.getTime() / 1000);
int poEndTimeStamp = (int) (poEndTime.getTime() / 1000); int boEndTimeStamp = (int) (boEndTime.getTime() / 1000);
// 根据时段查询所有发生的绿波 // 根据时段查询所有发生的绿波
List<GreenwaveHistPO> greenwaveHistPOList = greenwaveHistMapper List<GreenwaveHistPO> greenwaveHistPOList = greenwaveHistMapper
.selectByTimeSection(poStartTimeStr, poEndTimeStr); .selectByTimeSection(boStartTimeStr, boEndTimeStr);
// 根据干线名称筛选结果 // 根据干线名称筛选结果
List<GreenwaveHistPO> filteredList = greenwaveHistPOList.stream() List<GreenwaveHistPO> filteredList = greenwaveHistPOList.stream()
.filter(po -> { .filter(po -> {
...@@ -688,7 +686,8 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -688,7 +686,8 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
// 时段合并 // 时段合并
mergeLineSchemeBuffer(lineSchemeBuffer, mainlineName); mergeLineSchemeBuffer(lineSchemeBuffer, mainlineName);
res.setSceneData(calcSceneData(lineSchemeBuffer)); res.setSceneData(calcSceneData(lineSchemeBuffer));
res.setEvaluateData(calcEvaluateData(filteredList, lineSchemeBuffer, poStartTimeStamp, poEndTimeStamp)); res.setEvaluateData(calcEvaluateData(
filteredList, lineSchemeBuffer, boStartTimeStamp, boEndTimeStamp, boStartTime, boEndTime));
res.setGreenwaveData(buildGreenwaveData(lineSchemeBuffer)); res.setGreenwaveData(buildGreenwaveData(lineSchemeBuffer));
res.setCrossData(calcCrossData(lineSchemeBuffer)); res.setCrossData(calcCrossData(lineSchemeBuffer));
...@@ -1113,6 +1112,14 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -1113,6 +1112,14 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
.orElse(0.0); .orElse(0.0);
List<GreenwaveCrossPO> greenwaveCrossPOList = greenwaveCrossMapper.selectByGreenwaveId(greenwaveId); List<GreenwaveCrossPO> greenwaveCrossPOList = greenwaveCrossMapper.selectByGreenwaveId(greenwaveId);
Map<String, GreenwaveCrossPO> uniqueCrossIdMap = greenwaveCrossPOList.stream()
.collect(Collectors.toMap(
GreenwaveCrossPO::getCrossId,
Function.identity(),
(existing, replacement) -> existing
));
List<GreenwaveCrossPO> filteredList = new ArrayList<>(uniqueCrossIdMap.values());
// 获取各路口方向历史数据 // 获取各路口方向历史数据
// 提取方向 // 提取方向
String[] split = dirName.split("向"); String[] split = dirName.split("向");
...@@ -1123,7 +1130,7 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -1123,7 +1130,7 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
String boStartDayStr = dayFormat.format(boStartTime); String boStartDayStr = dayFormat.format(boStartTime);
String boEndDayStr = dayFormat.format(boEndTime); String boEndDayStr = dayFormat.format(boEndTime);
List<CrossDirDataHistPO> poInSectionList = crossDirDataHistMapper.selectByTimeSection(boStartDayStr, boEndDayStr, startHourMinuteStr, endHourMinuteStr); List<CrossDirDataHistPO> poInSectionList = crossDirDataHistMapper.selectByTimeSection(boStartDayStr, boEndDayStr, startHourMinuteStr, endHourMinuteStr);
for (GreenwaveCrossPO greenwaveCrossPO : greenwaveCrossPOList) { for (GreenwaveCrossPO greenwaveCrossPO : filteredList) {
buildTotalCrossDirHistList(dirStr, dir, totalCrossDirDataHistPOList, greenwaveCrossPO, poInSectionList); buildTotalCrossDirHistList(dirStr, dir, totalCrossDirDataHistPOList, greenwaveCrossPO, poInSectionList);
} }
...@@ -1683,108 +1690,142 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -1683,108 +1690,142 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
} }
private List<String> calcEvaluateData( private List<String> calcEvaluateData(
List<GreenwaveHistPO> filteredList, Map<String, LineSchemeDTO> lineSchemeBuffer, int poStartTimeStamp, List<GreenwaveHistPO> filteredList, Map<String, LineSchemeDTO> lineSchemeBuffer, int boStartTimeStamp,
int poEndTimeStamp) { int boEndTimeStamp, Date boStartTime, Date boEndTime) {
List<CrossDataHistPO> baseCrossDataHistPOList = crossDataHistMapper.selectByStartEnd(poStartTimeStamp, poEndTimeStamp);
List<CrossDataHistPO> baseCrossDataHistPOList = crossDataHistMapper.selectByStartEnd(boStartTimeStamp, boEndTimeStamp);
List<GreenwaveCrossPO> baseGreenwaveCrossPOList = greenwaveCrossMapper.selectAll(); List<GreenwaveCrossPO> baseGreenwaveCrossPOList = greenwaveCrossMapper.selectAll();
List<BaseCrossInfoPO> baseCrossInfoPOList = baseCrossInfoMapper.selectAll(); List<BaseCrossInfoPO> baseCrossInfoPOList = baseCrossInfoMapper.selectAll();
Set<String> qualifiedSet = new HashSet<>(); Set<String> qualifiedSet = new HashSet<>();
Set<String> notQualifiedSet = new HashSet<>(); Set<String> notQualifiedSet = new HashSet<>();
for (GreenwaveHistPO greenwaveHistPO : filteredList) {
Double noparkPassRate = greenwaveHistPO.getNoparkPassRate();
Double cordReliability = greenwaveHistPO.getCordReliability();
Double uncoordinatePhaseQueue = greenwaveHistPO.getUncoordinatePhaseQueue();
Double cordQueueRatio = greenwaveHistPO.getCordQueueRatio();
Integer greenwaveId = greenwaveHistPO.getId();
// 确定控制策略
StrategyPO strategyPO = getStrategyPO(greenwaveId);
String strategyCode = strategyPO.getStrategyCode();
// 确定评价 for (String greenwaveName : lineSchemeBuffer.keySet()) {
// 获取时段 String[] split = greenwaveName.split(" "); // 旅游路 东向西 转山西路至霞景路路段:正向绿波 工作日 19:00-20:00
Date gmtModified = greenwaveHistPO.getGmtModified(); String baseGreenwaveName = split[0] + " " + split[1] + " " + split[2]; // 旅游路 东向西 转山西路至霞景路路段:正向绿波
String matchingKey = findKey(lineSchemeBuffer, greenwaveId, gmtModified); String timeSpan = split[4]; // 19:00-20:00
Pattern pattern = Pattern.compile("(\\d{2}:\\d{2})-(\\d{2}:\\d{2})"); String[] split1 = timeSpan.split("-");
Matcher matcher = pattern.matcher(matchingKey); String startHourMinuteStr = split1[0];
matcher.find(); String endHourMinuteStr = split1[1];
String startHourMinuteStr = matcher.group(1);
String endHourMinuteStr = matcher.group(2); List<GreenwaveHistPO> filteredList1 = filteredList.stream()
.filter(po -> baseGreenwaveName.equals(po.getGreenwaveName()))
Date day = greenwaveHistPO.getGmtModified();
Date startDate = combineDateAndTime(day, startHourMinuteStr);
Date endDate = combineDateAndTime(day, endHourMinuteStr);
// 获取路口
List<BaseCrossInfoPO> crossInfoPOList = getGreenwaveCross(
greenwaveId, baseGreenwaveCrossPOList, baseCrossInfoPOList);
// 获取路口历史数据
List<String> crossIdList = crossInfoPOList.stream()
.map(BaseCrossInfoPO::getId)
.collect(Collectors.toList()); .collect(Collectors.toList());
int startTimeStamp = (int) (startDate.getTime() / 1000);
int endTimeStamp = (int) (endDate.getTime() / 1000); // 过滤时段内的数据
List<CrossDataHistPO> crossDataHistPOList = baseCrossDataHistPOList.stream() List<GreenwaveHistPO> filteredGreenwaveList = filteredList1.stream()
.filter(po -> po.getBatchTime() >= startTimeStamp && po.getBatchTime() <= endTimeStamp) .filter(po -> {
.filter(po -> crossIdList.contains(po.getCrossId())) try {
return isTimeInRange(po.getGmtModified(), startHourMinuteStr, endHourMinuteStr);
} catch (ParseException e) {
throw new RuntimeException(e);
}
})
.collect(Collectors.toList()); .collect(Collectors.toList());
// 判断时段内的饱和度
double saturation = crossDataHistPOList.stream() // 获取绿波指标
.mapToDouble(CrossDataHistPO::getSturation) double noparkPassRate = filteredGreenwaveList.stream()
.mapToDouble(GreenwaveHistPO::getNoparkPassRate)
.average()
.orElse(0.0);
double cordReliability = filteredGreenwaveList.stream()
.mapToDouble(GreenwaveHistPO::getCordReliability)
.average()
.orElse(0.0);
double uncoordinatePhaseQueue = filteredGreenwaveList.stream()
.mapToDouble(GreenwaveHistPO::getUncoordinatePhaseQueue)
.average()
.orElse(0.0);
double cordQueueRatio = filteredGreenwaveList.stream()
.mapToDouble(GreenwaveHistPO::getCordQueueRatio)
.average() .average()
.orElse(0.0); .orElse(0.0);
Integer dir = greenwaveHistPO.getDir(); GreenwaveInfoPO greenwaveInfoPO = greenwaveInfoMapper.selectByName(baseGreenwaveName);
Integer greenwaveId = greenwaveInfoPO.getId();
List<GreenwaveCrossPO> greenwaveCrossPOList = greenwaveCrossMapper.selectByGreenwaveId(greenwaveId);
Map<String, GreenwaveCrossPO> uniqueCrossIdMap = greenwaveCrossPOList.stream()
.collect(Collectors.toMap(
GreenwaveCrossPO::getCrossId,
Function.identity(),
(existing, replacement) -> existing
));
List<GreenwaveCrossPO> crossList = new ArrayList<>(uniqueCrossIdMap.values());
// 获取各路口方向历史数据
// 提取方向
String s = split[1]; // 东向西
String[] split2 = s.split("向");
String dirStr = split2[0];
Integer dir = BaseEnum.SignalDirectionEnum.getCodeByName(dirStr);
List<CrossDirDataHistPO> totalCrossDirDataHistPOList = new ArrayList<>();
String boStartDayStr = dayFormat.format(boStartTime);
String boEndDayStr = dayFormat.format(boEndTime);
List<CrossDirDataHistPO> poInSectionList = crossDirDataHistMapper.selectByTimeSection(boStartDayStr, boEndDayStr, startHourMinuteStr, endHourMinuteStr);
for (GreenwaveCrossPO greenwaveCrossPO : crossList) {
buildTotalCrossDirHistList(dirStr, dir, totalCrossDirDataHistPOList, greenwaveCrossPO, poInSectionList);
}
// 获取饱和度
double saturation = totalCrossDirDataHistPOList.stream()
.mapToDouble(CrossDirDataHistPO::getSturation)
.average()
.orElse(0.0);
if (dir == 0 || dir == 1) { // 单向绿波 Integer greenwaveDir = greenwaveInfoPO.getDir();
// 确定控制策略
StrategyPO strategyPO = getStrategyPO(greenwaveId);
String strategyCode = strategyPO.getStrategyCode();
if (greenwaveDir == 0 || greenwaveDir == 1) { // 单向绿波
if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.LINE_EFFICIENCY.getCode())) { if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.LINE_EFFICIENCY.getCode())) {
if (saturation < 0.8) { if (saturation < 0.8) {
if (noparkPassRate > 0.8 && cordReliability > 0.7) { if (noparkPassRate > 0.8 && cordReliability > 0.7) {
// 协调不停车通过率需大于80%,并且协调方案可靠性需大于70% // 协调不停车通过率需大于80%,并且协调方案可靠性需大于70%
qualifiedSet.add(matchingKey); qualifiedSet.add(greenwaveName);
} else if (uncoordinatePhaseQueue < 0.5) { } else if (uncoordinatePhaseQueue < 0.5) {
// 如果以上不满足,则非协调相位二次排队需小于50% // 如果以上不满足,则非协调相位二次排队需小于50%
qualifiedSet.add(matchingKey); qualifiedSet.add(greenwaveName);
} else { } else {
notQualifiedSet.add(matchingKey); notQualifiedSet.add(greenwaveName);
} }
} else { } else {
// 协调方案可靠性需大于70% // 协调方案可靠性需大于70%
if (cordReliability > 0.7) { if (cordReliability > 0.7) {
qualifiedSet.add(matchingKey); qualifiedSet.add(greenwaveName);
} else { } else {
notQualifiedSet.add(matchingKey); notQualifiedSet.add(greenwaveName);
} }
} }
} else if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.LINE_BALANCE.getCode())) { } else if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.LINE_BALANCE.getCode())) {
if (cordQueueRatio < 0.6) { if (cordQueueRatio < 0.6) {
// 协调路段排队空间占比需小于60% // 协调路段排队空间占比需小于60%
qualifiedSet.add(matchingKey); qualifiedSet.add(greenwaveName);
} else if (uncoordinatePhaseQueue < 1.0) { } else if (uncoordinatePhaseQueue < 1.0) {
// 如果以上不满足,则非协调相位二次排队需小于100% // 如果以上不满足,则非协调相位二次排队需小于100%
qualifiedSet.add(matchingKey); qualifiedSet.add(greenwaveName);
} else { } else {
notQualifiedSet.add(matchingKey); notQualifiedSet.add(greenwaveName);
} }
} }
} else { // 双向绿波 } else { // 双向绿波
if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.LINE_EFFICIENCY.getCode())) { if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.LINE_EFFICIENCY.getCode())) {
// 协调不停车通过率需大于50%,并且协调方案可靠性需大于70% // 协调不停车通过率需大于50%,并且协调方案可靠性需大于70%
if (noparkPassRate > 0.5 && cordReliability > 0.7) { if (noparkPassRate > 0.5 && cordReliability > 0.7) {
qualifiedSet.add(matchingKey); qualifiedSet.add(greenwaveName);
} else { } else {
notQualifiedSet.add(matchingKey); notQualifiedSet.add(greenwaveName);
} }
} else if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.LINE_BALANCE.getCode())) { } else if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.LINE_BALANCE.getCode())) {
if (cordQueueRatio < 0.6) { if (cordQueueRatio < 0.6) {
// 协调路段排队空间占比需小于60% // 协调路段排队空间占比需小于60%
qualifiedSet.add(matchingKey); qualifiedSet.add(greenwaveName);
} else if (uncoordinatePhaseQueue < 1.0) { } else if (uncoordinatePhaseQueue < 1.0) {
// 如果以上不满足,则非协调相位二次排队需小于100% // 如果以上不满足,则非协调相位二次排队需小于100%
qualifiedSet.add(matchingKey); qualifiedSet.add(greenwaveName);
} else { } else {
notQualifiedSet.add(matchingKey); notQualifiedSet.add(greenwaveName);
} }
} }
} }
......
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