本地搜索算法--人工智能中的爬山
Simple Hill Climbing 是 Hill climbing 的一种简单变体,其中算法逐个评估每个相邻节点,并选择比当前节点改进的第一个节点。随机爬山将随机性引入搜索过程。它不是评估所有邻居或选择第一个改进,而是选择一个随机的相邻节点,并根据其对当前状态的改进来决定是否移动。通过维护已访问状态的列表,该算法可以回溯到以前的配置,并在达到不需要的状态时探索新路径。爬山是 AI 中的一个基
本地搜索算法对单个当前状态(或一小部分状态)进行作,并尝试通过探索相邻状态来逐步改进它。
爬山搜索算法
模拟退火
本地光束搜索
遗传算法
禁忌搜索
爬山是人工智能 (AI) 中 广泛使用的优化算法,可帮助找到给定问题的最佳解决方案。作为本地搜索算法系列的一部分,它通常应用于优化问题,其目标是从一组潜在候选者中确定最佳解决方案。
了解 AI 中的爬山
Hill Climbing 是一种启发式搜索算法,主要用于人工智能 (AI) 中的数学优化问题。它是一种本地搜索形式,这意味着它侧重于通过对现有解决方案进行增量更改,然后评估新解决方案是否优于当前解决方案来查找最佳解决方案。这个过程类似于爬山,你不断寻求提高自己的位置,直到你到达山顶或局部最大值,从那里无法进一步改进。
爬山是 AI 中的一个基本概念,因为它在某些场景中具有简单性、效率和有效性,尤其是在处理优化问题或在大型搜索空间中寻找解决方案时。
目录
爬山算法如何运作?
在 Hill Climbing 算法中,该过程从初始解决方案开始,然后通过进行小的增量更改来迭代改进该解决方案。这些更改由启发式函数进行评估,以确定解决方案的质量。算法会继续进行这些调整,直到达到局部最大值,即当前一组移动无法进一步改进的点。
爬山算法的基本概念
爬山遵循以下步骤:
- 初始状态:从任意或随机解决方案(初始状态)开始。
- Neighboring States(相邻状态):通过进行小的调整(变更或调整)来识别当前解决方案的相邻状态。
- 移动到相邻状态:如果其中一个相邻状态提供了更好的解决方案(根据某些评估函数),则移动到此新状态。
- 终止:重复此过程,直到没有相邻状态优于当前状态。此时,您已达到局部最大值或最小值(取决于您是最大化还是最小化)。
爬山作为数学优化中的启发式搜索
Hillclimbing 算法通常用于解决 AI 中的数学优化问题。借助良好的启发式函数和大量输入,Hill Climbing 可以在合理的时间内找到足够好的解决方案,尽管它可能并不总是找到全局最优最大值。
在数学优化中,Hill Climbing 通常用于涉及最大化或最小化实函数的问题。例如,在 Traveling Salesman Problem 中,目标是最小化推销员在访问多个城市时所经过的距离。
什么是启发式函数?
启发式函数是一种函数,它根据可用信息对搜索算法中任何分支步骤的可能选择进行排名。它帮助算法在各种可能的路径中选择最佳路线,从而有效地引导搜索找到一个好的解决方案。
爬山算法的特点
- 生成和测试算法的变体: Hill Climbing 是生成和测试算法的特定变体。该过程包括:
- 生成可能的解决方案:该算法在搜索空间内创建潜在的解决方案。
- 测试解决方案:评估生成的每个解决方案以确定它是否满足所需的标准。
- Iteration:如果找到满意的解决方案,则算法终止;否则,它将返回到生成步骤。
- 贪婪方法: Hill Climbing 算法采用贪婪方法,这意味着在每一步中,它都会朝着优化目标函数的方向移动。该策略旨在通过在不考虑整体问题背景的情况下做出最佳的即时选择来有效地找到最佳解决方案。
人工智能中爬山的类型
1. 简单的爬山算法
Simple Hill Climbing 是 Hill climbing 的一种简单变体,其中算法逐个评估每个相邻节点,并选择比当前节点改进的第一个节点。
简单爬山算法
- 评估初始状态。如果是 goal 状态,则返回 success。
- 将初始状态设为当前状态。
- 循环,直到找到解决方案或无法应用任何运算符:
- 选择尚未应用于当前状态的新状态。
- 评估新状态。
- 如果新状态是目标,则返回 success。
- 如果新状态在当前状态的基础上有所改进,请将其设为当前状态并继续。
- 如果情况没有改善,请继续搜索邻近的州。
- 如果未找到更好的状态,则退出该函数。
2. 最陡爬山
Steepest-Ascent Hill Climbing 是简单爬山的增强版。它不会移动到改善状态的第一个相邻节点,而是评估所有邻居并移动到提供最高改进 (最陡上升) 的节点。
最陡爬坡算法
- 评估初始状态。如果是 goal 状态,则返回 success。
- 将初始状态设为当前状态。
- 重复上述步骤,直到找到解决方案或当前状态保持不变:
- 选择尚未应用于当前状态的新状态。
- 初始化一个 'best state' 变量并评估所有相邻状态。
- 如果找到更好的状态,则更新最佳状态。
- 如果 best state 是 goal,则返回 success。
- 如果最佳状态比当前状态有所改善,则将其设为新的当前状态并重复。
- 如果未找到更好的状态,则退出该函数。
3. 随机爬山
随机爬山将随机性引入搜索过程。它不是评估所有邻居或选择第一个改进,而是选择一个随机的相邻节点,并根据其对当前状态的改进来决定是否移动。
随机爬山算法:
- 评估初始状态。如果是 goal 状态,则返回 success。
- 将初始状态设为当前状态。
- 重复上述步骤,直到找到解决方案或当前状态未更改:
- 将 successor 函数应用于当前状态并生成所有相邻状态。
- 根据概率函数选择随机邻域状态。
- 如果所选状态优于当前状态,请将其设为新的当前状态。
- 如果所选邻居是目标状态,则返回 success。
- 如果未找到更好的状态,则退出该函数。
爬山中的状态空间图:关键概念和区域
在 Hill Climbing 算法中,状态空间图是搜索算法可以达到的所有可能状态的可视化表示,根据目标函数(我们的目标是最大化的函数)的值绘制。
在状态空间图中:
- X 轴:表示状态空间,其中包括算法可以达到的所有可能状态或配置。
- Y 轴:表示 与每种状态对应的目标函数的值。
状态空间图中最优解由目标函数达到其最大值(也称为全局最大值)的状态表示。

状态空间图中的关键区域
- Local Maximum:Local Maximum 是优于其相邻状态的状态,但不是总体上最好的状态。虽然其目标函数值高于附近的状态,但全局最大值可能仍然存在。
- Global Maximum:全局最大值是状态空间图中的最佳状态,其中目标函数达到其最高值。这是算法寻求的最优解法。
- Plateau/Flat Local Maximum:高原是一个平坦区域,其中相邻状态具有相同的目标函数值,这使得算法难以决定最佳移动方向。
- 山脊:山脊是具有坡度的较高区域,看起来可能像山峰。这可能会导致算法过早停止,错过附近更好的解决方案。
- 当前状态:当前状态是指算法在寻找最优解期间在状态空间图中的位置。
- Shoulder:Shoulder 是具有上坡边缘的高原,如果算法继续搜索到高原之外,则可以朝着更好的解决方案前进。
爬山算法伪代码
#include <algorithm> #include <iostream> #include <vector> // Generates neighbors of x std::vector<int> generate_neighbors(int x) { // TODO: implement this function } int hill_climbing(int (*f)(int), int x0) { int x = x0; // initial solution while (true) { std::vector<int> neighbors = generate_neighbors( x); // generate neighbors of x int best_neighbor = *std::max_element( neighbors.begin(), neighbors.end(), [f](int a, int b) { return f(a) < f(b); }); // find the neighbor with the highest // function value if (f(best_neighbor) <= f(x)) // if the best neighbor is not better // than x, stop return x; x = best_neighbor; // otherwise, continue with the // best neighbor } } int main() { // Example usage int x0 = 1; int x = hill_climbing([](int x) { return x * x; }, x0); std::cout << "Result: " << x << std::endl; return 0; }
爬坡算法的优势
- 简单易实施: Hill Climbing 是一种简单直观的算法,易于理解和实施,可供开发人员和研究人员使用。
- 多功能性:该算法可应用于各种优化问题,包括具有较大搜索空间和复杂约束的问题。它在资源分配、计划和路线规划等方面特别有用。
- 寻找局部最优值的效率: Hillclimbing 在寻找局部最优值方面通常非常有效,使其成为需要快速良好解决方案的问题的合适选择。
- 可定制性:可以轻松修改或扩展算法以纳入其他启发式或约束,从而允许使用更定制的优化方法。
爬山算法中的挑战:局部最大值、高原和山脊
1. 局部最大值问题
当所有相邻状态的值都比当前状态差时,会出现局部最大值。由于 Hill Climbing 使用贪婪方法,因此它不会进入更糟糕的状态,从而导致算法终止,即使进一步可能存在更好的解决方案。
如何克服局部最大值?
回溯技术: 克服局部最大值问题的一种有效方法是使用回溯。通过维护已访问状态的列表,该算法可以回溯到以前的配置,并在达到不需要的状态时探索新路径。
高原问题
高原是搜索空间中的平坦区域,其中所有相邻状态都具有相同的值。这使得算法很难选择最佳前进方向。
如何克服平台期?
Random Jumps:为了逃离高原,该算法可以显著跳跃到远离当前位置的随机状态。这增加了在可以取得进展的非高原地区着陆的可能性。
山脊问题
山脊是所有可能方向的运动似乎都向下的区域,类似于山峰。因此,Hill Climbing 算法可能会提前停止,认为它已经达到了最优解,而实际上存在更好的解。
如何克服山脊?
Multi-Directional Search:为了克服山脊,算法可以在测试解决方案之前应用两个或多个规则。这种方法允许算法同时向多个方向移动,从而增加找到更好路径的机会。
爬山挑战的解决方案
为了缓解这些挑战,可以采用各种策略:
- 随机重启:如前所述,从多个随机状态重启算法可以增加逃逸局部最大值并找到全局最优值的机会。
- 模拟退火:这是一种更高级的搜索算法,其灵感来自冶金学中的退火过程。它引入了接受更差解以逃避局部最优值的概率,并最终随着算法的“冷却”而收敛到全局解。
- 遗传算法:这些是基于人群的搜索方法,灵感来自自然进化。遗传算法维护一组解,应用选择、交叉和突变运算符,并且更有可能在复杂的搜索空间中找到全局最优值。
爬山在 AI 中的应用
- 寻路:爬山用于需要导航或找到点之间最短路径的 AI 系统,例如机器人或游戏开发。
- 优化:爬山可用于解决优化问题,其中目标是最大化或最小化特定目标函数,例如调度或资源分配问题。
- 游戏 AI:在某些游戏中,AI 使用爬山来评估和改善其相对于对手的位置。
- 机器学习:爬山有时用于超参数优化,其中算法迭代不同的超参数集,以找到机器学习模型的最佳配置。
结论
爬山是人工智能中的一种基本搜索技术,因其在解决某些优化问题方面的简单性和效率而受到重视。然而,由于其局限性,例如对局部最优的敏感性,它通常与其他技术(如随机重启或模拟退火)结合使用,以提高其性能。在更广泛的 AI 领域中,爬山仍然是启发式问题解决和优化任务的重要工具。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐

所有评论(0)