package com.zy.asrs.utils;
|
|
import com.zy.core.enums.RouteCollectCountType;
|
|
import java.util.*;
|
|
import static java.util.stream.Collectors.toList;
|
|
/**
|
* Created by Monkey D. Luffy on 2023/7/18
|
*/
|
public class RouteUtils {
|
|
//问题2 周俊杰
|
public static final List<Integer> MERGE_STA_NO_One = new ArrayList<Integer>() {{
|
// add(113);add(119);
|
}};
|
|
public static final List<Integer> MERGE_STA_NO_TWO = new ArrayList<Integer>() {{
|
// add(100);add(101);
|
}};
|
|
public static final List<Integer> MERGE_STA_NO_THREE = new ArrayList<Integer>() {{
|
// add(106);add(107);
|
}};
|
|
public static final List<Integer> MERGE_STA_NO_FOUR = new ArrayList<Integer>() {{
|
// add(116);add(117);
|
}};
|
|
// RGV轨道正序(从上到下)
|
public static final List<Integer> TRACK_POSITION_POSITIVE_SEQUENCE = Arrays.asList(
|
1004,
|
1007,
|
1010,
|
1014,
|
1018,
|
1021,
|
1024,
|
1028,
|
1031,
|
1035
|
);
|
|
// 反序(直接反转生成)
|
public static final List<Integer> TRACK_POSITION_REVERSE_SEQUENCE = new ArrayList<>(TRACK_POSITION_POSITIVE_SEQUENCE);
|
static {
|
Collections.reverse(TRACK_POSITION_REVERSE_SEQUENCE);
|
}
|
//1楼战站点
|
public static final List<Integer> TRACK_POSITION_ONE = Arrays.asList(
|
1004, 1007, 1010, 1014, 1018, 1021, 1024, 1028, 1031, 1035,1042,1105,1106,1041,
|
1038,1036,1108,1109
|
);
|
//2楼战站点
|
public static final List<Integer> TRACK_POSITION_TWO = Arrays.asList(
|
2003,2006,2009,2012,2015,2018,2021,2024,2027,2030,2037,2031
|
);
|
|
// 轨道映射(把映射站点替换成主站点)
|
public static final Map<Integer, Integer> SITE_MAPPING = new HashMap<>();
|
static {
|
SITE_MAPPING.put(1042, 1004);
|
SITE_MAPPING.put(1105, 1007);
|
SITE_MAPPING.put(1106, 1010);
|
SITE_MAPPING.put(1041, 1024);
|
SITE_MAPPING.put(1038, 1028);
|
SITE_MAPPING.put(1036, 1035);
|
}
|
|
// 获取轨道列表中实际站点
|
private static Integer mapSite(Integer site) {
|
return SITE_MAPPING.getOrDefault(site, site);
|
}
|
|
|
public static String zerofill(String msg, Integer count){
|
if (msg.length() == count){
|
return msg;
|
} else if (msg.length() > count){
|
return msg.substring(0, 16);
|
} else {
|
StringBuilder msgBuilder = new StringBuilder(msg);
|
for (int i = 0; i<count-msg.length(); i++){
|
msgBuilder.insert(0,"0");
|
}
|
return msgBuilder.toString();
|
}
|
}
|
|
/*
|
* 获取干涉最远站点
|
* */
|
public static Integer RouteIndexFarMas(int rgvNo,Integer staNo){
|
List<Integer> staFall = new ArrayList<>();
|
if (MERGE_STA_NO_One.contains(staNo)){
|
staFall = MERGE_STA_NO_One;
|
}else if (MERGE_STA_NO_TWO.contains(staNo)){
|
staFall = MERGE_STA_NO_TWO;
|
}else if (MERGE_STA_NO_THREE.contains(staNo)){
|
staFall = MERGE_STA_NO_THREE;
|
}else if (MERGE_STA_NO_FOUR.contains(staNo)){
|
staFall = MERGE_STA_NO_FOUR;
|
}else {
|
return staNo;
|
}
|
|
int indexNo = 0;
|
if (rgvNo==1){
|
indexNo=staFall.size()-1;
|
}
|
return staFall.get(indexNo);
|
}
|
|
// 获取当前小车未行走的路线集合
|
public static List<Integer> getRouteDis(Integer groupStart, Integer groupEnd) {
|
groupStart = mapSite(groupStart);
|
groupEnd = mapSite(groupEnd);
|
|
int startIdx = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(groupStart);
|
int endIdx = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(groupEnd);
|
|
if (startIdx == -1 || endIdx == -1) return null;
|
|
boolean forward = startIdx < endIdx;
|
List<Integer> route = forward ? TRACK_POSITION_POSITIVE_SEQUENCE : TRACK_POSITION_REVERSE_SEQUENCE;
|
|
List<Integer> result = new ArrayList<>();
|
boolean addFlag = false;
|
for (Integer s : route) {
|
s = mapSite(s);
|
if (s.equals(groupStart)) addFlag = true;
|
if (addFlag) result.add(s);
|
if (s.equals(groupEnd)) break;
|
}
|
return result;
|
}
|
|
|
// 获取当前小车未行走的路线集合
|
public static List<Integer> getRoute(Integer groupStart,Integer groupEnd){
|
boolean sign = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(groupStart) < TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(groupEnd);
|
List<Integer> result = new ArrayList<>();
|
List<Integer> groupRoute = new ArrayList<>();
|
if (sign){
|
groupRoute = TRACK_POSITION_POSITIVE_SEQUENCE;
|
}else {
|
groupRoute = TRACK_POSITION_REVERSE_SEQUENCE;
|
}
|
if (groupRoute.contains(groupStart) && groupRoute.contains(groupEnd)) {
|
sign = false;
|
for (Integer route : groupRoute) {
|
if (route.equals(groupStart)){
|
sign=true;
|
}
|
if (route.equals(groupEnd)){
|
result.add(route);
|
break;
|
}
|
if (sign){
|
result.add(route);
|
}
|
}
|
}else {
|
return null;
|
}
|
return result;
|
}
|
public static List<Integer> getRouteOne(){
|
|
List<Integer> groupRoute = new ArrayList<>();
|
groupRoute = TRACK_POSITION_ONE;
|
|
return groupRoute;
|
}
|
public static List<Integer> getRouteTwo(){
|
|
List<Integer> groupRoute = new ArrayList<>();
|
groupRoute = TRACK_POSITION_TWO;
|
|
return groupRoute;
|
}
|
|
/*
|
* 获取最远站点
|
* */
|
public static Integer RouteIndexFarMas(Integer a,Integer b,Integer c,Integer d){
|
int ia = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(a); //当前位置
|
int ib = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(b); //地图开始位置
|
int ic = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(c); //地图结束位置
|
int id = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(d); //锁结束位置
|
if (id==0){
|
if (ia>ib){
|
if (ia>ic){
|
return a;
|
}else {
|
return c;
|
}
|
}else {
|
if (ib>ic){
|
return b;
|
}else {
|
return c;
|
}
|
}
|
}else {
|
if (ia<ib){
|
if (ia<ic){
|
return a;
|
}else {
|
return c;
|
}
|
}else {
|
if (ib<ic){
|
return b;
|
}else {
|
return c;
|
}
|
}
|
}
|
}
|
|
public static Integer[] RouteIndexFarArr(Integer a,Integer b,Integer c,Integer d){
|
int ia = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(a);
|
int ib = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(b);
|
int ic = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(c);
|
int id = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(d);
|
return new Integer[]{ia,ib,ic,id};
|
}
|
|
/*
|
* a 小车当前位置
|
* b 小车任务开始位置
|
* c 小车任务结束位置
|
* d 小车初始位置
|
* 获取最大路径差值
|
* */
|
public static List<Integer> RouteMapCurrentFar(Integer a,Integer b,Integer c,Integer d){
|
Integer farStn = RouteIndexFarMas(a, b, c, d);
|
return getRouteIntersection(TRACK_POSITION_POSITIVE_SEQUENCE,getRoute(farStn, d), RouteCollectCountType.DIFFERENCESET);
|
}
|
|
public static List<Integer> RouteMapCurrentFar(Integer farStn,Integer d){
|
return getRouteIntersection(TRACK_POSITION_POSITIVE_SEQUENCE,getRoute(farStn, d), RouteCollectCountType.DIFFERENCESET);
|
}
|
|
/*
|
* 另一台小车最远位置
|
* */
|
public static Integer RouteMapOtherFarStnNo(List<Integer> routeDIFF,Integer d){
|
int id = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(d);
|
if (id==0){
|
return routeDIFF.get(0);
|
}else {
|
int size = routeDIFF.size();
|
return routeDIFF.get(size-1);
|
}
|
}
|
|
//是否有交集
|
public static boolean getRouteBoolean(List<Integer> groupCurrent,List<Integer> groupOther){
|
for (Integer positionCurrent : groupCurrent){
|
for (Integer positionOther : groupOther){
|
if (positionCurrent.equals(positionOther)){
|
return true;
|
}
|
}
|
}
|
return false;
|
}
|
|
//集合运算
|
public static List<Integer> getRouteIntersection(List<Integer> groupCurrent, List<Integer> groupOther, RouteCollectCountType routeCollectCountType){
|
switch (routeCollectCountType){
|
case INTERSECTION:
|
//交集
|
return groupCurrent.stream().filter(item -> groupOther.contains(item)).collect(toList());
|
case DIFFERENCESET:
|
//差集
|
return groupCurrent.stream().filter(item -> !groupOther.contains(item)).collect(toList());
|
case UNION:
|
//并集
|
groupCurrent.addAll(groupOther);
|
return groupCurrent;
|
case DEDUPLICATIONUNION:
|
//去重并集
|
groupCurrent.addAll(groupOther);
|
return groupCurrent.stream().distinct().collect(toList());
|
default:
|
return null;
|
}
|
}
|
|
/*
|
* a 小车当前位置
|
* b 小车任务开始位置
|
* c 小车任务结束位置
|
* sign 另一个小车空闲标记
|
* */
|
public static boolean RouteAutoBoolean(Integer a,Integer b,Integer c,Integer aa,Integer bb,Integer cc,boolean idleOther){
|
List<Integer> routeCurrent = getRouteIntersection(getRoute(a, c), getRoute(b, c), RouteCollectCountType.DEDUPLICATIONUNION);//并集
|
List<Integer> routeOther = getRouteIntersection(getRoute(aa, cc), getRoute(bb, cc), RouteCollectCountType.DEDUPLICATIONUNION);//
|
return !getRouteBoolean(routeCurrent, routeOther); //是否有交集
|
}
|
|
public static List<Integer> RouteAutoBoolean(Integer a,Integer b,Integer c){
|
return getRouteIntersection(getRoute(a, c), getRoute(b, c), RouteCollectCountType.DEDUPLICATIONUNION);
|
}
|
|
public static Short CrnStaEnd(Integer endSta,Integer souSta) {
|
switch (endSta) {
|
case 100:
|
case 102:
|
case 111:
|
if (souSta == 118 || souSta == 127){
|
return (short)119;
|
}
|
return 149;
|
default:
|
return endSta.shortValue();
|
}
|
}
|
|
public static Short SouStaEnd(Integer endSta,Integer souSta){
|
if (souSta == 1103) {
|
return (short)1105;
|
}
|
if(souSta == 1047){
|
return (short)1042;
|
}
|
return souSta.shortValue();
|
}
|
|
|
|
public static void main(String[] arge){
|
//{"endRoute":999,"lockEndRoute":124,"lockStartRoute":161,"nowRoute":161,"rgvNo":3,"rgvStatus":0,"startRoute":161} 3hao
|
Integer i = RouteIndexFarMas(112, 161, 124, 161);
|
System.out.println(i);
|
//{"endRoute":119,"lockEndRoute":112,"lockStartRoute":100,"nowRoute":112,"rgvNo":2,"rgvStatus":0,"startRoute":100} 2
|
Integer i1 = RouteIndexFarMas(112, 100, 112, 100);
|
System.out.println(i1);
|
|
// List<Integer> routeCurrent = getRoute(100, 124); //获取当前小车路径
|
// List<Integer> routeOther = getRoute(149, 161); //获取其它小车路径
|
// System.out.println("当前小车路径:\t"+routeCurrent);
|
// System.out.println("其它小车路径:\t"+routeOther);
|
//
|
// boolean routeBoolean = getRouteBoolean(routeCurrent, routeOther); //是否有交集
|
// System.out.println("是否有交集:\t"+routeBoolean);
|
//
|
// List<Integer> routeIntersection = getRouteIntersection(routeCurrent, routeOther, RouteCollectCountType.INTERSECTION);//交集
|
// System.out.println("路径交集:\t"+routeIntersection);
|
//
|
// List<Integer> routeIntersection1 = getRouteIntersection(routeCurrent, routeOther, RouteCollectCountType.DIFFERENCESET);//差集
|
// System.out.println("路径差集:\t"+routeIntersection1);
|
//
|
// List<Integer> routeIntersection2 = getRouteIntersection(routeCurrent, routeOther, RouteCollectCountType.UNION);//并集
|
// System.out.println("路径并集:\t"+routeIntersection2);
|
//
|
// List<Integer> routeIntersection3 = getRouteIntersection(routeCurrent, routeOther, RouteCollectCountType.DEDUPLICATIONUNION);//去重并集
|
// System.out.println("路径去重并集:\t"+routeIntersection3);
|
//
|
// /*
|
// * a 小车当前位置
|
// * b 小车任务开始位置
|
// * c 小车任务结束位置
|
// * sign 另一个小车空闲标记
|
// * */
|
// System.out.println("是否有交集:\t"+RouteAutoBoolean(100,101,124,149,161,153,true)); //是否有交集 true无交集 false有交集
|
//
|
// /*
|
// * a 小车当前位置
|
// * b 小车任务开始位置
|
// * c 小车任务结束位置
|
// * d 小车初始位置
|
// * 获取最大路径差值
|
// * */
|
// List<Integer> routeDIFF = RouteMapCurrentFar(100,101,124,149);
|
// System.out.println("当前路径最大集合:\t"+ routeDIFF);
|
//
|
// Integer routeFarOther= RouteMapOtherFarStnNo(routeDIFF,124);
|
// System.out.println("另一台小车最远站点:\t"+routeFarOther);
|
//
|
//
|
// Integer[] integers = RouteIndexFarArr(100,101,124,149);
|
// for (Integer integer:integers){
|
// System.out.println(integer);
|
// }
|
}
|
|
}
|