IPMMSVertexServiceImpl.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. package com.steerinfo.inPlantNavigation.service.impl;
  2. import com.steerinfo.inPlantNavigation.exception.VertexAngEdgeException;
  3. import com.steerinfo.inPlantNavigation.model.IPMMSVertex;
  4. import com.steerinfo.inPlantNavigation.model.IPMMSVertexEdge;
  5. import com.steerinfo.inPlantNavigation.service.IIPMMSVertexService;
  6. import org.apache.commons.lang.SerializationUtils;
  7. import org.springframework.stereotype.Service;
  8. import java.math.BigDecimal;
  9. import java.util.*;
  10. @Service("ipmmsVertexService")
  11. public class IPMMSVertexServiceImpl implements IIPMMSVertexService {
  12. @Override
  13. public ArrayList<IPMMSVertex> getObtainTheOptimalPath(String startpoint,String endPoint,Map<String, List<IPMMSVertexEdge>> vertexEdgeList, Map<String, IPMMSVertex> vertexList) throws VertexAngEdgeException {
  14. //初始化数据
  15. int[] startPoin=new int[]{0,-1};
  16. //创建S战队(放入的是已经遍历过边的顶点)
  17. List<String> obtainTheOptimalPath=new ArrayList();
  18. //obtainTheOptimalPath.add(statpoint);
  19. //创建 dist[] (起点到集合点中的最短路径) key:指向的点 new int[]{0,-1}; {权重、中间点}
  20. HashMap<String,int[]> currentBestDinstance=new HashMap<>();
  21. currentBestDinstance.put(startpoint,startPoin);
  22. while (obtainTheOptimalPath.size()!=vertexList.size()){
  23. // dist[]最小值
  24. String stringMinimumValue = getStringMinimumValue(currentBestDinstance, obtainTheOptimalPath);
  25. //加入S战队
  26. obtainTheOptimalPath.add(stringMinimumValue);
  27. //判断是否有进入的边
  28. if (island(currentBestDinstance,stringMinimumValue,vertexEdgeList)){
  29. continue;
  30. }
  31. if (stringMinimumValue.equals("0")||stringMinimumValue.equals("13")){
  32. System.out.println();
  33. }
  34. //借东风
  35. List<IPMMSVertexEdge> ipmmsVertexEdges = vertexEdgeList.get(stringMinimumValue);
  36. //判断是否存在边
  37. if (ipmmsVertexEdges==null){
  38. continue;
  39. }
  40. //遍历所有的边
  41. for(IPMMSVertexEdge ipmmsVertexEdge :ipmmsVertexEdges){
  42. //箭头出发点
  43. BigDecimal outVertexID = ipmmsVertexEdge.getOutVertexID();
  44. //到该点的最短路径
  45. int[] starBestPath = currentBestDinstance.get(outVertexID.toString());
  46. //被指向的顶点
  47. BigDecimal inVertexID= ipmmsVertexEdge.getInVertexID();
  48. int[] historyBestPaht = currentBestDinstance.get(inVertexID.toString());
  49. if (starBestPath==null){
  50. throw new VertexAngEdgeException("这条边不存在!"+outVertexID.toString()+"->"+inVertexID.toString());
  51. }else if (!outVertexID.toString().equals(stringMinimumValue)){
  52. throw new VertexAngEdgeException(outVertexID+"->"+inVertexID+"不是顶点"+stringMinimumValue+"的边!");
  53. }
  54. //判断是否存在其路线到这个点的距离。如果不存在则将这条线路作为起点到该点最短路径、如果本条路线是最短路径需要替换最短路径
  55. if(historyBestPaht==null){
  56. int distance=starBestPath[0]+ipmmsVertexEdge.getWeigh();
  57. int outVertex=outVertexID.intValue();
  58. int[] bestPath=new int[]{distance,outVertex};
  59. currentBestDinstance.put(inVertexID.toString(),bestPath);
  60. }else if ((starBestPath[0]+ipmmsVertexEdge.getWeigh())<historyBestPaht[0]){
  61. //更新和此顶点有关的数据
  62. }
  63. }
  64. }
  65. return startPointToEndPointPaht(endPoint,currentBestDinstance,vertexList);
  66. }
  67. //判断是否有进入这个顶点的边,如果没有这个顶点就是一个孤岛
  68. public Boolean island(HashMap<String,int[]> currentBestDinstance,String stringMinimumValue,Map<String, List<IPMMSVertexEdge>> vertexEdgeList){
  69. if(!currentBestDinstance.containsKey(stringMinimumValue)){
  70. Collection<List<IPMMSVertexEdge>> values = vertexEdgeList.values();
  71. for (List<IPMMSVertexEdge> vertexEdges : values){
  72. for (IPMMSVertexEdge vertexEdge:vertexEdges){
  73. if (vertexEdge.getInVertexID().equals(stringMinimumValue))
  74. return false;
  75. }
  76. }
  77. return true;
  78. }
  79. return false;
  80. }
  81. //通过所有最优解集合选择我们要的
  82. public ArrayList<IPMMSVertex> startPointToEndPointPaht(String point,HashMap<String,int[]> currentBestDinstance,Map<String, IPMMSVertex> vertexList){
  83. ArrayList<IPMMSVertex> obtainOptimalPath=new ArrayList();
  84. int beforeDistance=100;
  85. do {
  86. int[] ints = currentBestDinstance.get(point);
  87. beforeDistance=ints[1];
  88. obtainOptimalPath.add(vertexList.get(point));
  89. point=String.valueOf(ints[1]);
  90. }
  91. while (beforeDistance!=-1);
  92. return obtainOptimalPath;
  93. }
  94. public String getStringMinimumValue(HashMap<String,int[]> currentBestDinstance,List<String> obtainTheOptimalPath){
  95. HashMap<String,int[]> bestDinstance = (HashMap<String, int[]>) SerializationUtils.clone(currentBestDinstance);
  96. for (String item:obtainTheOptimalPath){
  97. if (bestDinstance.containsKey(item)){
  98. bestDinstance.remove(item);
  99. }
  100. }
  101. Set<String> keys = bestDinstance.keySet();
  102. String vertex="";
  103. int minimumValue=100;
  104. for (String key :keys){
  105. int[] value = currentBestDinstance.get(key);
  106. if (minimumValue>value[1]){
  107. minimumValue=value[1];
  108. vertex=key;
  109. }
  110. }
  111. return vertex;
  112. }
  113. public Map<String,IPMMSVertex> initIPMMSVertex(){
  114. Map<String,IPMMSVertex> IPMMSVertexList=new HashMap<>();
  115. IPMMSVertex ipmmsVertex0=new IPMMSVertex();
  116. ipmmsVertex0.setVertexID(new BigDecimal(0));
  117. ipmmsVertex0.setAddressName("小东门");
  118. ipmmsVertex0.setLongitude(new BigDecimal(23.555521));
  119. ipmmsVertex0.setLatitude(new BigDecimal(23.555521));
  120. IPMMSVertexList.put("0",ipmmsVertex0);
  121. IPMMSVertex ipmmsVertex1=new IPMMSVertex();
  122. ipmmsVertex1.setVertexID(new BigDecimal(1));
  123. ipmmsVertex1.setAddressName("一棒库");
  124. ipmmsVertex1.setLongitude(new BigDecimal(23.555521));
  125. ipmmsVertex1.setLatitude(new BigDecimal(23.555521));
  126. IPMMSVertexList.put("1",ipmmsVertex1);
  127. IPMMSVertex ipmmsVertex2=new IPMMSVertex();
  128. ipmmsVertex2.setVertexID(new BigDecimal(2));
  129. ipmmsVertex2.setAddressName("二棒库");
  130. ipmmsVertex2.setLongitude(new BigDecimal(23.555521));
  131. ipmmsVertex2.setLatitude(new BigDecimal(23.555521));
  132. IPMMSVertexList.put("2",ipmmsVertex2);
  133. IPMMSVertex ipmmsVertex3=new IPMMSVertex();
  134. ipmmsVertex3.setVertexID(new BigDecimal(3));
  135. ipmmsVertex3.setAddressName("高线库");
  136. ipmmsVertex3.setLongitude(new BigDecimal(23.555521));
  137. ipmmsVertex3.setLatitude(new BigDecimal(23.555521));
  138. IPMMSVertexList.put("3",ipmmsVertex3);
  139. // IPMMSVertex ipmmsVertex4=new IPMMSVertex();
  140. // ipmmsVertex4.setVertexID(new BigDecimal(4));
  141. // ipmmsVertex4.setAddressName("拐角1");
  142. // ipmmsVertex4.setLongitude(new BigDecimal(23.555521));
  143. // ipmmsVertex4.setLatitude(new BigDecimal(23.555521));
  144. //
  145. // IPMMSVertexList.put("4",ipmmsVertex4);
  146. //
  147. //
  148. //
  149. // IPMMSVertex ipmmsVertex5=new IPMMSVertex();
  150. // ipmmsVertex5.setVertexID(new BigDecimal(5));
  151. // ipmmsVertex5.setAddressName("拐角2");
  152. // ipmmsVertex5.setLongitude(new BigDecimal(23.555521));
  153. // ipmmsVertex5.setLatitude(new BigDecimal(23.555521));
  154. //
  155. // IPMMSVertexList.put("4",ipmmsVertex5);
  156. return IPMMSVertexList;
  157. }
  158. @Override
  159. public Map<String,IPMMSVertex> initIPMSVertexTest(){
  160. Map<String,IPMMSVertex> IPMMSVertexList=new HashMap<>();
  161. IPMMSVertex ipmmsVertex0=new IPMMSVertex();
  162. ipmmsVertex0.setVertexID(new BigDecimal(0));
  163. ipmmsVertex0.setAddressName("1号汽车衡");
  164. ipmmsVertex0.setLongitude(new BigDecimal(107.466049));
  165. ipmmsVertex0.setLatitude(new BigDecimal(31.190349));
  166. IPMMSVertexList.put("0",ipmmsVertex0);
  167. IPMMSVertex ipmmsVertex1=new IPMMSVertex();
  168. ipmmsVertex1.setVertexID(new BigDecimal(1));
  169. ipmmsVertex1.setAddressName("东门");
  170. ipmmsVertex1.setLongitude(new BigDecimal("107.467562"));
  171. ipmmsVertex1.setLatitude(new BigDecimal("31.190679"));
  172. IPMMSVertexList.put("1",ipmmsVertex1);
  173. IPMMSVertex ipmmsVertex2=new IPMMSVertex();
  174. ipmmsVertex2.setVertexID(new BigDecimal(2));
  175. ipmmsVertex2.setAddressName("6号汽车衡");
  176. ipmmsVertex2.setLongitude(new BigDecimal("107.462131"));
  177. ipmmsVertex2.setLatitude(new BigDecimal("31.189882"));
  178. IPMMSVertexList.put("2",ipmmsVertex2);
  179. IPMMSVertex ipmmsVertex3=new IPMMSVertex();
  180. ipmmsVertex3.setVertexID(new BigDecimal(3));
  181. ipmmsVertex3.setAddressName("7号汽车衡");
  182. ipmmsVertex3.setLongitude(new BigDecimal("107.45816"));
  183. ipmmsVertex3.setLatitude(new BigDecimal("31.187067"));
  184. IPMMSVertexList.put("3",ipmmsVertex3);
  185. IPMMSVertex ipmmsVertex4=new IPMMSVertex();
  186. ipmmsVertex4.setVertexID(new BigDecimal(4));
  187. ipmmsVertex4.setAddressName("月亮湾门");
  188. ipmmsVertex4.setLongitude(new BigDecimal("107.453282"));
  189. ipmmsVertex4.setLatitude(new BigDecimal("31.191292"));
  190. IPMMSVertexList.put("4",ipmmsVertex4);
  191. IPMMSVertex ipmmsVertex5=new IPMMSVertex();
  192. ipmmsVertex5.setVertexID(new BigDecimal(5));
  193. ipmmsVertex5.setAddressName("11号和12号汽车衡");
  194. ipmmsVertex5.setLongitude(new BigDecimal("107.453421"));
  195. ipmmsVertex5.setLatitude(new BigDecimal("31.191476"));
  196. IPMMSVertexList.put("5",ipmmsVertex5);
  197. IPMMSVertex ipmmsVertex6=new IPMMSVertex();
  198. ipmmsVertex6.setVertexID(new BigDecimal(6));
  199. ipmmsVertex6.setAddressName("西门");
  200. ipmmsVertex6.setLongitude(new BigDecimal("107.452733"));
  201. ipmmsVertex6.setLatitude(new BigDecimal("31.188635"));
  202. IPMMSVertexList.put("6",ipmmsVertex6);
  203. /* IPMMSVertex ipmmsVertex7=new IPMMSVertex();
  204. ipmmsVertex7.setVertexID(new BigDecimal(7));
  205. ipmmsVertex7.setAddressName("泰昕门");
  206. ipmmsVertex7.setLongitude(new BigDecimal("107.450807"));
  207. ipmmsVertex7.setLatitude(new BigDecimal("31.183661"));
  208. IPMMSVertexList.put("7",ipmmsVertex7);*/
  209. /* IPMMSVertex ipmmsVertex8=new IPMMSVertex();
  210. ipmmsVertex8.setVertexID(new BigDecimal(8));
  211. ipmmsVertex8.setAddressName("9号汽车衡");
  212. ipmmsVertex8.setLongitude(new BigDecimal("107.453046"));
  213. ipmmsVertex8.setLatitude(new BigDecimal("31.185408"));
  214. IPMMSVertexList.put("8",ipmmsVertex8);*/
  215. IPMMSVertex ipmmsVertex9=new IPMMSVertex();
  216. ipmmsVertex9.setVertexID(new BigDecimal(9));
  217. ipmmsVertex9.setAddressName("4号汽车衡");
  218. ipmmsVertex9.setLongitude(new BigDecimal("107.469043"));
  219. ipmmsVertex9.setLatitude(new BigDecimal("31.186859"));
  220. IPMMSVertexList.put("9",ipmmsVertex9);
  221. IPMMSVertex ipmmsVertex10=new IPMMSVertex();
  222. ipmmsVertex10.setVertexID(new BigDecimal(10));
  223. ipmmsVertex10.setAddressName("桥东门");
  224. ipmmsVertex10.setLongitude(new BigDecimal("107.469225"));
  225. ipmmsVertex10.setLatitude(new BigDecimal("31.187363"));
  226. IPMMSVertexList.put("10",ipmmsVertex10);
  227. IPMMSVertex ipmmsVertex11=new IPMMSVertex();
  228. ipmmsVertex11.setVertexID(new BigDecimal(11));
  229. ipmmsVertex11.setAddressName("桥西门");
  230. ipmmsVertex11.setLongitude(new BigDecimal("107.469209"));
  231. ipmmsVertex11.setLatitude(new BigDecimal("31.187088"));
  232. IPMMSVertexList.put("11",ipmmsVertex11);
  233. IPMMSVertex ipmmsVertex12=new IPMMSVertex();
  234. ipmmsVertex12.setVertexID(new BigDecimal(12));
  235. ipmmsVertex12.setAddressName("3号汽车衡");
  236. ipmmsVertex12.setLongitude(new BigDecimal("107.466479"));
  237. ipmmsVertex12.setLatitude(new BigDecimal("31.186248"));
  238. IPMMSVertexList.put("12",ipmmsVertex12);
  239. IPMMSVertex ipmmsVertex13=new IPMMSVertex();
  240. ipmmsVertex13.setVertexID(new BigDecimal(13));
  241. ipmmsVertex13.setAddressName("2号汽车衡");
  242. ipmmsVertex13.setLongitude(new BigDecimal("107.467274"));
  243. ipmmsVertex13.setLatitude(new BigDecimal("31.189362"));
  244. IPMMSVertexList.put("13",ipmmsVertex13);
  245. IPMMSVertex ipmmsVertex14=new IPMMSVertex();
  246. ipmmsVertex14.setVertexID(new BigDecimal(14));
  247. ipmmsVertex14.setAddressName("小东门");
  248. ipmmsVertex14.setLongitude(new BigDecimal("107.467983"));
  249. ipmmsVertex14.setLatitude(new BigDecimal("31.189399"));
  250. IPMMSVertexList.put("14",ipmmsVertex14);
  251. IPMMSVertex ipmmsVertex15=new IPMMSVertex();
  252. ipmmsVertex15.setVertexID(new BigDecimal(15));
  253. ipmmsVertex15.setAddressName("5号汽车衡");
  254. ipmmsVertex15.setLongitude(new BigDecimal("107.463176"));
  255. ipmmsVertex15.setLatitude(new BigDecimal("31.189472"));
  256. IPMMSVertexList.put("15",ipmmsVertex15);
  257. IPMMSVertex ipmmsVertex16=new IPMMSVertex();
  258. ipmmsVertex16.setVertexID(new BigDecimal(16));
  259. ipmmsVertex16.setAddressName("10号汽车衡");
  260. ipmmsVertex16.setLongitude(new BigDecimal("107.466647"));
  261. ipmmsVertex16.setLatitude(new BigDecimal("31.189293"));
  262. IPMMSVertexList.put("16",ipmmsVertex16);
  263. IPMMSVertex ipmmsVertex17=new IPMMSVertex();
  264. ipmmsVertex17.setVertexID(new BigDecimal(17));
  265. ipmmsVertex17.setAddressName("8号汽车衡");
  266. ipmmsVertex17.setLongitude(new BigDecimal("107.454598"));
  267. ipmmsVertex17.setLatitude(new BigDecimal("31.188869"));
  268. IPMMSVertexList.put("17",ipmmsVertex16);
  269. return IPMMSVertexList;
  270. }
  271. }