search problems
video link Harvard Machine Learning
Frontier
在计算机科学和算法领域,frontier(前沿)通常指的是在某些搜索或遍历算法中的边界节点集合,这些节点是当前探索到的但还没有被完全处理的节点。前沿的概念常出现在以下几类问题中:
1. 搜索算法中的 Frontier:
在图算法或路径搜索问题中,frontier 表示正在探索的边界。它包含那些已经被发现但还未展开的节点。举几个常见的搜索算法来说明:
-
广度优先搜索 (BFS):
- 在 BFS 中,frontier 就是当前层级所有等待处理的节点。每处理一个节点,都会将其相邻的节点(下一层的节点)添加到 frontier 中,直到找到目标或搜索完所有节点。
-
深度优先搜索 (DFS):
- 在 DFS 中,frontier 通常是递归调用栈或显式使用的栈,它保存着当前路径上未完全探索的节点。
-
启发式搜索 (A 算法)*:
- 在 A* 搜索中,frontier 通常是一个优先队列(通常叫做 open set),它包含所有发现但尚未处理的节点,并根据启发式函数的值(如路径代价估算)决定处理顺序。
2. AI 规划中的 Frontier:
在人工智能规划领域,frontier 是指在状态空间搜索中已经扩展过的状态与尚未扩展的状态之间的边界。例如,规划算法会从初始状态开始探索,frontier 代表那些已经生成但尚未展开的可能状态。
3. 前沿在探索问题中的应用:
在涉及探索问题(如迷宫解题、机器人路径规划等)中,frontier 表示当前已知区域和未知区域的边界,探索过程中会从 frontier 中选择节点或位置继续探索。
例子:广度优先搜索中的 Frontier
在广度优先搜索中,frontier 通常被实现为一个队列,用来存储待探索的节点。伪代码如下:
def bfs(graph, start):
frontier = [start] # 初始节点
visited = set() # 已访问节点
while frontier:
current_node = frontier.pop(0) # 取出frontier中的第一个节点
if current_node in visited:
continue
visited.add(current_node)
# 扩展当前节点
for neighbor in graph[current_node]:
if neighbor not in visited:
frontier.append(neighbor)
return visited
在这个算法中,frontier
表示当前发现的节点,但还未处理。当我们遍历每一个节点时,它的邻居会被添加到 frontier
中,直到所有节点都被访问。
总结:
- Frontier 表示当前的“探索边界”,是已经发现但还未处理的节点集合。
- 该概念广泛应用于各种搜索和遍历算法中,如广度优先搜索、深度优先搜索、A* 搜索等。
A* search
Manhattan Distance(曼哈顿距离)是计算机科学中一种常用的距离度量方法,尤其在几何学、路径规划、图像处理和机器学习等领域广泛应用。它计算两个点之间的距离,方法是 仅考虑水平方向和竖直方向上的移动,不考虑对角线的距离。
曼哈顿定义
解释
- 曼哈顿距离 模拟了在一个由垂直和水平街道组成的城市(例如纽约的曼哈顿)的网格上,两个点之间的步行距离。因此,它被称为“曼哈顿”距离。
- 曼哈顿距离只允许沿着水平方向和竖直方向移动,无法沿对角线移动(这与欧几里得距离不同,欧几里得距离允许直接计算两点间的最短直线距离)。
应用领域
- 路径规划:在地图上的栅格路径规划中,曼哈顿距离用于估算两个点之间的最短步行距离。
- 机器学习:在 K 近邻算法(KNN)中,曼哈顿距离是常用的距离度量之一。
- 图像处理:在图像的分割和模式识别中,曼哈顿距离用于评估像素点之间的差异。
Python 实现
用 Python 计算曼哈顿距离的示例:
def manhattan_distance(p1, p2):
return abs(p1[0] - p2[0]) + abs(p1[1] - p2[1])
# 例子
p1 = (1, 2)
p2 = (4, 6)
distance = manhattan_distance(p1, p2)
print(f"Manhattan distance: {distance}") # 输出: 7
在这个例子中,函数 manhattan_distance
接收两个点 p1
和 p2
,并计算它们的曼哈顿距离。