如何表示无右向图并找到最短路径?JAVA
用Java表示图形的最佳方式是什么?我是这样做的:如何表示无右向图并找到最短路径?JAVA,java,graph,Java,Graph,用Java表示图形的最佳方式是什么?我是这样做的: public class Node<T> { public T data; public LinkedList<Node> children; public Node(T data) { this.data = data; this.children = new LinkedList<Node>(); //here there are the connected nodes of the no
public class Node<T> {
public T data;
public LinkedList<Node> children;
public Node(T data) {
this.data = data;
this.children = new LinkedList<Node>(); //here there are the connected nodes of the node
}
public T getData() {
return this.data;
}
public void addArch(Node n) {
children.add(n);
}
public class Graph <T> {
private Node<T> source = new Node(null);
private Node<T> target = new Node(null);
private ArrayList<Node> nodes = new ArrayList<Node>();
public Graph() {}
public void addNode(T v) {
boolean visto = false;
for (Node n: nodes) {
if (n.getData().equals(v)) {
visto = true;
}
}
if (visto == false) {
nodes.add(new Node(v));
}
}
public void addEdge(T p, T a) throws NoSuchNodeException {
boolean visto = false;
boolean visto_secondo = false;
for (Node n: nodes) {
if (n.getData().equals(p)) {
visto = true;
}
}
for (Node n: nodes) {
if (n.getData().equals(a)) {
visto_secondo = true;
}
}
if (visto == false || visto_secondo == false) {
throw new NoSuchNodeException();
}
else {
for (Node n : nodes) {
if (p.equals(n.getData())) {
System.out.print(a);
n.addArch(new Node(a));
}
}
}
}
公共类节点{
公共数据;
公共关系网儿童;
公共节点(T数据){
这个数据=数据;
this.children=new LinkedList();//这里是节点的连接节点
}
公共T getData(){
返回此.data;
}
公共void addArch(节点n){
添加(n);
}
公共类图{
私有节点源=新节点(空);
私有节点目标=新节点(空);
私有ArrayList节点=新建ArrayList();
公共图(){}
公共无效添加节点(T v){
布尔visto=false;
用于(节点n:节点){
如果(n.getData()等于(v)){
visto=true;
}
}
如果(visto==false){
添加(新节点(v));
}
}
public void addEdge(tp,ta)抛出NoSuchNodeException{
布尔visto=false;
布尔值visto_secondo=false;
用于(节点n:节点){
如果(n.getData()等于(p)){
visto=true;
}
}
用于(节点n:节点){
如果(n.getData()等于(a)){
visto_secondo=真;
}
}
if(visto==false | | visto_secondo==false){
抛出新的NoSuchNodeException();
}
否则{
用于(节点n:节点){
if(p.equals(n.getData())){
系统输出打印(a);
n、 addArch(新节点(a));
}
}
}
}
我必须找到最短路径,但似乎没有添加ARCH,为什么?我也做了源和目标的设置和获取。但是我必须找到源和目标之间的最短路径,使用什么算法?我需要使用bfs来获得最短路径,但我的问题是如何在ARCH上迭代,我需要进行递归函数我认为找到目标节点最短路径的最佳算法是 如果启发式值是可接受的,它会找到到目标节点的最短路径,这意味着它不会高估 以下是伪代码:
node current node
g the cost to reach current node
f estimated cost of the cheapest path (root..node..goal)
h(node) estimated cost of the cheapest path (node..goal)
cost(node, succ) step cost function
is_goal(node) goal test
successors(node) node expanding function, expand nodes ordered by g + h(node)
procedure ida_star(root)
bound := h(root)
loop
t := search(root, 0, bound)
if t = FOUND then return bound
if t = ∞ then return NOT_FOUND
bound := t
end loop
end procedure
function search(node, g, bound)
f := g + h(node)
if f > bound then return f
if is_goal(node) then return FOUND
min := ∞
for succ in successors(node) do
t := search(succ, g + cost(node, succ), bound)
if t = FOUND then return FOUND
if t < min then min := t
end for
return min
end function
节点当前节点
g到达当前节点的成本
f最便宜路径的估计成本(根..节点..目标)
h(节点)最便宜路径的估计成本(节点..目标)
成本(节点,成功)步骤成本函数
is_目标(节点)目标测试
后续(节点)节点扩展功能,按g+h(节点)顺序展开节点
程序ida_star(根)
绑定:=h(根)
环
t:=搜索(根,0,绑定)
如果t=FOUND,则返回bound
如果t=∞ 然后返回“未找到”
界:=t
端环
结束程序
函数搜索(节点、g、绑定)
f:=g+h(节点)
如果f>绑定,则返回f
如果是_目标(节点),则返回find
最小:=∞
对于成功继承者(节点)do
t:=搜索(成功,g+成本(节点,成功,绑定)
如果t=FOUND,则返回FOUND
如果t
g表示到达当前状态的移动次数,h表示到达目标状态的估计移动次数。
f:=g+h(节点)
。启发式值越接近实际移动次数,算法的速度就越快我不这么认为,因为我不知道如何使用递归函数来探索子对象,似乎没有添加ARCH。我必须在Node类中实现它,但当我使用source.recursivefunction()时它没有探索任何东西。感谢您的回复,但我使用了与我的问题相同的代码,但修复了: