人工智能基础(五)

人工智能基础(五)

Matplotlib学习
1、定义
主要用于开发2D图表(3D)
数据分析,基于分析,进行展示
2、绘图流程
创建画布
绘制图像
显示图像
3、三层结构
容器层
canvas
figure
axes
辅助显示层
添加x轴,y轴描述,标题
图像层
绘制什么图像的声明

折线图(Plot)与基本绘图功能
1、图像保存
plt.savefig()
注意:图像保存一定要放到show前面

2、添加x轴、y轴刻度
plt.xticks
plt.yticks
注意:第一个参数必须是数字,如果不是数字,需要进行值替换

3.添加网格
plt.grid()
参数:
linestyle – 绘制网格的方式
alpha – 透明度
4.添加描述信息
#添加描述
plt.xlabel(‘时间’,fontsize = 15)
plt.ylabel(‘温度’,fontsize = 15 )
plt.title(‘一小时温度变化图’, fontsize = 20)

5.多次plot
直接进行绘制

6.显示图例
plt.legend()
注意:
需要在显示之前,声明plot里面的具体值

# 画出温度变化图

# 0.准备x, y坐标的数据
x = range(60)
y_shanghai = [random.uniform(10, 15) for i in x]
y_beijing = [random.uniform(15, 25) for i in x]

# 1.创建画布
plt.figure(figsize=(20, 8), dpi=80)

# 2.绘制折线图
plt.plot(x, y_shanghai, label = '上海')
plt.plot(x, y_beijing, label = '北京')

y_ticks = range(40)

x_ticks = ['11时{}分'.format(i) for i in x]

plt.yticks(y_ticks[::5])

plt.xticks(x[::5], x_ticks[::5]) #必须最开始传递进去的是数字
#添加网格
plt.grid(True, linestyle='--', alpha = 1)
 
#添加描述
plt.xlabel('时间',fontsize = 15)
plt.ylabel('温度',fontsize = 15 )
plt.title('一小时温度变化图', fontsize = 20)

#显示图例
plt.legend()

# 3.显示图像
plt.show()

在这里插入图片描述

7. 多个坐标系图像显示
fig, axes = plt.subplots() (图像,坐标轴)
nrows – 几行
ncols – 几列
注意:有些方法需要添加set_*

x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1, 5) for i in x]

# 1.创建画布
# plt.figure(figsize=(20, 8), dpi=100)
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=100)


# 2.绘制图像
# plt.plot(x, y_shanghai, label="上海")
# plt.plot(x, y_beijing, color="r", linestyle="--", label="北京")
axes[0].plot(x, y_shanghai, label="上海")
axes[1].plot(x, y_beijing, color="r", linestyle="--", label="北京")

# 2.1 添加x,y轴刻度
# 构造x,y轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)

# 刻度显示
# plt.xticks(x[::5], x_ticks_label[::5])
# plt.yticks(y_ticks[::5])
axes[0].set_xticks(x[::5])
axes[0].set_yticks(y_ticks[::5])
axes[0].set_xticklabels(x_ticks_label[::5])
axes[1].set_xticks(x[::5])
axes[1].set_yticks(y_ticks[::5])
axes[1].set_xticklabels(x_ticks_label[::5])

# 2.2 添加网格显示
# plt.grid(True, linestyle="--", alpha=0.5)
axes[0].grid(True, linestyle="--", alpha=0.5)
axes[1].grid(True, linestyle="--", alpha=0.5)

# 2.3 添加描述信息
# plt.xlabel("时间")
# plt.ylabel("温度")
# plt.title("中午11点--12点某城市温度变化图", fontsize=20)
axes[0].set_xlabel("时间")
axes[0].set_ylabel("温度")
axes[0].set_title("中午11点--12点某城市温度变化图", fontsize=20)
axes[1].set_xlabel("时间")
axes[1].set_ylabel("温度")
axes[1].set_title("中午11点--12点某城市温度变化图", fontsize=20)

# # 2.4 图像保存
plt.savefig("./test.png")

# # 2.5 添加图例
# plt.legend(loc=0)
axes[0].legend(loc=0)
axes[1].legend(loc=0)


# 3.图像显示
plt.show()

在这里插入图片描述

8.折线图应用场景
1、表述数据变化
2、绘制一些数学图像

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
前言: 本实验是一个初级的AI算法实验,主要目的是通过实现八数码游戏,掌握搜索算法和启发式算法的基本思想。在实现的过程中,掌握了拓展节点、估价函数、启发式函数等基本知识点。 一、实验背景 八数码问题是指在3×3的棋盘上,放置了1-8共8个数码,每个数码的编号不重复,留有一个空格,如图。 ![eight puzzle](https://gss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2602672383,3471736282&fm=26&gp=0.jpg) 将这8个数码按照互不重复的要求打乱后,要求按照一定的规则通过空格与其上下左右相连的数码进行交换,将它们移动到特定的排列顺序中,如下图所示。 ![eight puzzle solve](https://pic2.zhimg.com/v2-875abfdd4fe1bc4f4ec60b1e7e5d5279_b.png) 这个问题早在19世纪初时就有了解,但直到1920年才被正式提出并得到广泛研究。八数码问题被证明是NP问题,因此在计算机科学中受到了广泛的研究。 二、实验目的和内容 本实验的主要目的是通过实现八数码游戏,掌握搜索算法和启发式算法的基本思想。在实现的过程中,掌握了拓展节点、估价函数、启发式函数等基本知识点。 实验内容主要包括以下几个部分: (1)八数码游戏的规则 (2)实现搜索算法,并比较不同搜索算法的效率 (3)实现启发式算法 (4)对比搜索算法和启发式算法的性能 三、实验步骤 (1)八数码游戏的规则 在八数码游戏中,计算机将1-8这8个数码随机排列放置在3×3的棋盘中,每个数码的编号不重复,留有一个空格。我们的任务是将这8个数码按照特定的顺序排列,就像我们在实验背景中所看到的那样。 在这个过程中,我们只能将数码与空格交换位置。每个交换算作一步,我们需要尝试找到能够将数码排列到正确结果的最短路径。 (2)实现搜索算法 在实现搜索算法时,我们可以使用广度优先搜索、深度优先搜索、A*搜索等。 广度优先搜索(BFS) 广度优先搜索是一种常见的搜索算法,其核心思想是从初始状态开始,遍历所有可能的解,直到找到目标状态或所有状态都被遍历完成。 使用BFS进行八数码游戏的解答,主要是将当前状态拓展到所有可能的新状态,并对新状态进行排序,选择最近的状态作为下一个解的步骤,直到找到目标状态为止。 深度优先搜索(DFS) 深度优先搜索与广度优先搜索相反,它从初始状态开始,选择任意一种可能的解,并尝试走到解的末端。如果这条路径没有解,则返回上一个节点,并继续寻找新的路径。 在深度优先搜索的过程中,我们将深度优先搜索作为一种递归函数来实现。 A*搜索 A*搜索算法是一种强大的启发式搜索算法。它以最短路径为目标,通过尝试最少的可能性,找到最短的路径,并完成任务。 在八数码游戏中使用A*算法,我们需要定义估价函数,并使用该函数对每个状态进行评估。通过评估函数值,我们可以选择最佳的下一个状态,并不断拓展搜索树,直到找到解决方案。 (3)实现启发式算法 在实现启发式算法时,我们需要定义估价函数,该函数将告诉我们当前节点到正确结果的距离,从而指导我们选择最佳的拓展方向。 这里我们使用曼哈顿距离作为估价函数。曼哈顿距离是一种常见的距离度量方式,它测量两点之间的距离,以沿x方向或y方向移动到目标为基础,而不是随意移动。 基于曼哈顿距离的估价函数参考代码如下: ```python def manhattan_distance(current_state): distance = 0 for i in range(3): for j in range(3): if current_state[i][j] != ' ': x, y = divmod(int(current_state[i][j]) - 1, 3) distance += abs(x - i) + abs(y - j) return distance ``` (4)对比搜索算法和启发式算法的性能 当实现了不同的算法后,我们需要进行性能测试,这将告诉我们每个算法的搜索效率、所需时间等等。 在我们的测试中,使用BFS、DFS和A*算法进行八数码解答。我们将记录每个算法搜索的节点数、动作数以及搜索时间,并比较它们的效率。 四、实验结果 在测试过程中,我们将随机生成100个初始状态,并分别使用BFS、DFS和A*算法进行解答。下面是实验结果统计表: | | BFS | DFS | A* | | --- | ----- | ----- | ----- | | 节点数 | 52685 | 515 | 7078 | | 动作数 | 28 | 2808 | 24 | | 时间 | 28ms | 1ms | 7ms | 、实验总结 通过本实验,我掌握了搜索算法和启发式算法的基本思想,并将它们运用到八数码游戏中,解决了这个问题。 实验过程中,我发现广度优先搜索和深度优先搜索效率最低,尽管广度优先搜索细腻地遍历每个可能性,但它的时间复杂度较高。深度优先搜索则容易陷入死胡同,在搜索树的某个分支中进行深度优先搜索时,当此分支结束时,我们将不得不返回搜索树的上一个节点,并在继续搜索未探索的分支之前重新考虑适当的拓展顺序。 启发式搜索算法不仅效率更高,而且最终结果质量也更好。我们可以通过评估函数将搜索方向限制在最优解的更高概率的方向上,并避免陷入无法解决的岔路口。虽然启发式算法效率更高,但通常需要计算节点的评估函数,这可能会增加算法的时间复杂度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

San.ferry.▣

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值