gpt4 book ai didi

java - A*算法Java

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:16:05 29 4
gpt4 key购买 nike

我整个周末都在研究这个。我正在尝试将节点存储在 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;
}


}

最佳答案

您正在做的不是正确的 A 星算法。

Collections.sort(successors);

你不应该那样做。在 A 星中,你总是考虑所有的接类人。您不必担心顺序 - 优先队列会处理这个问题。但是,添加这条线会增加算法的复杂度。

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

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

关于java - A*算法Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16395072/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com