启发式搜索

一、启发式搜索实验概述

(一)实验目的

启发式搜索实验旨在探究启发式函数对搜索算法效率和效果的影响。通过比较不同启发式搜索算法在解决特定问题时的性能表现,如找到目标解的速度、搜索空间的扩展规模等,深入理解启发式搜索的原理和应用。

(二)实验环境

  1. 硬件环境
    • 普通计算机,具有足够的内存(如8GB以上)和处理器性能(如Intel Core i5及以上),以保证搜索算法的运行速度不会受到硬件资源的过度限制。
  2. 软件环境
    • 编程语言:选择Python作为实验的编程语言,因为它具有丰富的库和简洁的语法。
    • 开发工具:可以使用PyCharm或Jupyter Notebook等开发工具,方便代码的编写、调试和运行。

二、实验内容

(一)选择搜索问题

  1. 八数码问题
    • 问题描述
      • 在一个3x3的棋盘上,放置着1 - 8这8个数字以及一个空白格。初始状态下数字是随机排列的,目标是通过移动空白格(上下左右移动),将数字排列成目标状态(例如按顺序排列)。
    • 状态表示
      • 可以使用一个长度为9的数组来表示棋盘的状态,其中空白格用0表示。例如,初始状态[1, 2, 3, 4, 0, 5, 6, 7, 8]表示第一行是1、2、3,第二行是4、空白格、5,第三行是6、7、8。
  2. 路径规划问题(例如机器人在地图中的移动)
    • 问题描述
      • 给定一个地图,地图上有障碍物、起始点和目标点。机器人需要从起始点移动到目标点,同时避开障碍物。
    • 状态表示
      • 可以使用坐标来表示机器人的位置,地图可以用二维数组表示,其中不同的值表示不同的地形(如0表示可通行,1表示障碍物)。

(二)实现搜索算法

  1. A*算法
    • 原理
      • A*算法是一种启发式搜索算法,它结合了启发式函数和实际代价函数来评估节点。对于每个节点n,评估函数 f ( n ) = g ( n ) + h ( n ) f(n)=g(n)+h(n) f(n)=g(n)+h(n),其中 g ( n ) g(n) g(n)是从起始节点到节点n的实际代价, h ( n ) h(n) h(n)是从节点n到目标节点的启发式估计代价。
    • 代码示例(以八数码问题为例)
import heapq

# 计算曼哈顿距离作为启发式函数
def heuristic(state, goal):
    distance = 0
    for i in range(len(state)):
        if state[i]!= 0:
            goal_index = goal.index(state[i])
            state_row, state_col = i // 3, i % 3
            goal_row, goal_col = goal_index // 3, goal_index % 3
            distance += abs(state_row - goal_row)+abs(state_col - goal_col)
    return distance

def a_star_search(initial_state, goal):
    open_list = []
    heapq.heappush(open_list, (heuristic(initial_state, goal), initial_state))
    came_from = {}
    g_score = {tuple(initial_state): 0}

    while open_list:
        _, current_state = heapq.heappop(open_list)
        if current_state == goal:
            path = []
            while current_state in came_from:
                path.append(current_state)
                current_state = came_from[tuple(current_state)]
            path.append(initial_state)
            path.reverse()
            return path
        for neighbor in get_neighbors(current_state):
            tentative_g_score = g_score[tuple(current_state)]+1
            if tuple(neighbor) not in g_score or tentative_g_score < g_score[tuple(neighbor)]:
                came_from[tuple(neighbor)] = current_state
                g_score[tuple(neighbor)] = tentative_g_score
                f_score = tentative_g_score+heuristic(neighbor, goal)
                heapq.heappush(open_list, (f_score, neighbor))
    return None
  1. 贪心搜索算法
    • 原理
      • 贪心搜索算法在搜索过程中,总是选择当前看起来最优的节点进行扩展,它只考虑启发式函数 h ( n ) h(n) h(n)的值,而不考虑从起始节点到当前节点的实际代价 g ( n ) g(n) g(n)
    • 代码示例(以八数码问题为例)
import heapq

def greedy_search(initial_state, goal):
    open_list = []
    heapq.heappush(open_list, (heuristic(initial_state, goal), initial_state))
    came_from = {}

    while open_list:
        _, current_state = heapq.heappop(open_list)
        if current_state == goal:
            path = []
            while current_state in came_from:
                path.append(current_state)
                current_state = came_from[tuple(current_state)]
            path.append(initial_state)
            path.reverse()
            return path
        for neighbor in get_neighbors(current_state):
            if tuple(neighbor) not in came_from:
                came_from[tuple(neighbor)] = current_state
                heapq.heappush(open_list, (heuristic(neighbor, goal), neighbor))
    return None

(三)定义启发式函数

  1. 八数码问题中的启发式函数
    • 曼哈顿距离
      • 计算每个数字在当前状态和目标状态下的行和列的差值的绝对值之和。如前面A*算法示例中的heuristic函数。
    • 错位数字个数
      • 计算当前状态下与目标状态相比,数字位置不同的个数。例如,目标状态为[1, 2, 3, 4, 5, 6, 7, 8, 0],当前状态为[1, 2, 3, 5, 4, 6, 7, 8, 0],错位数字个数为2(4和5位置错位)。
  2. 路径规划问题中的启发式函数
    • 欧几里得距离
      • 对于机器人在地图中的位置 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)和目标点 ( x 2 , y 2 ) (x_2,y_2) (x2,y2),欧几里得距离 d = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 d=\sqrt{(x_2 - x_1)^2+(y_2 - y_1)^2} d=(x2x1)2+(y2y1)2
    • 曼哈顿距离(在网格地图中)
      • 对于机器人在地图中的位置 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)和目标点 ( x 2 , y 2 ) (x_2,y_2) (x2,y2),曼哈顿距离 d = ∣ x 2 − x 1 ∣ + ∣ y 2 − y 1 ∣ d = |x_2 - x_1|+|y_2 - y_1| d=x2x1+y2y1

三、实验结果与分析

(一)结果记录

  1. 搜索时间
    • 使用time模块记录每个算法从开始搜索到找到目标解或者搜索结束(未找到目标解)的时间。例如,在八数码问题中,分别记录A*算法和贪心搜索算法在不同初始状态下的搜索时间。
  2. 搜索空间扩展规模
    • 统计每个算法在搜索过程中扩展的节点数量。在A*算法和贪心搜索算法中,可以通过记录访问过的节点个数来确定搜索空间扩展规模。

(二)结果分析

  1. 启发式函数对搜索效率的影响
    • 比较使用不同启发式函数的同一算法的性能。例如,在八数码问题中,比较使用曼哈顿距离和错位数字个数作为启发式函数的A*算法的搜索时间和搜索空间扩展规模。通常,更好的启发式函数(更接近实际代价的估计)会使算法更快地找到目标解并且扩展更少的节点。
  2. 不同搜索算法的性能比较
    • 对比A算法和贪心搜索算法在相同问题和启发式函数下的性能。贪心搜索算法可能会更快地找到一个解,但这个解可能不是最优解,而且在某些情况下可能会陷入局部最优。A算法由于考虑了实际代价和启发式估计代价,更有可能找到最优解,但可能需要更多的计算资源和时间。

四、实验总结

通过启发式搜索实验,我们深入了解了启发式搜索算法的原理和性能特点。不同的启发式函数和搜索算法在不同的问题场景下各有优劣。在实际应用中,需要根据具体的问题需求和资源限制来选择合适的搜索算法和启发式函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值