package com.steerinfo.inPlantNavigation.service.impl; import com.steerinfo.inPlantNavigation.exception.VertexAngEdgeException; import com.steerinfo.inPlantNavigation.model.IPMMSVertex; import com.steerinfo.inPlantNavigation.model.IPMMSVertexEdge; import com.steerinfo.inPlantNavigation.service.IIPMMSVertexService; import org.apache.commons.lang.SerializationUtils; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.*; @Service("ipmmsVertexService") public class IPMMSVertexServiceImpl implements IIPMMSVertexService { @Override public ArrayList getObtainTheOptimalPath(String startpoint,String endPoint,Map> vertexEdgeList, Map vertexList) throws VertexAngEdgeException { //初始化数据 int[] startPoin=new int[]{0,-1}; //创建S战队(放入的是已经遍历过边的顶点) List obtainTheOptimalPath=new ArrayList(); //obtainTheOptimalPath.add(statpoint); //创建 dist[] (起点到集合点中的最短路径) key:指向的点 new int[]{0,-1}; {权重、中间点} HashMap currentBestDinstance=new HashMap<>(); currentBestDinstance.put(startpoint,startPoin); while (obtainTheOptimalPath.size()!=vertexList.size()){ // dist[]最小值 String stringMinimumValue = getStringMinimumValue(currentBestDinstance, obtainTheOptimalPath); //加入S战队 obtainTheOptimalPath.add(stringMinimumValue); //判断是否有进入的边 if (island(currentBestDinstance,stringMinimumValue,vertexEdgeList)){ continue; } if (stringMinimumValue.equals("0")||stringMinimumValue.equals("13")){ System.out.println(); } //借东风 List ipmmsVertexEdges = vertexEdgeList.get(stringMinimumValue); //判断是否存在边 if (ipmmsVertexEdges==null){ continue; } //遍历所有的边 for(IPMMSVertexEdge ipmmsVertexEdge :ipmmsVertexEdges){ //箭头出发点 BigDecimal outVertexID = ipmmsVertexEdge.getOutVertexID(); //到该点的最短路径 int[] starBestPath = currentBestDinstance.get(outVertexID.toString()); //被指向的顶点 BigDecimal inVertexID= ipmmsVertexEdge.getInVertexID(); int[] historyBestPaht = currentBestDinstance.get(inVertexID.toString()); if (starBestPath==null){ throw new VertexAngEdgeException("这条边不存在!"+outVertexID.toString()+"->"+inVertexID.toString()); }else if (!outVertexID.toString().equals(stringMinimumValue)){ throw new VertexAngEdgeException(outVertexID+"->"+inVertexID+"不是顶点"+stringMinimumValue+"的边!"); } //判断是否存在其路线到这个点的距离。如果不存在则将这条线路作为起点到该点最短路径、如果本条路线是最短路径需要替换最短路径 if(historyBestPaht==null){ int distance=starBestPath[0]+ipmmsVertexEdge.getWeigh(); int outVertex=outVertexID.intValue(); int[] bestPath=new int[]{distance,outVertex}; currentBestDinstance.put(inVertexID.toString(),bestPath); }else if ((starBestPath[0]+ipmmsVertexEdge.getWeigh()) currentBestDinstance,String stringMinimumValue,Map> vertexEdgeList){ if(!currentBestDinstance.containsKey(stringMinimumValue)){ Collection> values = vertexEdgeList.values(); for (List vertexEdges : values){ for (IPMMSVertexEdge vertexEdge:vertexEdges){ if (vertexEdge.getInVertexID().equals(stringMinimumValue)) return false; } } return true; } return false; } //通过所有最优解集合选择我们要的 public ArrayList startPointToEndPointPaht(String point,HashMap currentBestDinstance,Map vertexList){ ArrayList obtainOptimalPath=new ArrayList(); int beforeDistance=100; do { int[] ints = currentBestDinstance.get(point); beforeDistance=ints[1]; obtainOptimalPath.add(vertexList.get(point)); point=String.valueOf(ints[1]); } while (beforeDistance!=-1); return obtainOptimalPath; } public String getStringMinimumValue(HashMap currentBestDinstance,List obtainTheOptimalPath){ HashMap bestDinstance = (HashMap) SerializationUtils.clone(currentBestDinstance); for (String item:obtainTheOptimalPath){ if (bestDinstance.containsKey(item)){ bestDinstance.remove(item); } } Set keys = bestDinstance.keySet(); String vertex=""; int minimumValue=100; for (String key :keys){ int[] value = currentBestDinstance.get(key); if (minimumValue>value[1]){ minimumValue=value[1]; vertex=key; } } return vertex; } public Map initIPMMSVertex(){ Map IPMMSVertexList=new HashMap<>(); IPMMSVertex ipmmsVertex0=new IPMMSVertex(); ipmmsVertex0.setVertexID(new BigDecimal(0)); ipmmsVertex0.setAddressName("小东门"); ipmmsVertex0.setLongitude(new BigDecimal(23.555521)); ipmmsVertex0.setLatitude(new BigDecimal(23.555521)); IPMMSVertexList.put("0",ipmmsVertex0); IPMMSVertex ipmmsVertex1=new IPMMSVertex(); ipmmsVertex1.setVertexID(new BigDecimal(1)); ipmmsVertex1.setAddressName("一棒库"); ipmmsVertex1.setLongitude(new BigDecimal(23.555521)); ipmmsVertex1.setLatitude(new BigDecimal(23.555521)); IPMMSVertexList.put("1",ipmmsVertex1); IPMMSVertex ipmmsVertex2=new IPMMSVertex(); ipmmsVertex2.setVertexID(new BigDecimal(2)); ipmmsVertex2.setAddressName("二棒库"); ipmmsVertex2.setLongitude(new BigDecimal(23.555521)); ipmmsVertex2.setLatitude(new BigDecimal(23.555521)); IPMMSVertexList.put("2",ipmmsVertex2); IPMMSVertex ipmmsVertex3=new IPMMSVertex(); ipmmsVertex3.setVertexID(new BigDecimal(3)); ipmmsVertex3.setAddressName("高线库"); ipmmsVertex3.setLongitude(new BigDecimal(23.555521)); ipmmsVertex3.setLatitude(new BigDecimal(23.555521)); IPMMSVertexList.put("3",ipmmsVertex3); // IPMMSVertex ipmmsVertex4=new IPMMSVertex(); // ipmmsVertex4.setVertexID(new BigDecimal(4)); // ipmmsVertex4.setAddressName("拐角1"); // ipmmsVertex4.setLongitude(new BigDecimal(23.555521)); // ipmmsVertex4.setLatitude(new BigDecimal(23.555521)); // // IPMMSVertexList.put("4",ipmmsVertex4); // // // // IPMMSVertex ipmmsVertex5=new IPMMSVertex(); // ipmmsVertex5.setVertexID(new BigDecimal(5)); // ipmmsVertex5.setAddressName("拐角2"); // ipmmsVertex5.setLongitude(new BigDecimal(23.555521)); // ipmmsVertex5.setLatitude(new BigDecimal(23.555521)); // // IPMMSVertexList.put("4",ipmmsVertex5); return IPMMSVertexList; } @Override public Map initIPMSVertexTest(){ Map IPMMSVertexList=new HashMap<>(); IPMMSVertex ipmmsVertex0=new IPMMSVertex(); ipmmsVertex0.setVertexID(new BigDecimal(0)); ipmmsVertex0.setAddressName("1号汽车衡"); ipmmsVertex0.setLongitude(new BigDecimal(107.466049)); ipmmsVertex0.setLatitude(new BigDecimal(31.190349)); IPMMSVertexList.put("0",ipmmsVertex0); IPMMSVertex ipmmsVertex1=new IPMMSVertex(); ipmmsVertex1.setVertexID(new BigDecimal(1)); ipmmsVertex1.setAddressName("东门"); ipmmsVertex1.setLongitude(new BigDecimal("107.467562")); ipmmsVertex1.setLatitude(new BigDecimal("31.190679")); IPMMSVertexList.put("1",ipmmsVertex1); IPMMSVertex ipmmsVertex2=new IPMMSVertex(); ipmmsVertex2.setVertexID(new BigDecimal(2)); ipmmsVertex2.setAddressName("6号汽车衡"); ipmmsVertex2.setLongitude(new BigDecimal("107.462131")); ipmmsVertex2.setLatitude(new BigDecimal("31.189882")); IPMMSVertexList.put("2",ipmmsVertex2); IPMMSVertex ipmmsVertex3=new IPMMSVertex(); ipmmsVertex3.setVertexID(new BigDecimal(3)); ipmmsVertex3.setAddressName("7号汽车衡"); ipmmsVertex3.setLongitude(new BigDecimal("107.45816")); ipmmsVertex3.setLatitude(new BigDecimal("31.187067")); IPMMSVertexList.put("3",ipmmsVertex3); IPMMSVertex ipmmsVertex4=new IPMMSVertex(); ipmmsVertex4.setVertexID(new BigDecimal(4)); ipmmsVertex4.setAddressName("月亮湾门"); ipmmsVertex4.setLongitude(new BigDecimal("107.453282")); ipmmsVertex4.setLatitude(new BigDecimal("31.191292")); IPMMSVertexList.put("4",ipmmsVertex4); IPMMSVertex ipmmsVertex5=new IPMMSVertex(); ipmmsVertex5.setVertexID(new BigDecimal(5)); ipmmsVertex5.setAddressName("11号和12号汽车衡"); ipmmsVertex5.setLongitude(new BigDecimal("107.453421")); ipmmsVertex5.setLatitude(new BigDecimal("31.191476")); IPMMSVertexList.put("5",ipmmsVertex5); IPMMSVertex ipmmsVertex6=new IPMMSVertex(); ipmmsVertex6.setVertexID(new BigDecimal(6)); ipmmsVertex6.setAddressName("西门"); ipmmsVertex6.setLongitude(new BigDecimal("107.452733")); ipmmsVertex6.setLatitude(new BigDecimal("31.188635")); IPMMSVertexList.put("6",ipmmsVertex6); /* IPMMSVertex ipmmsVertex7=new IPMMSVertex(); ipmmsVertex7.setVertexID(new BigDecimal(7)); ipmmsVertex7.setAddressName("泰昕门"); ipmmsVertex7.setLongitude(new BigDecimal("107.450807")); ipmmsVertex7.setLatitude(new BigDecimal("31.183661")); IPMMSVertexList.put("7",ipmmsVertex7);*/ /* IPMMSVertex ipmmsVertex8=new IPMMSVertex(); ipmmsVertex8.setVertexID(new BigDecimal(8)); ipmmsVertex8.setAddressName("9号汽车衡"); ipmmsVertex8.setLongitude(new BigDecimal("107.453046")); ipmmsVertex8.setLatitude(new BigDecimal("31.185408")); IPMMSVertexList.put("8",ipmmsVertex8);*/ IPMMSVertex ipmmsVertex9=new IPMMSVertex(); ipmmsVertex9.setVertexID(new BigDecimal(9)); ipmmsVertex9.setAddressName("4号汽车衡"); ipmmsVertex9.setLongitude(new BigDecimal("107.469043")); ipmmsVertex9.setLatitude(new BigDecimal("31.186859")); IPMMSVertexList.put("9",ipmmsVertex9); IPMMSVertex ipmmsVertex10=new IPMMSVertex(); ipmmsVertex10.setVertexID(new BigDecimal(10)); ipmmsVertex10.setAddressName("桥东门"); ipmmsVertex10.setLongitude(new BigDecimal("107.469225")); ipmmsVertex10.setLatitude(new BigDecimal("31.187363")); IPMMSVertexList.put("10",ipmmsVertex10); IPMMSVertex ipmmsVertex11=new IPMMSVertex(); ipmmsVertex11.setVertexID(new BigDecimal(11)); ipmmsVertex11.setAddressName("桥西门"); ipmmsVertex11.setLongitude(new BigDecimal("107.469209")); ipmmsVertex11.setLatitude(new BigDecimal("31.187088")); IPMMSVertexList.put("11",ipmmsVertex11); IPMMSVertex ipmmsVertex12=new IPMMSVertex(); ipmmsVertex12.setVertexID(new BigDecimal(12)); ipmmsVertex12.setAddressName("3号汽车衡"); ipmmsVertex12.setLongitude(new BigDecimal("107.466479")); ipmmsVertex12.setLatitude(new BigDecimal("31.186248")); IPMMSVertexList.put("12",ipmmsVertex12); IPMMSVertex ipmmsVertex13=new IPMMSVertex(); ipmmsVertex13.setVertexID(new BigDecimal(13)); ipmmsVertex13.setAddressName("2号汽车衡"); ipmmsVertex13.setLongitude(new BigDecimal("107.467274")); ipmmsVertex13.setLatitude(new BigDecimal("31.189362")); IPMMSVertexList.put("13",ipmmsVertex13); IPMMSVertex ipmmsVertex14=new IPMMSVertex(); ipmmsVertex14.setVertexID(new BigDecimal(14)); ipmmsVertex14.setAddressName("小东门"); ipmmsVertex14.setLongitude(new BigDecimal("107.467983")); ipmmsVertex14.setLatitude(new BigDecimal("31.189399")); IPMMSVertexList.put("14",ipmmsVertex14); IPMMSVertex ipmmsVertex15=new IPMMSVertex(); ipmmsVertex15.setVertexID(new BigDecimal(15)); ipmmsVertex15.setAddressName("5号汽车衡"); ipmmsVertex15.setLongitude(new BigDecimal("107.463176")); ipmmsVertex15.setLatitude(new BigDecimal("31.189472")); IPMMSVertexList.put("15",ipmmsVertex15); IPMMSVertex ipmmsVertex16=new IPMMSVertex(); ipmmsVertex16.setVertexID(new BigDecimal(16)); ipmmsVertex16.setAddressName("10号汽车衡"); ipmmsVertex16.setLongitude(new BigDecimal("107.466647")); ipmmsVertex16.setLatitude(new BigDecimal("31.189293")); IPMMSVertexList.put("16",ipmmsVertex16); IPMMSVertex ipmmsVertex17=new IPMMSVertex(); ipmmsVertex17.setVertexID(new BigDecimal(17)); ipmmsVertex17.setAddressName("8号汽车衡"); ipmmsVertex17.setLongitude(new BigDecimal("107.454598")); ipmmsVertex17.setLatitude(new BigDecimal("31.188869")); IPMMSVertexList.put("17",ipmmsVertex16); return IPMMSVertexList; } }