..很鬱悶啓發式搜索和A*搜索.自己對照文檔寫了下..發現和之前學的有出入...算了先寫這個吧..等我回去翻翻筆記...如果有問題再來補充..明白的同學可以直接拍磚...
下面我們對這個圖進行..最短路徑的查
package algorithm;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
/**
* A* 搜索見得的java例子,也是啓發式搜索.和我映像裏有點出入...
*
* @author ansj
*
*/
public class HeuristicSearching {
public static void main(String[] args) {
// 設置節點
Node v1 = new Node("v1", 0);
Node v2 = new Node("v2");
Node v3 = new Node("v3");
Node v4 = new Node("v4");
Node v5 = new Node("v5");
Node v6 = new Node("v6");
// 設置關聯關係
v1.hm.put(v2, 40);
v1.hm.put(v3, 30);
v1.hm.put(v4, 20);
v1.hm.put(v5, 10);
v2.hm.put(v6, 10);
v3.hm.put(v2, 2);
v3.hm.put(v6, 15);
v4.hm.put(v2, 15);
v4.hm.put(v3, 6);
v5.hm.put(v4, 15);
openNode(v1);
System.out.println(v1);
System.out.println(v2);
System.out.println(v3);
System.out.println(v4);
System.out.println(v5);
System.out.println(v6);
}
private static List<Node> open = new ArrayList<Node>();
private static void openNode(Node from) {
// TODO Auto-generated method stub
Node temp = null;
Integer pathWeight = null;
if (from == null) {
return;
}
for (Entry<Node, Integer> entry : from.hm.entrySet()) {
temp = entry.getKey();
// 如果此節點已經關閉.則忽略
if (temp.close) {
continue;
}
pathWeight = entry.getValue();
if (temp.min > from.min + pathWeight) {
temp.min = pathWeight + from.min;
}
open.add(temp);
}
// 每次關閉掉路徑最短的節點
Node nodeMin = findAndRemoveMinNode();
if(nodeMin!=null){
openNode(nodeMin);
}
}
private static Node findAndRemoveMinNode() {
// TODO Auto-generated method stub
Node node = null;
for (int i = 0; i < open.size(); i++) {
if (node == null) {
node = open.get(i);
} else if (open.get(i).min < node.min) {
node = open.get(i);
}
}
open.remove(node) ;
return node;
}
// 節點對象
private static class Node {
// 節點名稱
private String name;
private boolean close = false;
// 最短的路徑
private int min = Integer.MAX_VALUE;
// 可以到達的節點及其長度
private HashMap<Node, Integer> hm = new HashMap<Node, Integer>();
private Node(String name) {
this.name = name;
}
private Node(String name, Integer pathWeight) {
this.name = name;
this.min = pathWeight;
}
public String toString() {
return this.name + ":" + this.min;
}
}
}