- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我一整天都在努力让这个算法启动并运行,但我终究做不到。我在网上阅读了很多教程,以及 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/
我想堆叠两个 Font Awesome 图标 fa-star 和 fa-star-half,但我遇到对齐问题。见下图: 这是我的 HTML: ...和我的 CSS: a-s
对于欧几里得最短路径问题,是否有人对 A 星搜索和更一般的整数规划公式之间的联系有很好的引用? 特别是我感兴趣的是如何修改 A-star 以应对额外的(可能是依赖于路径的)约束,如果使用通用 LP/I
如何编写正则表达式来验证此模式? 123456 - correct *1 - correct 1* - correct 124** - correct *1*2 - correct * - corre
我在以下网址的页眉中看到了 Canvas 动画 - http://blogs.msdn.com/b/davrous/archive/2011/07/21/html5-gaming-animating-
我需要将蓝牙模块连接到A-Star 32U4 Prime SV microSD,但无法使其工作。作为背景,我有一个Pololu双G2大功率电机驱动器24v18盾牌Arduino连接到它。。该项目是一个
我需要将蓝牙模块连接到A-Star 32U4 Prime SV microSD,但无法使其工作。作为背景,我有一个Pololu双G2大功率电机驱动器24v18盾牌Arduino连接到它。。该项目是一个
我正在尝试学习 A* 算法(当应用于网格模式时)并且我认为我已经掌握了在找到最短路径之前,您需要计算任何给定方 block 距起点的距离。 我正在按照此处的指南进行操作:https://medium.
我一直在阅读维基百科的 Astar article .在他们的实现中,他们检查每个节点是否在 closed 中。设置,如果是这样,他们会跳过它。如果启发式是可以接受的,但 是否可能?不是 一致,我们可
继 How to speed up least-cost path model at large spatial extents ,我尝试在 Netlogo 中编写 A* 算法,以在较大的空间范围内增
我试图根据维基百科的伪代码实现一个简单的 A* 搜索程序。但是,它对 openset 的解释对我来说有些不清楚。我知道起始节点最初会添加到 openset 中。但是,代码执行在 remove curr
我正尝试在我的 3D 网格中实现 A* 算法来寻路。我一直在学习教程,但没有找到有效的路径。我已经逐步查看我的代码以了解发生了什么,但我不知道如何解决问题。对于最基本的测试,我只使用 2-D 网格(它
我在 GitHub 上有很多 repos,我将它们加星以供以后使用。 是否有任何工具可以为观星者组织收藏,以便他们可以浏览已加星标的内容?例如,找出我为 iOS 动画加注了哪些组件。 最佳答案 这是我
据我了解,对于给定的评估节点,启发式算法的可接受性保持在“距离的实际成本”的范围内。我不得不为状态空间上的 A* 解决方案搜索设计一些启发式方法,并且使用有时可能返回负值的启发式方法获得了很多积极的效
我在有效实现 Eric Lippert 推荐的这个通用方法时遇到了问题。他的博客概述了创建 A 星算法的一种非常简单有效的方法 (found here)。这是快速运行。 实际寻路的代码: class
我试图找到所有可能的方法来将 n block 糖果分发给 k 个 child 。例如,根据星星和酒吧公式,将 96 颗糖果分配给 5 个 child 的方法数为 100!/(96!*4!) = 3 9
已知 A 星算法是完备的。但是,我在网上搜索发现的所有实现似乎只返回第一个(最佳)解决方案。 例如,这个实现: A star algoritthm implementation 由于算法总是扩展具有最
我想扩展这个问题: Why does the A-star algorithm need g(n)? Dijkstra 算法使用代价函数 f(n) = g(n)而 A* 使用成本函数 f(n) = g
我有一个问题。如果可以在我的算法中添加旋转。我的意思是,例如,如果我想从 (0,0) 转到 (0,1),首先我需要旋转然后转到那个字段。我不知道该怎么做。我实现的算法A-start是这样的 impor
让我们考虑一个简单的网格,其中任何点最多与其他 4 个点相连(东北-西-南邻域)。 我必须编写程序,计算从选定的初始点到连接的任何目标点的最小路线(任意两个目标之间有一条由目标点组成的路线)。当然,网
我一整天都在努力让这个算法启动并运行,但我终究做不到。我在网上阅读了很多教程,以及 AS3、javascript 和 C++ 的源代码;但我无法使我所看到的适应我自己的代码。 我创建了一个 AStar
我是一名优秀的程序员,十分优秀!