【问题标题】:A* Algorithm JavaA* 算法 Java
【发布时间】:2013-05-06 08:46:02
【问题描述】:

我整个周末都在玩这个。我正在尝试将节点存储在 PriorityQueue 数据结构中。我的 astar 函数似乎没有做它应该做的事情。有人介意看看吗?

public void aStar(Node from, Node to) {

    PriorityQueue<Node> exploreList = new PriorityQueue<Node>();
    ArrayList<Node> visited = new ArrayList<Node>();
    ArrayList<Node> successors = new ArrayList<Node>();

    Node current = from;
    System.out.println(current.getName());
    while (current != to) {
            successors = current.getConnected();
            Collections.sort(successors);
            for (Node n : successors) {
                    if (!visited.contains(n)) {
                            exploreList.add(n);
                    }
                    for (Node n1 : successors) {
                            if (n.fSum() > n1.fSum()) {
                            exploreList.remove(n);
                            exploreList.add(n1);
                            }      
                    }
            }
            visited.add(current);
            current = exploreList.remove();
            System.out.println(current.getName());
    }

这里是节点类

   public class Node implements Comparable {
   private String name;
   private int travDist;
   private int straightDist;
   private ArrayList<Arc> arcs;

/**
 * Constructor for a new node
 * 
 * @param n
 */
   public Node(String n, int aTravDist, int aStraightDist) {
       name = n;
       travDist = aTravDist;
       straightDist = aStraightDist;

       arcs = new ArrayList<Arc>();
  }

/**
 * Adds a new arc
 * 
 * @param to
 * @param c
 */
public void addArc(Node to, int c) {
    arcs.add(new Arc(to, c));
}

/**
 * Gets the list of connected nodes to this node
 * 
 * @return
 */
public ArrayList<Node> getConnected() {
    ArrayList<Node> returnData = new ArrayList<Node>();
    for (Arc a : arcs) {
        returnData.add(a.getNode());
    }
    return returnData;
}

@Override
public int compareTo(Object o) {
    //return name.compareTo(((Node) o).getName());
    Integer sum = ((Node)o).fSum();
    return sum.compareTo(fSum());
}

public int fSum () {

    return travDist + straightDist;
}

/**
 * Gets the name of the Node
 * 
 * @return
 */
public String getName() {
    return name;
}


}

【问题讨论】:

  • 你的启发式函数是什么?是n.fSum()吗?
  • public int fSum () { return travDist + straightDist; }

标签: java algorithm a-star


【解决方案1】:

你做的不是正确的A星算法。

Collections.sort(successors);

你不应该那样做。在 A 星中,您总是考虑所有的继任者。您不必担心顺序 - 优先级队列会解决这个问题。但是,添加这一行会增加算法的复杂度。

for (Node n1 : successors) {
  if (n.fSum() > n1.fSum()) {
    exploreList.remove(n);
    exploreList.add(n1);
  }      
}

这是完全错误的。你在这里做的是:你只添加所有后继者中最接近的。这将是一个beam search,其光束大小为 1,而不是 A 星 - 只需将它们全部放入即可。

【讨论】:

  • @SohaibMushtaq :如果我帮助您解决了问题,请不要忘记支持/接受。
  • 是的,伙计,我正在尝试,但它告诉我我需要 15 个声望点。
  • @SohaibMushtaq 哈哈,没关系,你会在一段时间内得到它。不过,您仍然可以接受答案 - 单击检查。 Acccpets 引导其他用户真正为您解决问题。
  • 实际上我再次检查并没有工作。 (我正在调用另一个搜索功能忘记更改)。我注释掉了 Collections.sort(successors);和 exploreList.remove(n);这就是我应该做的正确的事情?
  • @SohaibMushtaq 删除我引用的整个循环。您实际上在Node 中存储了什么?我实际上没有看到你计算过增强的路径......你能在问题中包含类的定义吗?
猜你喜欢
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 2011-08-16
相关资源
最近更新 更多