知识大全 JAVA编程语言程序开发技术Dijkstra

Posted 路径

篇首语:最强的人并不一定都是成功的人,却一定是在他们失去之时不放弃的人。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JAVA编程语言程序开发技术Dijkstra相关的知识,希望对你有一定的参考价值。

JAVA编程语言程序开发技术Dijkstra  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法 用于计算一个节点到其他所有节点的最短路径 主要特点是以起始点为中心向外层层扩展 直到扩展到终点为止

  Dijkstra一般的表述通常有两种方式 一种用永久和临时标号方式 一种是用OPEN CLOSE表方式

  用OPEN CLOSE表的方式 其采用的是贪心法的算法策略 大概过程如下

   声明两个集合 open和close open用于存储未遍历的节点 close用来存储已遍历的节点

   初始阶段 将初始节点放入close 其他所有节点放入open

   以初始节点为中心向外一层层遍历 获取离指定节点最近的子节点放入close并从新计算路径 直至close包含所有子节点

  代码实例如下

  Node对象用于封装节点信息 包括名字和子节点

  [java]

  public class Node

  private String name;

  private Map<Node Integer> child=new HashMap<Node Integer>()

  public Node(String name)

  this name=name;

  

  public String getName()

  return name;

  

  public void setName(String name)

  this name = name;

  

  public Map<Node Integer> getChild()

  return child;

  

  public void setChild(Map<Node Integer> child)

  this child = child;

  

  

  MapBuilder用于初始化数据源 返回图的起始节点

  [java]

  public class MapBuilder

  public Node build(Set<Node> open Set<Node> close)

  Node nodeA=new Node( A )

  Node nodeB=new Node( B )

  Node nodeC=new Node( C )

  Node nodeD=new Node( D )

  Node nodeE=new Node( E )

  Node nodeF=new Node( F )

  Node nodeG=new Node( G )

  Node nodeH=new Node( H )

  nodeA getChild() put(nodeB )

  nodeA getChild() put(nodeC )

  nodeA getChild() put(nodeD )

  nodeA getChild() put(nodeG )

  nodeA getChild() put(nodeF )

  nodeB getChild() put(nodeA )

  nodeB getChild() put(nodeF )

  nodeB getChild() put(nodeH )

  nodeC getChild() put(nodeA )

  nodeC getChild() put(nodeG )

  nodeD getChild() put(nodeA )

  nodeD getChild() put(nodeE )

  nodeE getChild() put(nodeD )

  nodeE getChild() put(nodeF )

  nodeF getChild() put(nodeE )

  nodeF getChild() put(nodeB )

  nodeF getChild() put(nodeA )

  nodeG getChild() put(nodeC )

  nodeG getChild() put(nodeA )

  nodeG getChild() put(nodeH )

  nodeH getChild() put(nodeB )

  nodeH getChild() put(nodeG )

  open add(nodeB)

  open add(nodeC)

  open add(nodeD)

  open add(nodeE)

  open add(nodeF)

  open add(nodeG)

  open add(nodeH)

  close add(nodeA)

  return nodeA;

  

  

  图的结构如下图所示

  

  Dijkstra对象用于计算起始节点到所有其他节点的最短路径

  [java]

  public class Dijkstra

  Set<Node> open=new HashSet<Node>()

  Set<Node> close=new HashSet<Node>()

  Map<String Integer> path=new HashMap<String Integer>() //封装路径距离

  Map<String String> pathInfo=new HashMap<String String>() //封装路径信息

  public Node init()

  //初始路径 因没有A >E这条路径 所以path(E)设置为Integer MAX_VALUE

  path put( B )

  pathInfo put( B A >B )

  path put( C )

  pathInfo put( C A >C )

  path put( D )

  pathInfo put( D A >D )

  path put( E Integer MAX_VALUE)

  pathInfo put( E A )

  path put( F )

  pathInfo put( F A >F )

  path put( G )

  pathInfo put( G A >G )

  path put( H Integer MAX_VALUE)

  pathInfo put( H A )

  //将初始节点放入close 其他节点放入open

  Node start=new MapBuilder() build(open close)

  return start;

  

  public void putePath(Node start)

  Node nearest=getShortestPath(start) //取距离start节点最近的子节点 放入close

  if(nearest==null)

  return;

  

  close add(nearest)

  open remove(nearest)

  Map<Node Integer> childs=nearest getChild()

  for(Node child:childs keySet())

  if(ntains(child))//如果子节点在open中

  Integer newCompute=path get(nearest getName())+childs get(child)

  if(path get(child getName())>newCompute)//之前设置的距离大于新计算出来的距离

  path put(child getName() newCompute)

  pathInfo put(child getName() pathInfo get(nearest getName())+ > +child getName())

  

  

  

  putePath(start) //重复执行自己 确保所有子节点被遍历

  putePath(nearest) //向外一层层递归 直至所有顶点被遍历

  

  public void printPathInfo()

  Set<Map Entry<String String》 pathInfos=pathInfo entrySet()

  for(Map Entry<String String> pathInfo:pathInfos)

  System out println(pathInfo getKey()+ : +pathInfo getValue())

  

  

  /**

  * 获取与node最近的子节点

  */

  private Node getShortestPath(Node node)

  Node res=null;

  int minDis=Integer MAX_VALUE;

  Map<Node Integer> childs=node getChild()

  for(Node child:childs keySet())

  if(ntains(child))

  int distance=childs get(child)

  if(distance<minDis)

  minDis=distance;

  res=child;

  

  

  

  return res;

  

  

  Main用于测试Dijkstra对象

  [java]

  public class Main

  public static void main(String[] args)

  Dijkstra test=new Dijkstra()

  Node start=test init()

  putePath(start)

  test printPathInfo()

  

  

  打印输出如下

  D:A >D

  E:A >F >E

  F:A >F

  G:A >C >G

  B:A >B

  C:A >C

cha138/Article/program/Java/hx/201311/26170

相关参考

知识大全 JAVA编程语言开发下载文件

JAVA编程语言开发下载文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  [java]  /*

知识大全 JAVA编程语言开发DES算法理论

JAVA编程语言开发DES算法理论  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  [java] 

知识大全 Java编程语言程序的认识误区

Java编程语言程序的认识误区  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  越来越多人开始使用

知识大全 针对 Java 开发人员的 C# 编程语言(2)

针对Java开发人员的C#编程语言(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  此程序的

知识大全 java与其他web开发编程语言的比较

  现在的软件开发语言太多了尤其现在的所有软件都基本是B/S结构的所以对WEB开发语言的使用也就越来越多搞了几年的JAVA开发 这段时间也抽了点时间玩玩dotnetperlphp等其它WEB

知识大全 扫雷程序(Java语言)

扫雷程序(Java语言)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  importjavaaw

知识大全 从Java语言编程谈软件开发流程

从Java语言编程谈软件开发流程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  你我的生活周遭已

知识大全 C#语言与Java语言程序的比较

C#语言与Java语言程序的比较  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  迈入二十一世纪以

知识大全 JAVA 线程编程----两个线程的程序

JAVA线程编程----两个线程的程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  于Java

知识大全 Rails 开发与 Java 编程的比较

Rails开发与Java编程的比较  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  年月日&nbs