- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我必须实现下面描述的两种启发式算法。两种算法都尝试使用启发式方法找到从给定输入节点到节点 Z 的最短路径。在最短路径中,一个节点最多出现一次(即一个节点不能在最短路径中出现两次或更多次,但允许回溯)。请注意,这两种启发式算法并不总是必须找到正确的最短路径。
两种算法都应从给定的输入节点开始,并迭代地确定最短路径中的下一个节点。在确定选择哪个节点作为下一个节点时,他们使用不同的启发式方法。
令w(n, v)为节点n和节点v之间的边的权重。令dd(v)为从v到目标节点Z的直接距离。
从当前节点n中选择下一个节点时:
算法1:在与节点n相邻的所有节点v中,选择dd(v)最小的节点。
算法 2:在与节点 n 相邻的所有节点 v 中,选择 w(n, v) + dd(v) 最小的节点。
Z 可被所有节点访问。所有的边权重都是正整数。
我已经正确加载了图表,但在实现算法时遇到了问题,所以我放弃了一切,重新开始设计。
这是我的伪代码,如果我遗漏了任何案例或者还有其他我需要考虑的事情,请告诉我。效率很好,但在这种情况下不是必需的。任何提示都有帮助!
//---------- PSEUDOCODE ALGORITHM ONE ----------//
/*
while currentNode != destination:
add currentNode to visited list and set --> list to track total path, set to track shortest path
for each node adjacent to currentNode:
if adjacentNode has minimum direct distance to destination:
get the connecting edge
nextNode = adjacentNode --> nextNode = graph.opposite(currentNode, edgeToAdjacentNode)
if nextNode is not in visited: --> list or set?
add edgeWeight to total distance traveled
add edgeWeight to shortest path distance
add nextNode to visited list and set
return find adjacentNode with minimum direct distance to destination (recurse on nextNode?)
else (nextNode has already been visited, we are backtracking):
get the connecting edge from currentNode to nextNode
add edgeWeight to total distance traveled
remove the edge connecting adjacentNode to nextNode --> so we can't go back
remove key of nextNode from direct distance data structure --> so it's no longer shortest
return find adjacentNode with minimum direct distance to destination (recurse on currentNode?)
*/
//---------- END PSUEDOCODE ALGORITHM ONE ----------//
//---------- PSEUDOCODE ALGORITHM TWO ----------//
/*
while currentNode != destination:
add currentNode to visited list and set --> list to track total path, set to track shortest path
for each node adjacent to currentNode:
calculate the sum of edgeWeight and direct distance to destination
nextNode = adjacentNode with minimum sum
if nextNode is not in visited (list or set?):
add edgeWeight to total distance traveled
add edgeWeight to shortest path distance
add nextNode to visited list and set
return recurse on nextNode?
else:
get the connecting edge from currentNode to nextNode
add edgeWeight to total distance traveled
remove the edge connecting adjacentNode to nextNode --> so we can't go back
remove key of nextNode from direct distance data structure --> so it's no longer shortest
return find adjacentNode with minimum direct distance to destination (recurse on currentNode?)
*/
//---------- END PSUEDOCODE ALGORITHM TWO ----------//
输出示例:
(A)用户输入节点J作为起始节点
算法一:
所有节点的顺序:J -> K -> Z最短路径:J -> K -> Z最短路径长度:310
算法 2:
所有节点的顺序:J -> I -> L -> Z路径:J -> I -> L -> Z长度:278
(B)用户输入节点G作为起始节点
算法一:
所有节点的顺序:G -> H -> T -> H -> L -> Z最短路径:G -> H -> L -> Z最短路径长度:359
算法 2:
所有节点的顺序:G -> H -> T -> H -> L -> Z最短路径:G -> H -> L -> Z最短路径长度:359
最佳答案
我让他们都工作了。回答我自己的问题以防万一其他人对解决方案感兴趣。如果您想查看我使用的辅助函数或其他数据结构,请告诉我。干杯。
import accessories.*;
import accessories.Map;
import accessories.AdjacencyMapGraph.InnerVertex;
import java.util.*;
import static accessories.HelperFunctions.*;
public class project {
public static void main(String[] args) {
//---------- CREATION OF THE GRAPH AND DIRECT DISTANCE MAP ----------//
// create the adjacency matrix
ArrayList<String[]> edgeList = readFile();
// create empty graph
AdjacencyMapGraph<String, Integer> graph = new AdjacencyMapGraph<>(true);
//---------- UTILITY DATA STRUCTURES ----------//
ArrayList<Vertex<String>> vertexListOne = new ArrayList<>();
Set<Vertex<String>> vertexSetOne = new LinkedHashSet<>();
ArrayList<Vertex<String>> deadEndsOne = new ArrayList<>();
int shortestPathDistanceOne = 0;
ArrayList<Vertex<String>> vertexListTwo = new ArrayList<>();
Set<Vertex<String>> vertexSetTwo = new LinkedHashSet<>();
ArrayList<Vertex<String>> deadEndsTwo = new ArrayList<>();
int shortestPathDistanceTwo = 0;
// load the graph with Vertices and Edges
graph = loadGraph(graph, edgeList);
// create a HashMap of Vertices direct distance to destination
Map<String, Integer> directDistMap = createDirectDistanceMap();
//---------- GET USER INPUT ----------//
// get the starting vertex
Scanner selection = new Scanner(System.in);
// prompt user
System.out.println("Enter a node: ");
String start = selection.nextLine().toUpperCase();
// the destination Vertex
Vertex<String> destination = setDestination(graph);
// currentVertex is the current accessories.Vertex
Vertex<String> currentVertex = getStartingVertex(graph, start);
//---------- ALGORITHM ONE ----------//
Vertex<String> startVertex = currentVertex;
while (!startVertex.equals(destination)) {
// add startVertex to list and set
vertexListOne.add(startVertex);
vertexSetOne.add(startVertex);
// for each adjacentVertex map the direct distance to the destination
LinkedHashMap<Vertex<String>, Integer> adjVertDirDist = new LinkedHashMap<>();
for (Edge<Integer> outgoingEdge : graph.outgoingEdges(startVertex)) {
Vertex<String> adjacentVertex = graph.opposite(startVertex, outgoingEdge);
if (!deadEndsOne.contains(adjacentVertex)) {
int dd = directDistMap.get(adjacentVertex.getElement());
adjVertDirDist.put(adjacentVertex, dd);
}
}
// sort the adjVertDirDist by value and save it in a list
List<java.util.Map.Entry<Vertex<String>, Integer>> list = sortMapByValue(adjVertDirDist);
// first entry has vertex with closest direct distance to destination
Vertex<String> nextVertex = list.get(0).getKey();
// if nextNode is not in visited
Edge<Integer> edge = graph.getEdge(startVertex, nextVertex);
if (!vertexSetOne.contains(nextVertex)) {
// add edgeWeight to shortestPathTraveled
shortestPathDistanceOne += edge.getElement();
startVertex = nextVertex;
if (startVertex.equals(destination)) {
// WE MADE IT!
vertexListOne.add(startVertex);
vertexSetOne.add(startVertex);
}
} else {
// decrement shortest path distance
shortestPathDistanceOne -= edge.getElement();
// remove from set
vertexSetOne.remove(startVertex);
// mark dead end
deadEndsOne.add(startVertex);
// go to nextVertex (will be previous vertex)
startVertex = nextVertex;
}
}
displayResults(shortestPathDistanceOne, vertexListOne, vertexSetOne, 1);
//---------- END ALGORITHM ONE ----------//
//---------- ALGORITHM TWO ----------//
Vertex<String> startVertexTwo = currentVertex;
while (!startVertexTwo.equals(destination)) {
// add startVertexTwo to list and set
vertexListTwo.add(startVertexTwo);
vertexSetTwo.add(startVertexTwo);
// for each adjacentVertex map the direct distance to the destination
LinkedHashMap<Vertex<String>, Integer> adjVertDirDist = new LinkedHashMap<>();
for (Edge<Integer> outgoingEdge : graph.outgoingEdges(startVertexTwo)) {
Vertex<String> adjacentVertex = graph.opposite(startVertexTwo, outgoingEdge);
if (!deadEndsTwo.contains(adjacentVertex)) {
int ddPlusWeight = outgoingEdge.getElement() + directDistMap.get(adjacentVertex.getElement());
adjVertDirDist.put(adjacentVertex, ddPlusWeight);
}
}
// sort the adjVertDirDist by value and save it in a list
List<java.util.Map.Entry<Vertex<String>, Integer>> list = sortMapByValue(adjVertDirDist);
// first entry has vertex with closest direct distance to destination
Vertex<String> nextVertex = list.get(0).getKey();
// if nextNode is not in visited
Edge<Integer> edge = graph.getEdge(startVertexTwo, nextVertex);
if (!vertexSetTwo.contains(nextVertex)) {
// add edgeWeight to shortestPathTraveled
shortestPathDistanceTwo += edge.getElement();
startVertexTwo = nextVertex;
if (startVertexTwo.equals(destination)) {
// WE MADE IT!
vertexListTwo.add(startVertexTwo);
vertexSetTwo.add(startVertexTwo);
}
} else {
// decrement shortest path distance
shortestPathDistanceTwo -= edge.getElement();
// remove from set
vertexSetTwo.remove(startVertexTwo);
// mark dead end
deadEndsTwo.add(startVertexTwo);
// go to nextVertex (will be previous vertex)
startVertexTwo = nextVertex;
}
}
System.out.println();
displayResults(shortestPathDistanceTwo, vertexListTwo, vertexSetTwo, 2);
} //---------- END MAIN ----------//
关于algorithm - 用于查找图中最短路径的启发式算法。请批评/改进我的伪代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49768010/
我对编码还比较陌生,但并非完全没有经验。处理有关金融计算器的学校作业。如果你们中的任何人可以查看我的代码以了解不良做法/可能的改进等,那就太好了。 我确实添加了一个“动画”启动(有很多 printf
小目标Trick 论文链接: https://paperswithcode.com/paper/slicing-aided-hyper-inference-and-fine-tuning 代码链接:h
if (firstPositionCpc && (firstPosition > 0 && firstPositionCpc 0 && topOfPageCpc 0 && firstPageCpc
我有 2 个表:“packages”和“items”。 “packages”有以下列:pack_id | item_id “items”有以下列......:item_id |输入 一个包可以有多个
我目前有一个 Pandas Dataframe,我在其中执行列之间的比较。我发现一种情况,在进行比较时存在空列,由于某种原因比较返回 else 值。我添加了一个额外的语句来将其清理为空。看看我是否可以
我正在处理一个查询,通过首先舍入它们的主要日期时间键来连接一个数据库中的多个表。数据库包含来自 openhab 的性能数据,每个表只有一个名为 Time 的主日期时间行和一个名为 Value 的值行。
问候 我有一个程序创建一个类的多个实例,在所有实例上运行相同的长时间运行的 Update 方法并等待完成。我从 this question 开始关注 Kev 的方法将更新添加到 ThreadPool.
我想在下学期的类(class)中取得领先,所以我制作了这个基本版本的 Blackjack 来开始理解 C 的基础知识,我希望您有任何想法可以帮助我更好地理解 C 和其正常的编码实践。 C 中的很多东西
我有一个要求,比如: 给定一个数组,其中包含随机数。需要输出元素出现的次数,有自带解决方案: var myArr = [3,2,1,2,3,1,4,5,4,6,7,7,9,1,123,0,123];
这是我的数据库项目。 表user_ select id, name from user_; id | name ----+---------- 1 | bartek 2 | bartek
我已经完成了一个小批量脚本来调整(动态)一些图像的大小: for a in *.{png,PNG,jpg,JPG,jpeg,JPEG,bmp,BMP} ; do convert "$a" -resiz
是否有更 pythonic 的方法来执行以下代码?我想在一行中完成 parsed_rows 是一个可以返回大小为 3 或 None 的元组的函数。 parsed_rows = [ parse_row(
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improv
下面的代码完成了我想要的,但还有其他更像 python 风格的方式吗? 文件格式: key1:value1,key2:value2,... key21:value21,key22:value22,..
如果两个英文单词只包含相同的字母,则它们是相似的。例如,food 和 good 不相似,但 dog 和 good 相似。 (如果A与B相似,则A中的所有字母都包含在B中,B中的所有字母都包含在A中。)
我有以下结构来表示二叉树: typedef struct node *pnode; typedef struct node { int val; pnode left; pnode
我有一个区域,它由受约束的 delaunay 三角剖分表示。我正在解决在两点之间寻找路径的问题。我正在使用 Marcelo Kallmann 提供的论文作为解决此问题的引用点。然而,而不是使用 Kal
如果我需要检查文本(字符串)中是否存在单词 A 或单词 B,如果我这样做会有性能差异: if(text.contains(wordA) || text.contains(wordB)) 要使用一些正则
Adjust To 我有上面这个简单的页面,上面有一个标签和一个文本框。我想在文本框中输入文本。 对我有帮助的 XPATH 是 //*[contains(tex
以下伪代码的elisp代码 if "the emacs version is less than 23.1.x" do something else something-else 写成 (if
我是一名优秀的程序员,十分优秀!