gpt4 book ai didi

java - 无法在java中实现A Star

转载 作者:搜寻专家 更新时间:2023-10-31 19:58:17 25 4
gpt4 key购买 nike

我一整天都在努力让这个算法启动并运行,但我终究做不到。我在网上阅读了很多教程,以及 AS3、javascript 和 C++ 的源代码;但我无法使我所看到的适应我自己的代码。

我创建了一个 AStar 类,它有一个名为 Node 的嵌套类。该 map 是一个名为 MAP 的二维数组。

我遇到的最大问题是在 pathfind 函数中提取 F 值。

我已经实现了 F = G + H,我的问题是实际的 AStar 算法。有人可以帮忙吗,这是我到目前为止的进展:

import java.util.ArrayList;

public class AStar
{
int MAP[][];

Node startNode, endNode;

public AStar(int MAP[][], int startXNode, int startYNode,
int endXNode, int endYNode)
{
this.MAP = MAP;
startNode = new Node(startXNode, startYNode);
endNode = new Node(endXNode, endYNode);
}

public void pathfinder()
{
ArrayList openList = new ArrayList();
ArrayList closedList = new ArrayList();



}

public int F(Node startNode, Node endNode)
{
return (H(startNode, endNode) + G(startNode));
}

//H or Heuristic part of A* algorithm
public int H(Node startNode, Node endNode)
{
int WEIGHT = 10;
int distance = (Math.abs(startNode.getX() - endNode.getX()) + Math.abs(startNode.getY() - endNode.getY()));

return (distance * WEIGHT);
}

public int G(Node startNode)
{
if(MAP[startNode.getX() - 1][startNode.getY()] != 1)
{
return 10;
}

if(MAP[startNode.getX() + 1][startNode.getY()] != 1)
{
return 10;
}

if(MAP[startNode.getX()][startNode.getY() -1] != 1)
{
return 10;
}

if(MAP[startNode.getX()][startNode.getY() + 1] != 1)
{
return 0;
}

return 0;
}

public class Node
{
private int NodeX;
private int NodeY;

private int gScore;
private int hScore;
private int fScore;

public Node(int NodeX, int NodeY)
{
this.NodeX = NodeX;
this.NodeY = NodeY;
}

public int getX()
{
return NodeX;
}

public int getY()
{
return NodeY;
}

public int getG()
{
return gScore;
}

public void setG(int gScore)
{
this.gScore = gScore;
}

public int getH()
{
return hScore;
}

public void setH(int hScore)
{
this.hScore = hScore;
}

public int getF()
{
return fScore;
}

public void setF(int fScore)
{
this.fScore = fScore;
}
}
}

这是我使用探路者功能所能达到的最远距离:

   public void pathfinder()
{
LinkedList<Node> openList = new LinkedList();
LinkedList<Node> closedList = new LinkedList();

Node currentNode;

openList.add(startNode);

while(openList.size() > 0)
{
currentNode = (Node) openList.get(0);
closedList.add(currentNode);


for(int i = 0; i < openList.size(); i++)
{
int cost = F(currentNode, endNode);

}
}

}

最佳答案

我最近将这个 A* 代码放在一起来解决 Project Euler问题。您必须填写 Node 对象矩阵的详细信息。使用它需要您自担风险,但我可以说它解决了问题:)

public class Node {
List<Node> neighbors = new ArrayList<Node>();
Node parent;
int f;
int g;
int h;
int x;
int y;
int cost;
}

public List<Node> aStar(Node start, Node goal) {
Set<Node> open = new HashSet<Node>();
Set<Node> closed = new HashSet<Node>();

start.g = 0;
start.h = estimateDistance(start, goal);
start.f = start.h;

open.add(start);

while (true) {
Node current = null;

if (open.size() == 0) {
throw new RuntimeException("no route");
}

for (Node node : open) {
if (current == null || node.f < current.f) {
current = node;
}
}

if (current == goal) {
break;
}

open.remove(current);
closed.add(current);

for (Node neighbor : current.neighbors) {
if (neighbor == null) {
continue;
}

int nextG = current.g + neighbor.cost;

if (nextG < neighbor.g) {
open.remove(neighbor);
closed.remove(neighbor);
}

if (!open.contains(neighbor) && !closed.contains(neighbor)) {
neighbor.g = nextG;
neighbor.h = estimateDistance(neighbor, goal);
neighbor.f = neighbor.g + neighbor.h;
neighbor.parent = current;
open.add(neighbor);
}
}
}

List<Node> nodes = new ArrayList<Node>();
Node current = goal;
while (current.parent != null) {
nodes.add(current);
current = current.parent;
}
nodes.add(start);

return nodes;
}

public int estimateDistance(Node node1, Node node2) {
return Math.abs(node1.x - node2.x) + Math.abs(node1.y - node2.y);
}

关于java - 无法在java中实现A Star,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5601889/

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