Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何表示无右向图并找到最短路径?JAVA_Java_Graph - Fatal编程技术网

如何表示无右向图并找到最短路径?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

用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 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()时它没有探索任何东西。感谢您的回复,但我使用了与我的问题相同的代码,但修复了: