- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究 A* 寻路算法,由于某种原因,在某个时刻我遇到了空指针异常,但我不知道为什么。问题出现在类 Astar 第 79 行,这是 H 值的简单 setter 。
这是 Astar 类:
import java.util.*;
public class Astar {
private int[][] map;
private int Infinity = Integer.MAX_VALUE;
private GridElement startElement;
private GridElement endElement;
private GridElement[][] grid;
private int currentX;
private int currentY;
private int tmpV;
private int adjacentX;
private int adjacentY;
//private int x;
//private int y;
private GridElement adjacentE;
private GridElement adjacentW;
private GridElement adjacentN;
private GridElement adjacentS;
public Astar(int[][] map, int xStart, int yStart, int xEnd, int yEnd) {
this.map= map;
grid = new GridElement[map.length][map[0].length];
for(int i=0;i<grid.length;i++)
for(int j=0;j<grid[0].length;j++){
grid[i][j]=new GridElement(i,j,map[i][j],grid);
grid[i][j].setG(map[i][j]);}
this.startElement=grid[xStart][yStart];
this.endElement=grid[xEnd][yEnd];
}
public void AstarAlgortihm() {
ArrayList<GridElement> openList = new ArrayList<GridElement>();
for(int i=0;i<grid.length;i++)
for(int j=0;j<grid[0].length;j++)
openList.add(grid[i][j]);
GridElement current = startElement;
GridElement next;
while(openList.isEmpty() == false){
openList.remove(current);
current.setVisited(true);
if(current==endElement)
break;
int northF=Infinity;
int southF=Infinity;
int westF=Infinity;
int eastF=Infinity;
if(current.hasNeighbour(1,0)!=null && grid[current.getX()+1][current.getY()].checkVisited() == false) {
adjacentS = current.hasNeighbour(1,0);
grid[current.getX()+1][current.getY()].setParent(current);
adjacentS.setH(H(current.getX()+1, current.getY()));
adjacentS.setF();
southF=adjacentS.getF();}
if(current.hasNeighbour(-1,0)!=null && grid[current.getX()-1][current.getY()].checkVisited()==false) {
adjacentN = current.hasNeighbour(-1,0);
grid[current.getX()-1][current.getY()].setParent(current);
adjacentN.setH(H(current.getX()-1, current.getY()));
adjacentN.setF();
northF=adjacentN.getF();}
if(current.hasNeighbour(0,1)!=null && grid[current.getX()][current.getY()+1].checkVisited()==false) {
adjacentE = current.hasNeighbour(1,0);
grid[current.getX()][current.getY()+1].setParent(current);
adjacentE.setH(H(current.getX(), current.getY()+1));
adjacentE.setF();
eastF=adjacentE.getF();}
if(current.hasNeighbour(0,-1)!=null && grid[current.getX()][current.getY()-1].checkVisited()==false) {
adjacentW = current.hasNeighbour(1,0);
grid[current.getX()][current.getY()-1].setParent(current);
adjacentW.setH(H(current.getX(), current.getY()-1));
adjacentW.setF();
westF=adjacentW.getF();}
if(northF <southF &&northF < westF &&northF< eastF){
current=adjacentN;
}
else if(eastF<southF && eastF< northF && eastF < westF){
current=adjacentE;
}
else if(westF < southF && westF < northF && westF<eastF){
current = adjacentW;
}
else
current=adjacentS;
}
if(current==endElement) {
while(current != startElement){
current.setIsPathmember(true);
current= current.getParent();
}
current.setIsPathmember(true);
} else System.out.println("No path found");
}
public int[][] getMap(){
int[][] tempmap = new int[grid.length][grid[0].length];
for(int i=0;i<grid.length;i++)
for(int j=0;j<grid[0].length;j++)
if(grid[i][j].getIsPathMember())
tempmap[i][j]=9;
else
tempmap[i][j]=grid[i][j].getCost();
return tempmap;
}
public int H(int x, int y){
int xCoords=(endElement.getX())- x ;
int yCoords=(endElement.getY()) - y ;
return xCoords+yCoords;
}
}
这是 GridElement 类。这也是 Dijkstra 算法的 GridElement 类,所以如果您看到 Astar 不应该出现的任何内容,那就是原因。
public class GridElement {
private int x;
private int y;
private int value;
private boolean isVisited;
private GridElement parent;
private int cost;
private boolean isWall;
private GridElement[][] map;
private boolean isPathMember;
private int g;
private int h;
private int f;
public GridElement(int x, int y, int cost, GridElement[][] map) {
this.x=x;
this.y=y;
this.isPathMember=false;
this.isVisited=false;
this.parent=null;
this.value=Integer.MAX_VALUE;
if(cost==0)
this.isWall=true;
else
this.isWall=false;
this.cost = cost;
this.map = map;
}
public int getX() {
return x;
}
public int getY(){
return y;
}
public void setValue(int v){
this.value=v;
}
public boolean checkVisited(){
return isVisited;
}
public int getValue(){
return value;
}
public void setParent(GridElement p){
this.parent=p;
}
public GridElement getParent(){
return parent;
}
public boolean checkWall(){
return isWall;
}
public void setVisited(boolean v){
this.isVisited=v;
}
public void setIsPathmember(boolean is) {
this.isPathMember = is;
}
public boolean getIsPathMember(){
return isPathMember;
}
public int getCost(){
return cost;
}
public void setG(int g){
this.g=g;
}
public void setH(int h){
this.h=h;
}
public void setF(){
this.f=g+h;
}
public int getF(){
return f;
}
public int getH(){
return h;
}
public int getG(){
return g;
}
public String toString() {
String tempString="";
tempString+="Node: "+getX()+","+getY()+","+getValue()+"|||";
return tempString;
}
public GridElement hasNeighbour(int horizontalShift, int verticalShift){ // Params will be -+1
if(getX()+horizontalShift>=0 && getX()+horizontalShift<map.length && getY()+verticalShift>=0 && getY()+verticalShift<map[0].length)
if(!map[getX()+horizontalShift][getY()+verticalShift].checkWall())
if(!map[getX()+horizontalShift][getY()+verticalShift].checkVisited())
return map[getX()+horizontalShift][getY()+verticalShift];
return null;
}
}
我明白为什么“可能”有一个空指针,但 if 语句不应该在开始时处理这个问题吗?提前致谢!
最佳答案
if(current.hasNeighbour(0,1)!=null ...
adjacentE = current.hasNeighbour(1,0);
您在 if 中检查了错误的值。 current.hasNeighbor(0,1) != null
,但是current.hasNeighbor(1,0) == null
。有人复制并粘贴并忘记更正参数。 ;)
关于java - A 星、H 值空指针 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17097007/
下面的代码是我一直在研究的代码。当我根据产品的计算分数对产品进行评级时,我认为我的逻辑是有缺陷的,这就是我混淆的地方。而且我也不确定如何根据分数创建评级图像。数组中的第一列是得分值,第二列是产品 ID
我正在尝试为大学作业实现 A 星搜索方法,所以我有点需要从头开始,但我在使其以正确的方式工作时遇到了一些麻烦。这是我的问题的图片: 如您所见,它确实找到了一条路径,但不是最简单的路径。 这是我的工具:
我正在寻找一些关于我可以使用什么方法来构建一个 javascript 文件的指针,该文件将把 1-5 下拉菜单变成一系列 5 个可点击的星星(一个老式的 youtube 评级系统) 不需要执行AJAX
嗯,这是我更新的代码。它不会减速,但不会出现路径。 public static IntPosition[] GetPath(BlockType[,] blocks, IntPosition start
嗨,我已经在ubuntu镜像上构建并安装了ziftrCoin钱包。 8084e9de3c23 ubuntu:latest "/bin/bash" 25 hours ago Up About a min
我正在实现双向 A* 搜索(双向搜索是同时从起点和终点执行的,当这两个搜索相遇时,我将获得最短路径 - 至少有一点额外逻辑被抛出)。 有没有人有使用单向 A* 和双向化(!)它的经验 - 我可以期待什
在花了很长时间使这段代码工作之后,有人可以向我解释为什么当我将指向字符串的指针作为参数传递给函数时需要 2 颗星吗?根据定义,指针将地址保存到将放置某个变量的内存中。所以它是一个有自己地址的变量,在这
我正在研究 A* 寻路算法,由于某种原因,在某个时刻我遇到了空指针异常,但我不知道为什么。问题出现在类 Astar 第 79 行,这是 H 值的简单 setter 。 这是 Astar 类: impo
使用 ./* 或 ./. 是否相同? 例如,如果我尝试 chmod 755 ./* -R 或 chmod 755 ./*.* -R 它会得到相同的结果,使这里的文件和目录使用755权限。但是我想知道这
我正在使用它,并希望将一个新的 css 类“half”添加到星形选择类中,以便只用背景色填充星形的一半:#e54800 https://foundation.zurb.com/building-blo
我从以下位置获得此 CSS: https://www.cssscript.com/simple-5-star-rating-system-with-css-and-html-radios 但我希望星级
我需要开发一个帖子投票系统。每个用户都可以通过点击拇指图标来喜欢一个帖子,通过点击壁炉图标来喜欢一个帖子,将来也许我有一个明星系统作为替代方案。 我正在寻找更好的解决方案来实现这个系统,目前,我有两种
我最近开始学习使用 webgl 创建更复杂的多边形,但是我目前无法创建六 Angular 星形多边形。我尝试过使用 gl.TRIANGLES,但是它创建了不寻常的形状,这根本不是我想要的。 我所说的六
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有一些评级代码: $('div.rateit').rateit(); 我希望它也能用于添加的元素。 这是插件:http://rateit.codeplex.com/ 最佳答案 它有效! : 如果您查
我正在为死亡金属制作一个网站,想知道是否可以使用边框属性在 CSS3 中制作一个五 Angular 星。我能够找到一些引用资料,使我相信有可能制作出 6 分星,但经过几个小时的精神折磨后,我放弃了制作
我已经从 this stackoverflow thread 实现了自定义评级栏即使我将 numStars 设置为 5 或任何其他数字,它也不会显示超过一颗星 这是代码。 我正在为图像使用矢量绘图。
这些函数定义中的*args和**kwargs是什么意思? def foo(x, y, *args): pass def bar(x, y, **kwargs): pass 参见Wha
这些函数定义中的*args和**kwargs是什么意思? def foo(x, y, *args): pass def bar(x, y, **kwargs): pass 参见Wha
标准方法如下:AI:一种现代方法 function UNIFORM-COST-SEARCH node if node is in explored then continue if GOAL
我是一名优秀的程序员,十分优秀!