123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 |
- 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<IPMMSVertex> getObtainTheOptimalPath(String startpoint,String endPoint,Map<String, List<IPMMSVertexEdge>> vertexEdgeList, Map<String, IPMMSVertex> vertexList) throws VertexAngEdgeException {
- //初始化数据
- int[] startPoin=new int[]{0,-1};
- //创建S战队(放入的是已经遍历过边的顶点)
- List<String> obtainTheOptimalPath=new ArrayList();
- //obtainTheOptimalPath.add(statpoint);
- //创建 dist[] (起点到集合点中的最短路径) key:指向的点 new int[]{0,-1}; {权重、中间点}
- HashMap<String,int[]> 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<IPMMSVertexEdge> 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())<historyBestPaht[0]){
- //更新和此顶点有关的数据
- }
- }
- }
- return startPointToEndPointPaht(endPoint,currentBestDinstance,vertexList);
- }
- //判断是否有进入这个顶点的边,如果没有这个顶点就是一个孤岛
- public Boolean island(HashMap<String,int[]> currentBestDinstance,String stringMinimumValue,Map<String, List<IPMMSVertexEdge>> vertexEdgeList){
- if(!currentBestDinstance.containsKey(stringMinimumValue)){
- Collection<List<IPMMSVertexEdge>> values = vertexEdgeList.values();
- for (List<IPMMSVertexEdge> vertexEdges : values){
- for (IPMMSVertexEdge vertexEdge:vertexEdges){
- if (vertexEdge.getInVertexID().equals(stringMinimumValue))
- return false;
- }
- }
- return true;
- }
- return false;
- }
- //通过所有最优解集合选择我们要的
- public ArrayList<IPMMSVertex> startPointToEndPointPaht(String point,HashMap<String,int[]> currentBestDinstance,Map<String, IPMMSVertex> vertexList){
- ArrayList<IPMMSVertex> 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<String,int[]> currentBestDinstance,List<String> obtainTheOptimalPath){
- HashMap<String,int[]> bestDinstance = (HashMap<String, int[]>) SerializationUtils.clone(currentBestDinstance);
- for (String item:obtainTheOptimalPath){
- if (bestDinstance.containsKey(item)){
- bestDinstance.remove(item);
- }
- }
- Set<String> 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<String,IPMMSVertex> initIPMMSVertex(){
- Map<String,IPMMSVertex> 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<String,IPMMSVertex> initIPMSVertexTest(){
- Map<String,IPMMSVertex> 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;
- }
- }
|