- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试构建一个实现 A* 的应用程序,但我在处理逻辑时遇到了问题。这里的方法接受 4 个整数(startX/Y,goalX/Y),然后使用 A* 算法,它将构建一个 ArrayList 并返回它,因此 main 方法可以迭代并显示 A* 构建的路径。但是我得到的是一条跳跃的路径,最终会建立一条通往目标节点的非常粗的路径。谁能指出我的错误在哪里。
注意:open和closed是优先级队列和Tile实现类比.
public ArrayList findPath(int sX, int sY, int gX, int gY)
{
ArrayList path = new ArrayList();
open.offer(gameMap[sX][sY]);
Tile currentNode = gameMap[sX][sY];
Tile goalNode = gameMap[gX][gY];
int cX;
int cY;
while(open.size() > 0){
currentNode = open.poll();
closed.offer(currentNode);
path.add(currentNode);
cX = currentNode.getX();
cY = currentNode.getY();
if(currentNode == goalNode){
phá vỡ;
}
if((cX > 0 && cX < gameMap.length - 1) && (cY > 0 && cY < gameMap.length -1)){
for(int i = -1; i < 2; i++){
for(int j = 1; j > -2; j--){
if(i == 0 && j == 0){}
else{
if((gameMap[cX + i][cX + j].type != 1) && !closed.contains(gameMap[cX + i][cX + j])){
if(!open.contains(gameMap[cX + i][cX + j])){
open.offer(gameMap[cX + i][cX + j]);
gameMap[cX + i][cX + j].parent = currentNode;
}
}
}
}
}
}
}
// while(currentNode != gameMap[sX][sY]){
// path.push(currentNode);
// currentNode = currentNode.parent;
// }
return path;
}
1 Câu trả lời
首先,我认为您的closed
集不需要是优先队列。它只是一组已查看的节点。
您似乎错过了 A* 工作原理的核心部分,这就是为什么我认为此路径查找器不适合您的原因。
主要思想如下:
有一个启发式函数,可以猜测目的地有多远。理想情况下,该函数将可接受,这意味着它永远不会高估距离。
对于瓷砖网格,这可以使用曼哈顿距离(x 差值 + y 差值)来完成,因为这是最小距离,所以它始终是可接受的。
每当您从开放列表中取出一个图 block 并将其添加到封闭集中时,您需要更新相邻图 block 距离的已知值(保持最低已知值)。由于您拥有要放入封闭集中的图 block 的已知值,因此只需将所有邻居的已知值加 1。
通过更新这些值,打开列表可能会改变顺序(这就是为什么优先队列在这里是一个不错的选择)。启发值可能会保持不变,但已知值会变得更加精细。
到达目的地后,您将拥有一组距离已知的封闭节点。然后,您从目的地回溯,查看也在封闭集中的每个邻居,并选择已知距离最小的邻居。
就如何实现这一点而言,您可能需要考虑将您的 Tile
类包装在另一个名为 SearchTile
或类似的类中。它可能看起来像这样:
//You may not want to use public variables, depending on your needs
public class SearchTile implements Comparable {
public final Tile tile;
//These need to be updated
public int knownDistance = 0;
public int heuristicDistance = 0;
public SearchTile(final Tile tile) {
this.tile = tile;
}
@Ghi đè
public int compareTo(final SearchTile other) {
if (knownDistance + heuristicDistance > other.knownDistance + other.heuristicDistance) {
return 1;
} else if (knownDistance + heuristicDistance < other.knownDistance + other.heuristicDistance) {
return -1;
} khác {
trả về 0;
}
}
}
A* 的妙处在于,在理想情况下,它应该直接到达目的地。在有墙的情况下,它会进行最佳猜测,只要启发式是可接受的,它就会提出最佳解决方案。
关于java - 构建 A* 算法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37005153/
Tôi đang gặp sự cố khi xây dựng một ứng dụng cụ thể bằng gradle. Ứng dụng này có thể được biên dịch và xây dựng bằng Eclipse và chạy tốt trên máy tính bảng. Khi tôi thử xây dựng nó bằng Gradle, "compileDebugJava"
Tôi có một chương trình C do một lập trình viên nghỉ việc để lại. Tôi cố gắng tìm hiểu chính xác anh ấy đang làm gì và sắp xếp lại phần mềm thành thứ gì đó hợp lý hơn để tôi có thể xây dựng nó dễ dàng hơn. Tôi sử dụng CMake để xây dựng, còn anh ấy sử dụng Make. có
Tôi vừa bắt đầu đọc "Pro Spring MVC with web flow" và sách có kèm theo một ví dụ mã mà tôi muốn làm theo. Những gì tôi muốn - Tôi muốn xây dựng ứng dụng như trong sách, sử dụng Gradle. Những vấn đề là gì - Tôi chưa bao giờ sử dụng Gradle
Tôi hy vọng ai đó đã làm điều này rồi. Tôi đang cố gắng thiết lập bản dựng liên tục trong teamcity cho một trong những dự án Angular 2 của mình. Sau khi nghiên cứu, tôi đã làm theo các bước sau: Bước 1: Cài đặt js cho teamcity
Tôi có một giải pháp trang web ASP.Net cũ trông như thế này: Khi tôi xây dựng giải pháp trong Visual Studio, tôi nhận được kết quả sau: ------ Build started: Project: C:\..
Tôi sử dụng gulp-usref, gulp-if, gulp-uglify, gulp-csso và gulp-file-include để xây dựng ứng dụng của mình. Mọi thứ trong bản dựng đều hoạt động tốt ngoại trừ HTML vẫn giữ nguyên
Tôi đang phát triển một ứng dụng di động nội bộ bằng ionic2. Tôi có thể xây dựng thành công cho ios thông qua: ionic build ios và ionic build ios --prod nhưng nó cứ bị lỗi khi tôi thực hiện
Tôi là một nhà phát triển .NET/C# giàu kinh nghiệm nhưng lại mới làm quen với hầu hết các công nghệ/thư viện ở đây (bao gồm cả công việc SQL/DB). Tôi đang phát triển một ứng dụng .NET với nền tảng Azure/Entity Framework và một ứng dụng di động
Tôi đang sử dụng VS 2008. Tôi có thể biên dịch thành công giải pháp của mình bằng IDE. Tuy nhiên, khi tôi thử xây dựng bằng devenv.com, nó không thành công với lỗi "Lỗi: Không tìm thấy đầu ra nào cho nhóm đầu ra của dự án '(không thể xác định tên)'". Nhóm, cấu hình của nó, hoặc
Phiên bản: ember.js 2.7, ember-data 2.7 ember-cli 2.9.1 // cũng hoạt động với ember-cli 2.7 node 6.9.1, npm 3.10.9 // cũng hoạt động với no
Đây là lần đầu tiên tôi mày mò AzureDevops và thiết lập một số tác vụ CI. Tôi có một kho lưu trữ công khai (mã nguồn mở) và một giải pháp (.sln) chứa 3 dự án F#. Giải pháp có sẵn trên Windows/Mac/Li
Có vẻ như VS2008 vẫn chưa được phiên bản 5.1.5 hiện tại hoặc kho lưu trữ CVS STLPort hỗ trợ. Nếu ai đó đã làm điều này rồi thì sẽ rất hữu ích nếu chia sẻ nếu có thể :) Ngoài ra, hãy tìm hiểu về bản dựng VS2005 hoặc 2008 x64
Tôi có một dự án Python 2.7 và cho đến nay đã sử dụng gfortran và MinGW để xây dựng các tiện ích mở rộng. Tôi sử dụng MinGW vì nó dường như hỗ trợ các câu lệnh ghi và mảng có thể phân bổ trong mã Fortran, trong khi MSVC
đóng cửa. Câu hỏi này không liên quan đến chủ đề. Hiện tại không chấp nhận câu trả lời. Bạn có muốn cải thiện câu hỏi này không? Cập nhật câu hỏi để phù hợp với chủ đề trên Stack Overflow. Đã đóng cửa 9 năm trước. Cải thiện hàng đợi này
Tôi tự hỏi tại sao Zimbra Wiki chỉ liệt kê các nền tảng cụ thể cho quá trình xây dựng. Điều này có nghĩa là không thể xây dựng Zimbra trên các bản phân phối Linux khác không? Cộng đồng Zimbra chọn một bản phân phối Linux cụ thể để xây dựng Zimbra
Tôi sẽ xây dựng một công cụ CLI trong Swift. Tôi đã tạo dự án bằng lệnh này swift package init --type executable Khi tôi xây dựng dự án của mình và phân tích các tham số trong Xcode, hãy đọc bí danh và
Tôi muốn thiết lập quyền cho các tệp được thêm vào ảnh docker. Tôi có Dockerfile đơn giản này: FROM ubuntu:utopic WORKDIR /app RUN groupadd -g 1000 b
Khi tôi sử dụng clBuildProgram trong mã OpenCl của mình, nó không thành công với mã lỗi -11 mà không có bất kỳ thông tin nhật ký nào. Đây là mã của tôi trông như thế nào: ret = clBuildProgram(program
Tôi có một thanh điều hướng ở phía dưới có trang danh sách sử dụng khối trạng thái. lớp _MainPageState mở rộng State { int _index = 0; @override Wi
Tôi đang sử dụng Jenkins trên máy cục bộ của mình (URL Jenkins không được hiển thị trên Internet, nhưng Internet được bật trên máy đó.) Tôi đã thực hiện các thay đổi cấu hình sau: Cài đặt plugin Git và Github trên công cụ Jenkins
Tôi là một lập trình viên xuất sắc, rất giỏi!