文章目录
1、问题描述 2、节点类设置 3、设置节点之间的关系 4、路线规划 5、完整类 6、结果 7、优化
1、问题描述
如下图,存在A~F六个地点,已知所有地点的相关关系(每个地点能到达的下一节点名称以及对应的路程);
计算某个起点(A~F)到某个终点(A~F)所需要的路程以及经过的地点顺序
2、节点类设置
public class Node {
public String name;
public Map < String , Integer > map = new HashMap < String , Integer > ( ) ;
public List < Node > nodeList = new ArrayList < Node > ( ) ;
public Node ( ) { }
public Node ( String name) {
this . name = name;
}
public void setValue ( String key, Integer value) {
map. put ( key, value) ;
}
public void setNode ( Node node) {
nodeList. add ( node) ;
}
}
3、设置节点之间的关系
public static Node setRoute ( ) {
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" ) ;
nodeA. setValue ( "B" , 10 ) ;
nodeA. setValue ( "C" , 14 ) ;
nodeA. setNode ( nodeB) ;
nodeA. setNode ( nodeC) ;
nodeB. setValue ( "A" , 10 ) ;
nodeB. setValue ( "C" , 11 ) ;
nodeB. setValue ( "D" , 8 ) ;
nodeB. setNode ( nodeA) ;
nodeB. setNode ( nodeC) ;
nodeB. setNode ( nodeD) ;
nodeC. setValue ( "A" , 14 ) ;
nodeC. setValue ( "B" , 11 ) ;
nodeC. setValue ( "D" , 6 ) ;
nodeC. setValue ( "E" , 15 ) ;
nodeC. setNode ( nodeA) ;
nodeC. setNode ( nodeB) ;
nodeC. setNode ( nodeD) ;
nodeC. setNode ( nodeE) ;
nodeD. setValue ( "B" , 8 ) ;
nodeD. setValue ( "C" , 6 ) ;
nodeD. setValue ( "F" , 10 ) ;
nodeD. setNode ( nodeB) ;
nodeD. setNode ( nodeC) ;
nodeD. setNode ( nodeF) ;
nodeE. setValue ( "C" , 15 ) ;
nodeE. setValue ( "F" , 12 ) ;
nodeE. setNode ( nodeC) ;
nodeE. setNode ( nodeF) ;
nodeF. setValue ( "D" , 10 ) ;
nodeF. setValue ( "E" , 12 ) ;
nodeF. setNode ( nodeD) ;
nodeF. setNode ( nodeE) ;
return nodeA;
}
4、路线规划
public static void calculate ( Node node, String stepStr, Integer steps, String endNode) {
if ( ! node. name. equals ( endNode) ) {
List < Node > nodeList = node. nodeList;
for ( int i = 0 ; i < nodeList. size ( ) ; i++ ) {
Node n = nodeList. get ( i) ;
if ( stepStr. contains ( n. name) ) { continue ; }
String stepStrT = stepStr + "->" + n. name;
int stepsT = steps + node. map. get ( n. name) ;
calculate ( n, stepStrT, stepsT, endNode) ;
}
} else {
System . out. println ( "finish:" + steps + "\t" + stepStr) ;
}
}
5、完整类
package Test ;
import java. util. ArrayList ;
import java. util. HashMap ;
import java. util. List ;
import java. util. Map ;
public class RoutePlanning {
public static int num = 0 ;
public static void main ( String [ ] args) {
Node route = setRoute ( ) ;
calculate ( route, "A" , 0 , "F" ) ;
System . out. println ( "execute times: " + num) ;
}
public static void calculate ( Node node, String stepStr, Integer steps, String endNode) {
if ( ! node. name. equals ( endNode) ) {
List < Node > nodeList = node. nodeList;
for ( int i = 0 ; i < nodeList. size ( ) ; i++ ) {
++ num;
Node n = nodeList. get ( i) ;
if ( stepStr. contains ( n. name) ) { continue ; }
String stepStrT = stepStr + "->" + n. name;
int stepsT = steps + node. map. get ( n. name) ;
calculate ( n, stepStrT, stepsT, endNode) ;
}
} else {
System . out. println ( "finish:" + steps + "\t" + stepStr) ;
}
}
public static Node setRoute ( ) {
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" ) ;
nodeA. setValue ( "B" , 10 ) ;
nodeA. setValue ( "C" , 14 ) ;
nodeA. setNode ( nodeB) ;
nodeA. setNode ( nodeC) ;
nodeB. setValue ( "A" , 10 ) ;
nodeB. setValue ( "C" , 11 ) ;
nodeB. setValue ( "D" , 8 ) ;
nodeB. setNode ( nodeA) ;
nodeB. setNode ( nodeC) ;
nodeB. setNode ( nodeD) ;
nodeC. setValue ( "A" , 14 ) ;
nodeC. setValue ( "B" , 11 ) ;
nodeC. setValue ( "D" , 6 ) ;
nodeC. setValue ( "E" , 15 ) ;
nodeC. setNode ( nodeA) ;
nodeC. setNode ( nodeB) ;
nodeC. setNode ( nodeD) ;
nodeC. setNode ( nodeE) ;
nodeD. setValue ( "B" , 8 ) ;
nodeD. setValue ( "C" , 6 ) ;
nodeD. setValue ( "F" , 10 ) ;
nodeD. setNode ( nodeB) ;
nodeD. setNode ( nodeC) ;
nodeD. setNode ( nodeF) ;
nodeE. setValue ( "C" , 15 ) ;
nodeE. setValue ( "F" , 12 ) ;
nodeE. setNode ( nodeC) ;
nodeE. setNode ( nodeF) ;
nodeF. setValue ( "D" , 10 ) ;
nodeF. setValue ( "E" , 12 ) ;
nodeF. setNode ( nodeD) ;
nodeF. setNode ( nodeE) ;
return nodeA;
}
public static class Node {
public String name;
public Map < String , Integer > map = new HashMap < String , Integer > ( ) ;
public List < Node > nodeList = new ArrayList < Node > ( ) ;
public Node ( ) { }
public Node ( String name) {
this . name = name;
}
public void setValue ( String key, Integer value) {
map. put ( key, value) ;
}
public void setNode ( Node node) {
nodeList. add ( node) ;
}
}
}
6、结果
finish:37 A->B->C->D->F
finish:48 A->B->C->E->F
finish:51 A->B->D->C->E->F
finish:28 A->B->D->F
finish:43 A->C->B->D->F
finish:30 A->C->D->F
finish:41 A->C->E->F
execute times: 41
7、优化
优化:
每次遍历都判断所走路程,(详细记录已走的节点);如果当前路程超过记录中的最大路程,则停止;
选中记录列表中的最小路程重新往下走;重复该过程,直到到达终点后