Commit 51b67285 authored by hanbing's avatar hanbing

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

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