人工智能基础实践教程 习题及答案汇 刘伟 第1-9章_第1页
人工智能基础实践教程 习题及答案汇 刘伟 第1-9章_第2页
人工智能基础实践教程 习题及答案汇 刘伟 第1-9章_第3页
人工智能基础实践教程 习题及答案汇 刘伟 第1-9章_第4页
人工智能基础实践教程 习题及答案汇 刘伟 第1-9章_第5页
已阅读5页,还剩118页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章习题随着研究的深入,人工智能的内涵不断发展,当我们说用机器模拟生物智能时,请分析机器具体包括哪些?生物智能包括哪些?答:人工智能是指用机器模拟生物智能。其中,机器是由人制造出来的,具体包括计算机,以及由计算机控制的软件、硬件或集成系统等;生物智能是人类和某些生物体特有的一种能力,包括生物个体感知环境,并进行判断、预测和行为决策,以及开展群体合作等能力。人工智能赋能学科研究在哪些学科领域获得了广泛应用?答:AIforScience在数学、物理学、生物医学、材料科学等领域取得了一系列突破。在基础研究中,人工智能通过分析海量文献与实验数据,能够自主提出科学假设并设计验证路径,推动科学发现从被动验证走向主动探索;在复杂系统研究中,人工智能融合多源多维数据构建数字孪生体,实现物理世界与虚拟空间的实时交互与动态优化。这场由人工智能驱动的科研范式变革,正推动科学研究从经验试错迈向智能引领,为破解重大科学难题、催生颠覆性创新开辟了全新路径。例如,在航天领域,AI能帮助火箭自动调整飞行路线;在电子和光电方面,它可以快速设计更小更快的芯片或新型传感器;对数学和物理而言,AI能从大量数据里发现人眼看不到的规律;在化学中,它甚至能预测分子结构,帮助科学家更快找到新药或新材料。人工智能实现的主要途径有哪些?答:从人工智能的演进过程,可以将人工智能的实现途径归纳为三种:一是设计的AI,二是学习的AI,三是进化的AI。设计的AI是通过“知识符号化”与“方法算法化”为机器赋能。经典算法包括状态空间图与通用图搜索、形式逻辑与推理、博弈树与极小极大搜索、语义网络与知识图谱等。人为机器赋能,有多少“人工”就有多少“智能”。学习的AI是通过“数据投喂-模型调优”的机器学习为机器赋能。人为机器事先准备好领域内的数据和设定预设结构和参数的模型,机器通过学习算法不断地优化模型。比如统计学习、神经网络与深度学习方法等。通过学习赋能,给什么数据就学什么知识,有多大规模的模型就有多大的能力边界。进化的AI是通过智能体与环境的交互自主持续学习为机器赋能。比如智能体、具身智能、强化学习、迁移学习、持续学习等。智能体在开放域通过主动探索生成数据,基于目标与奖惩不断优化感知、决策与行为。数字分身在虚拟环境中持续学习,虚实个体间的迁移学习、能力共享和交互迭代实现个体智能的不断进化。简述人工智能发展历程中的主要时期和代表性技术。答:按照研究热点的变换,人工智能从20世纪50年代至今主要经历了三个时期:20世纪50年代到60年代中后期的推理期,以符号推理为核心,代表性技术是基于符号表示的搜索和演绎推理;20世纪60年代后期到80年代中期的知识期,强调知识的作用,代表性技术是知识工程和专家系统;20世纪80年代后期至今的学习期,以数据驱动为特点,两大代表性技术是统计学习和基于人工神经网络的连接主义学习。人工智能三大学派的联系和区别是什么?答:人工智能的三大学派是符号主义、连接主义和行为主义。三大学派的区别在于:研究途径不同。符号主义用符号系统模拟人的思维过程和认知过程,核心是符号演算与机器推理;连接主义根据人脑的生理结构和工作机理来模拟人类智能,核心是人工神经网络与深度学习;行为主义认为智能取决于感知和行为,推崇控制、自适应与进化计算。擅长处理的问题不同。符号主义方法擅长处理符号演算和逻辑推理问题;连接主义方法更适合进行大规模、非结构化的感知信息处理;行为主义方法擅长处理反应式自动控制问题。三大学派的联系在于:(1)具有一定的互补性和兼容性。符号主义方法直接利用人类已有知识进行推理,可解释性好,但是过于依赖专家知识;而连接主义方法可以从数据自动发现知识,但是可解释性差,过于依赖数据。发挥符号主义与连接主义的各自优势,可以利用连接主义方法帮助进行自动知识提取,用于大规模知识图谱构建等,也可以用符号主义方法帮助进行深度学习模型的解释,通过加入语义约束提高网络对于数据噪声的敏感性。行为主义中基于Agent的研究方法与符号主义和连接主义有良好的兼容性,其从感知到行动的内部处理机制既可以使用符号主义方法,又可以使用连接主义方法。(2)可在实际人工智能系统中共同使用。在人工智能的一些最新应用技术和学科分支中,已经很难区分其所属学派,如机器学习就兼而使用了三大学派的思想方法。在具体应用场景中,可以综合运用各个学派的方法以获得更好的性能表现。例如,自动驾驶技术通常涉及模式识别、图像分割和运动控制,需要综合应用三大学派方法。1.6当前国际上性能领先的AI大模型是否已经通过图灵测试?答:1950年,艾伦·图灵(AlanTuring)发表了题为《Computingmachineryandintelligence》的论文,提出了著名实验“图灵测试”(Turingtest)。在测试者与被测试者(一个人和一台机器)隔开的情况下,通过一些装置(如键盘)向被测试者随意提问,在一段规定时间后(如5分钟)由测试者做出判断,与其对话的是人还是机器。经过多次测试,如果机器让测试者平均做出超过30%的误判,那么这台机器就通过了测试,并被认为具有智能。图灵测试提供了一个检验机器是否具有智能的可操作的标准。2025年4月3日,美国加州大学圣地亚哥分校提供了人工智能系统能够通过标准三方图灵测试的实证证据。该研究选择了四种AI系统:GPT-4.5、LLaMa-3.1-405B、GPT-4o和ELIZA。实验设计为每轮对话中,裁判与两个人类和一个AI系统进行对话,以判断何者为人类。其中,GPT-4.5被判断为人类的比例高达73%,显著高于真实人类参与者被选中的比例。1.7目前中美人工智能发展有没有明显差距?答:当前中美人工智能发展的差距已从“数年代差”缩小至“逐月竞争”。双方在技术路径和优势上各有所长,整体呈现美国强基础、中国强应用格局。中国优势体现在工程优化与商业落地。面对芯片限制,中国通过算法创新大幅降低成本,如DeepSeekV3训练费用不到600万美元,仅为美国的十分之一。同时,庞大的市场为AI提供了丰富应用场景,推动技术快速迭代。2026年初,中国大模型的周调用量已超越美国,且主要由美国开发者贡献。美国优势则在于基础研究与硬件底座。美国掌握全球约90%的高端AI芯片市场,算力基础设施规模超中国一到两个数量级。同时,Transformer等颠覆性基础创新均诞生于美国,其在顶尖人才和原始创新上仍具领先地位。1.8相比人类智能,现阶段人工智能有哪些局限性?答:人类智能的特点是:人类智能具有独有的逻辑和思考能力;人类智能的能力范围较广,经过一定时间的训练能掌握多种技能;人类智能可处理不确定的、偏主观的问题,在工作过程中可根据需要改变要实现的目标;可预测与之前完全不同的、预想不到的事态,具有想象力和创造性。人工智能需要明确的目标设定,其任务环境通常是已知的或可观测的,行动规则较为明确。人工智能从已有知识和规则出发进行推理,或者从数据中学习规律并建立预测模型,它无法预测从未出现的新情况,也难以创造出过去从未存在过的事物。因此,人工智能系统很难完成需要创造性思维、多方协调与快速响应能力的复杂任务。在鲁棒性、迁移性、能效比、自适应和可解释性方面,人工智能与人类智能相比还存在较大差距。第2章习题2.1请简述Python中for、while、if、def、return的用法。答:for:对序列、可迭代对象中的元素进行迭代(或者遍历可迭代对象,适合明确次数的循环);while:当表达式为真时重复执行(条件为真时循环,适合次数不确定);if:有条件地执行逻辑代码;def:定义函数;return:返回数据并结束函数。2.2请使用NumPy库创建一个5×5的随机整数矩阵,数值范围为1到100,然后计算该矩阵的行均值、列均值和整体均值。答:代码如下。importnumpyasnp#创建随机矩阵np.random.seed(42)matrix=np.random.randint(1,101,size=(5,5))print("原始矩阵:\n",matrix)#计算均值row_mean=np.mean(matrix,axis=1)col_mean=np.mean(matrix,axis=0)total_mean=np.mean(matrix)print("行均值:",row_mean)print("列均值:",col_mean)print("整体均值:",total_mean)运行结果如下原始矩阵:[[5293157261][2183877575][8810024322][532883038][264602133]]行均值:[58.668.247.442.236.]列均值:[43.268.454.840.245.8]整体均值:50.482.3请使用Pandas库读取scores.csv文件内数据(学生成绩表),并计算每个学生的总分和平均分。scores.csv文件内数据如下:姓名语文数学英语张三859278李四887695王五928885赵六788590答:示例代码如下。importpandasaspddf=pd.read_csv("scores.csv")df["总分"]=df["语文"]+df["数学"]+df["英语"]df["平均分"]=df["总分"]/3#输出:方式一拼接print(f"总分:\n{df['总分']}\n平均分:\n{df['平均分']}")

#或者:方式二直接输出print(df["总分"])

print(df["平均分"])运行结果:方式一:总分:0255125922653253Name:总分,dtype:int64平均分:085.000000186.333333288.333333384.333333Name:平均分,dtype:float64方式二:0255125922653253Name:总分,dtype:int64085.000000186.333333288.333333384.333333Name:平均分,dtype:float642.4请使用Matplotlib库绘制正弦函数y=sin(x)和余弦函数y=cos(x)在区间[0,2π]上的曲线。要求:使用不同颜色和线型,添加图例和标题,设置x轴和y轴标签。答:示例代码如下。importnumpyasnp

importmatplotlib.pyplotasplt

x=np.linspace(0,2*np.pi,100)

y_sin=np.sin(x)

y_cos=np.cos(x)

plt.plot(x,y_sin,'r-',label='sin(x)') #设置颜色为红色,实线

plt.plot(x,y_cos,'b--',label='cos(x)') #设置颜色为蓝色,虚线

plt.xlabel('x')#设置x轴标签

plt.ylabel('y')#设置y轴标签

plt.title('SineandCosineCurves')#设置标题

plt.legend()#设置为图例

plt.show()运行结果如下图所示。2.5请使用NumPy库中的函数对二维数组arr进行按行求和及按列求平均值。其中数组arr定义为arr=np.array([[1,2,3],[4,5,6],[7,8,9]])。答:示例代码如下。importnumpyasnparr=np.array([[1,2,3],[4,5,6],[7,8,9]])np.sum(arr,axis=0)#为按行求和方法np.mean(arr,axis=1)#为按列求平均值方法或者:importnumpyasnparr=np.array([[1,2,3],[4,5,6],[7,8,9]])arr.sum(0) #为按行求和方法arr.mean(1) #为按列求平均值方法2.6在Python中,对函数定义时有多种类型的参数可供使用,请简述位置参数、默认参数、关键字参数三者的区别。答:位置参数用于按顺序传递,必须一一对应;默认参数用于定义时赋初值,调用时可传可不传;关键字参数通过“参数名=值”传递,顺序可任意。2.7请简述Pandas库中loc函数和iloc函数的区别。答:loc按标签索引,使用行名/列名选取数据;iloc按位置索引,使用数字下标选取数据2.8请说明TensorFlow中的tf.keras.layers.Dense函数的作用是什么,以及函数中的activation参数有什么作用?答:Dense函数的作用是定义全连接层,每个神经元与上一层所有神经元相连;activation参数的作用是作为激活函数,引入非线性,让模型拟合复杂规律(如relu、sigmoid、softmax)。2.9请简述Pandas库中groupby函数的作用是什么?并写出至少三个此类常用聚合函数。答:groupby()函数的作用是:对数据对象按指定列分组,对分组后的数据进行统计计算。常用聚合函数包括sum()、mean()、count()、max()、min()、std()。2.10请简述Python中break、continue、pass语句的作用什么?答:break:立即结束当前循环,跳出整个循环体。continue:跳过本次循环剩余语句,直接进入下一次循环。pass:空语句,仅占位使用,不执行任何操作,保证语法完整。第3章习题3.1利用状态空间法表示现实世界问题的思路是什么?状态空间搜索的核心思想是什么?答:状态空间法通常采用五元组对现实世界进行表示,其中为状态集合,的每个元素表示一个状态;为操作算子的集合,利用操作算子可将一个状态转换为另一个状态;为问题的初始状态;为问题的目标状态;为路径的代价。状态空间搜索的核心思想是:将待求解问题抽象表示为一个状态空间,然后在此空间内进行搜索,目的是寻找从初始状态到目标状态的代价最小或较小的路径。问题的解对应图中从初始节点到目标节点的一条路径,求解算法即在图中寻找特定路径的搜索算法。3.2在状态空间图搜索中,对于已扩展和待扩展的节点是如何存储的?答:针对已扩展和待扩展的节点,分别设置Closed表和Open表对已知节点进行存储,其中Closed表存储已知且已扩展节点,Open表存储已知待扩展节点。3.3盲目搜索算法和启发式搜索算法的区别是什么?盲目搜索算法通常包含哪些类型?答:两类算法的区别在于是否使用待求解问题的启发信息。盲目搜索算法通常包括宽度优先搜索、深度优先搜索和代价优先搜索等。3.4请列举出宽度优先搜索、深度优先搜索和代价优先搜索算法的OPEN表所对应的数据结构。答:宽度优先搜索算法的OPEN表对应数据结构为队列,深度优先搜索算法的OPEN表对应数据结构为堆栈,代价优先搜索算法的OPEN表对应数据结构为优先级队列。3.5对于利用评估函数的搜索算法,该算法满足最优的条件是什么?为什么满足该条件时算法最优?答:当启发式满足可纳性,即对于所有的节点,启发函数时,搜索算法对应A*算法,即最佳图搜索算法。如果A*算法的启发函数是可纳的,且存在从初始节点S到目标节点G的路径,那么A*算法必定结束在最优解路径上。3.6对于某路径搜索问题的表示,已知pos中包含节点的x和y坐标,同时定义上、下、左、右四个移动方向。新扩展节点合法性判断函数为judge_valid_node(new_pos),新扩展节点可通行判断函数为judge_passable_node(new_pos),函数框架如下:defget_adjacent_nodes(pos):x,y=posmove_dir=[(-1,0),(1,0),(0,-1),(0,1)]#四连通移动方向adjacent_nodes=[]#已知当前位置坐标为x和y,四个方向运动的偏移量已给出。本函数输出为adjacent_nodes,请按照4连通原则补充该函数,注意判断新生成的节点是否有效。#请在下方补充代码returnadjacent_nodes答:示例代码如下。#节点扩展函数-四连通规则defget_adjacent_nodes(pos):x,y=posmove_dir=[(-1,0),(1,0),(0,-1),(0,1)]#上下左右四连通adjacent_nodes=[]#已知当前位置坐标为x和y,四个方向运动的偏移量已给出。本函数输出为adjacent_nodes,请按照4连通原则补充该函数,注意判断新生成的节点是否有效。#请在下方补充代码fordx,dyinmove_dir:new_pos=(x+dx,y+dy)ifjudge_valid_node(new_pos)andjudge_passable_node(new_pos):adjacent_nodes.append(new_pos)returnadjacent_nodes3.7在二维路径搜索问题中,设当前节点为pos,目标节点为goal,每个节点包含x,y坐标,请为该路径搜索问题定义两个启发式函数,并写出示例代码。答:可定义两个启发函数,分别为曼哈顿距离启发函数和欧式距离启发函数。#曼哈顿距离启发函数(四连通场景最优,满足可采纳性+一致性)defmanhattan_heuristic(pos,goal):x1,y1=posx2,y2=goalh_value=abs(x1-x2)+abs(y1-y2)returnh_value#欧氏距离启发式函数defeuclidean_heuristic(pos,goal):x1,y1=posx2,y2=goalh_value=((x1-x2)**2+(y1-y2)**2)**0.5returnh_value3.8利用状态空间搜索解决规划问题时,对于规划问题的启发式函数设计,可采用松弛问题的方式实现,松弛问题的常用思路有哪些?答:忽略动作的前置条件启发式、目标的最小覆盖集启发式和和忽略删除列表启发式。3.9利用规划图设计规划问题的启发式时,可以定义哪些类型的启发式?答:(1)最大层次启发式,该启发式的值对应于所有目标文字首次出现层次值中的最大值,是可纳的启发函数,但不精确。(2)层次和启发式,在遵循子目标独立性假设的情况下,该启发式为所有目标文字的层次代价之和,属于不可纳的启发函数。(3)集合层次启发式,寻找某个文字层,其中包含所有目标文字,且目标文字的任意两个都不互斥,则该层次的值对应于启发式的值。该启发函数是可纳的,且比最大层启发式更具信息。第4章习题4.1双方、动态、完美信息、确定性、零和的博弈问题具体是指什么?答:双方是指博弈由两方参与;动态是指在博弈中,参与者所采取策略是有先后顺序的,且参与者能够知道先采取策略者所选择的策略;完美信息博弈的每个参与者在做决策时都完全了解曾经和正在发生的对弈过程的所有信息;确定性是指在博弈过程中,参与双方在采取某种策略时,无其他非确定性因素的考虑;零和是指博弈双方收益之和为零。4.2棋局的评估函数的设计原则是什么?答:静态评估函数设计的基本原则是:当对MAX有利时,取正值,并且值越大表示对MAX越有利,当为时,表示MAX必胜;当对MAX不利时,取负值,并且绝对值越大表示对MAX越不利,当为时,表示MIN必胜;当双方势均力敌时,取为零。4.3请尝试说明为五子棋游戏设置静态评估函数的思路。答:第一步,建立评分体系,将棋盘上的棋子分布化为具体的数值。评分依据两个核心维度,即连子数和两端空位数。针对不同的连子数和两端空位数设计权重。具体示例如下:(5,2)-连五:100,000分。游戏胜利,给予绝对高分。(4,2)-活四:10,000分。两头皆空,下一步必成连五,等同于必胜。(4,1)-冲四:1,000分。只有一头空,对手必须防守,具有强进攻性。(3,2)-活三:500分。若对手不防守,下一手可变活四,威胁巨大。(2,X)-活二等:低分。属于布局阶段的积累。第二步,连子扫描。该步骤是评估逻辑的基础,对于给定的坐标(𝑥,𝑦)和方向(𝑑𝑥,𝑑𝑦)(如水平、垂直、对角),沿正负两个方向延伸扫描,进而统计属于当前玩家(player)的连续棋子数量,并检查连续棋子的两端是否为EMPTY(即是否被边界或对手堵死),最后返回一个元组(count,open_ends),用于在评分表中查找对应的分值。第三步,局面估计。首先计算某一特定位置对当前玩家的价值,汇总该点在水平、垂直、主对角线、副对角线四个方向上的棋型得分总和。然后进行全局评估,局势分=(黑棋总得分)-(白棋总得分)。结果为正,表示局面通过评分表判断对黑棋有利;结果为负,表示局面通过评分表判断对白棋有利。4.4为什么极小极大搜索算法的时间复杂度会随着搜索深度增加呈指数级增长?如何缓解这个问题?答:极小极大搜索需要遍历规定深度内的所有可能走步,若每个节点平均有b个分支(分支因子),博弈树深度为d,则节点总数约为bd,因此时间复杂度为O(bd),随深度增加呈指数增长。缓解方法包括:使用α-β剪枝剪掉不会影响最终决策的分支;使用启发式评估函数提前终止无望分支;使用迭代加深搜索结合时间控制;使用蒙特卡洛树搜索在巨大搜索空间中进行采样。4.5在α-β剪枝中,为什么节点的搜索顺序会影响剪枝效果?如何优化?答:α-β剪枝的效率高度依赖于子节点的访问顺序。如果先访问最优的子节点(即对MAX节点先访问估值高的子节点,对MIN节点先访问估值低的子节点),可以更早地更新α/β值,从而剪掉更多分支。典型的优化方法有:1)节点排序,使用启发式方法(如历史启发式、杀手启发式)对子节点进行排序;2)置换表,缓存已评估过的局面,避免重复搜索;3)迭代加深,浅层搜索获取节点顺序,用于深层搜索。4.6蒙特卡洛树搜索由哪四个步骤组成?简述每一步的作用。答:蒙特卡洛树搜索包括如下四个步骤:1)选择:从根节点开始,使用UCB公式评估子节点,反复选择最有潜力的节点,直到找到一个未完全展开的节点。2)扩展:为选中的节点添加一个未被访问过的新子节点,代表一个新的走法。3)模拟:从新节点出发,使用随机策略快速对弈至终局,得到胜负结果(此过程不记录在树中)。4)回溯:将模拟结果沿路径反向回传,更新所有祖先节点的访问次数和胜率统计。4.7采用α-β剪枝策略进行剪枝,在图中发生剪枝的分支处用“α剪枝”或“β剪枝”进行标记(标记在满足剪枝条件的α值对应节点和β值对应节点之间的连线上),注意:搜索过程中,同属一个父节点的多个子节点,优先扩展左侧子节点。答:4.8下图为井字棋的博弈搜索树,已知底层节点C、D、I的静态评估值f。1)使用极小极大搜索策略补全节点E、F、G、H的静态评估值,填入对应节点下方的括号内,注意:静态评估值计算公式为f(P)=(能使MAX成三子一线的行、列和对角线数)-(能使MIN成三子一线的行、列和对角线数),其中,P为棋局;2)使用α-β剪枝策略补全节点S的α值、节点A的倒推评估值以及节点B的β值,填入对应节点旁边的括号内;搜索过程中,同属一个父节点的多个子节点,优先扩展左侧子节点;3)对该博弈树进行剪枝,在图中标注,剪枝标在α和β比较并满足剪枝条件的分支上。答:4.9实现一个简化版的极小极大搜索算法,用于一个3×3的井字棋(Tic-Tac-Toe)。假设AI为MAX(棋子‘X’),玩家为MIN(棋子‘O’)。评估函数为:AI赢=1,玩家赢=-1,平局=0。搜索深度为2。要求实现evaluate(board)评估函数、minimax(board,depth,is_max)递归函数,输出当前最优走步及其评估值。答:以下是简化版井字棋极小极大搜索算法的完整实现。importcopydefevaluate(board):"""评估当前棋盘状态返回:1(AI赢),-1(玩家赢),0(其他)"""#检查所有行foriinrange(3):ifboard[i][0]==board[i][1]==board[i][2]!='':return1ifboard[i][0]=='X'else-1#检查所有列forjinrange(3):ifboard[0][j]==board[1][j]==board[2][j]!='':return1ifboard[0][j]=='X'else-1#检查主对角线ifboard[0][0]==board[1][1]==board[2][2]!='':return1ifboard[0][0]=='X'else-1#检查副对角线ifboard[0][2]==board[1][1]==board[2][0]!='':return1ifboard[0][2]=='X'else-1return0#未分胜负defis_full(board):"""检查棋盘是否已满"""foriinrange(3):forjinrange(3):ifboard[i][j]=='':returnFalsereturnTruedefprint_board(board):"""打印棋盘"""print("-------------")foriinrange(3):print("|",end="")forjinrange(3):print(board[i][j]ifboard[i][j]!=''else'',end="|")print("\n-------------")defminimax(board,depth,is_max):"""极小极大搜索算法board:当前棋盘depth:剩余搜索深度is_max:True表示MAX层(AI),False表示MIN层(玩家)"""score=evaluate(board)#如果已经分出胜负或平局,或达到搜索深度,返回评估值ifscore==1orscore==-1oris_full(board)ordepth==0:returnscoreifis_max:#MAX层-AI的回合,选择最大值best=-float('inf')foriinrange(3):forjinrange(3):ifboard[i][j]=='':board[i][j]='X'best=max(best,minimax(board,depth-1,False))board[i][j]=''returnbestelse:#MIN层-玩家的回合,选择最小值best=float('inf')foriinrange(3):forjinrange(3):ifboard[i][j]=='':board[i][j]='O'best=min(best,minimax(board,depth-1,True))board[i][j]=''returnbestdefget_best_move(board):"""获取AI的最佳走步返回:(最佳行,最佳列,最佳评估值)"""best_val=-float('inf')best_move=Noneprint("\n正在计算最佳走步...")foriinrange(3):forjinrange(3):ifboard[i][j]=='':#尝试在此位置落子board[i][j]='X'move_val=minimax(board,2,False)#搜索深度为2board[i][j]=''print(f"位置({i},{j})的评估值:{move_val}")ifmove_val>best_val:best_val=move_valbest_move=(i,j)returnbest_move[0],best_move[1],best_valdefmain():"""主函数-演示AI决策"""#初始化空棋盘board=[[''for_inrange(3)]for_inrange(3)]print("="*40)print("井字棋极小极大搜索算法演示")print("AI(X)vs玩家(O)")print("搜索深度:2")print("="*40)#演示1:空棋盘print("\n【场景1:空棋盘】")print_board(board)row,col,value=get_best_move(board)print(f"\n最佳走步:({row},{col})")print(f"评估值:{value}")print(f"解释:评估值{value}表示{'AI必胜'ifvalue==1else'可能平局'ifvalue==0else'不利'}")#演示2:特定局面-AI有获胜机会print("\n"+"="*40)print("\n【场景2:AI有获胜机会】")board2=[['X','X',''],['O','O',''],['','','']]print_board(board2)row,col,value=get_best_move(board2)print(f"\n最佳走步:({row},{col})")print(f"评估值:{value}")ifvalue==1:print("→AI可以直接获胜!")#演示3:需要防守的局面print("\n"+"="*40)print("\n【场景3:需要防守】")board3=[['O','O',''],['X','',''],['','','']]print_board(board3)row,col,value=get_best_move(board3)print(f"\n最佳走步:({row},{col})")print(f"评估值:{value}")ifvalue==-1:print("→如果不防守,玩家将获胜")if__name__=="__main__":main()运行结果如下:井字棋极小极大搜索算法演示AI(X)vs玩家(O)搜索深度:2========================================【场景1:空棋盘】-------------||||-------------||||-------------||||-------------正在计算最佳走步...位置(0,0)的评估值:0位置(0,1)的评估值:0位置(0,2)的评估值:0位置(1,0)的评估值:0位置(1,1)的评估值:0位置(1,2)的评估值:0位置(2,0)的评估值:0位置(2,1)的评估值:0位置(2,2)的评估值:0最佳走步:(0,0)评估值:0解释:评估值0表示可能平局========================================【场景2:AI有获胜机会】-------------|X|X||-------------|O|O||-------------||||-------------正在计算最佳走步...位置(0,2)的评估值:1位置(1,2)的评估值:0位置(2,0)的评估值:-1位置(2,1)的评估值:-1位置(2,2)的评估值:-1最佳走步:(0,2)评估值:1→AI可以直接获胜!========================================【场景3:需要防守】-------------|O|O||-------------|X|||-------------||||-------------正在计算最佳走步...位置(0,2)的评估值:0位置(1,1)的评估值:-1位置(1,2)的评估值:-1位置(2,0)的评估值:-1位置(2,1)的评估值:-1位置(2,2)的评估值:-1最佳走步:(0,2)评估值:0代码说明:1)evaluate(board):检查所有行、列、对角线,如果有三个相同棋子,返回1(AI赢)或-1(玩家赢),否则返回0。2)minimax(board,depth,is_max):递归终止条件:分出胜负、棋盘已满或深度为0MAX层:AI选择最大化评估值的走步MIN层:玩家选择最小化评估值的走步3)get_best_move(board):遍历所有空格,调用minimax评估每个位置的得分,返回最高分的走步。第5章习题5.1简述遗传算法的基本流程,并详细说明选择、交叉、变异三种核心操作的作用。答:遗传算法的基本流程如下:对待求解问题进行编码;随机生成初始种群;计算每个个体的适应度;依次执行选择、交叉、变异操作;判断是否满足终止条件;满足则输出最优个体,不满足则继续迭代。核心操作的作用:(1)选择。根据个体适应度大小筛选优良个体,适应度越高被保留的概率越大,引导种群整体向最优方向进化。(2)交叉。对两个父代个体交换部分基因片段,产生新的子代个体,扩大搜索空间,保留优良基因组合。(3)变异。随机改变个体部分基因,保持种群多样性,防止算法早熟收敛,避免陷入局部最优解。5.2简述蚁群算法的基本原理,并说明信息素与信息素挥发的作用。答:蚁群算法基本原理为模拟蚂蚁觅食行为:蚂蚁在移动路径上释放信息素,路径越短,单位时间内信息素残留浓度越高,会吸引更多蚂蚁选择该路径,形成正反馈机制。经过多次迭代,最短路径被不断强化,最终所有蚂蚁趋于选择最短路径。基本过程包括:(1)初始化信息素浓度和蚂蚁参数;(2)蚂蚁行走。将所有蚂蚁分配到初始节点,每只蚂蚁依据信息素浓度以一定概率访问下一个节点,直到所有蚂蚁到达目标节点。(3)记录当前最优解,信息素更新。(4)若迭代次数达到最大值或解稳定不变,则成功退出,否则返回第2步。信息素的作用是实现蚂蚁之间的间接通信,记录历史最优路径,引导群体快速收敛。信息素挥发的作用是避免历史路径信息素无限累积,防止算法早熟收敛,保留对新路径的探索能力。5.3蚁群算法中信息素挥发系数的作用是什么?过大或过小分别会导致什么问题?答:信息素挥发系数,作用是控制历史信息素的保留程度,平衡历史路径经验与新路径探索。信息素更新公式为。如果过大,那么信息素衰减过快,历史路径经验被快速遗忘,算法难以收敛,搜索过程不稳定;如果过小,那么历史信息素残留过多,算法快速陷入局部最优,失去探索新路径的能力,易出现早熟收敛。5.4简述粒子群优化算法(PSO)的基本原理,并解释速度更新公式中三项的物理意义。答:粒子群算法基本原理是:模拟鸟群觅食行为,每个粒子代表问题的一个解,粒子在搜索空间中运动,通过追随自身历史最优位置和全局最优位置不断更新速度与位置,最终收敛到全局最优解。速度与位置更新公式为其中,惯性项保留粒子上一代的运动趋势,平衡全局探索与局部开发;认知项为粒子向自身历史最优位置学习,体现个体经验;社会项体现粒子向全局最优位置学习,体现群体协作。5.5粒子群算法中惯性权重的作用是什么?常用的设置策略是什么?答:惯性权重用于控制粒子保留上一代速度的比例,平衡算法的全局探索与局部开发能力。越大,全局搜索能力越强,收敛越慢;越小,局部搜索能力越强,收敛越快,但易陷入局部最优。常用设置策略是线性递减策略,即从较大值线性下降到较小的值,前期使用较大保证全局搜索,后期使用较小进行精细局部寻优。5.6简述模拟退火算法的基本思想和核心流程,并详细说明Metropolis准则的作用与物理意义。答:模拟退火算法的基本思想是:模拟固体材料的退火过程,先将固体加热至高温使其粒子充分无序,再缓慢降温,粒子逐渐趋于能量最低的稳定状态。算法在迭代中以一定概率接受比当前解更差的解,避免陷入局部最优,最终收敛到全局最优解。核心流程如下。(1)初始化:设置充分大的初始温度、初始解、每个温度下的迭代次数;(2)温度内迭代:对,执行局部调整产生新解、计算能量增量、按Metropolis准则判断是否接受新解;(3)降温:按照降温系数缓慢降低温度,使温度逐渐趋近于0;(4)终止:当温度低于终止阈值或达到最大迭代次数时,停止迭代,输出当前最优解。Metropolis准则核心思想是:在给定温度下,通过概率判断是否接受一个比当前解更差的解。如果新解对应更低的能量,则它将被接受;如果新解对应更高的能量,则它有一定概率被接受,以避免算法陷入局部最优解。该准则允许算法在高温下接受较差解,从而有利于跳出局部最优;低温下仅接受优良解,保证算法稳定收敛。其物理意义对应热力学中粒子在温度下达到热平衡的接受概率,是模拟退火算法中用于接受新解的重要机制。5.7利用蚁群算法编程求解旅行商问题,29个城市的坐标如本章中的表5.2所示。答:蚁群算法求解TSP的基本思路包括:1)初始化:信息素和启发式信息的初始化,以及蚂蚁的初始放置;2)蚂蚁行走:每只蚂蚁按照特定的规则选择下一个城市,并更新路径上的信息素;3)信息素更新:蚂蚁行走后,根据路径长度更新信息素的浓度;4)最优路径更新:记录全局最优路径,并根据信息素浓度调整策略;5)终止条件:达到预设的迭代次数或满足特定条件时结束搜索,返回最优路径。Python参考例程如下。"""题目:基于蚁群算法的TSP"""importnumpyasnpimportmatplotlib.pyplotaspltimporttimeplt.rcParams['font.sans-serif']=['MicrosoftYaHei']plt.rcParams['axes.unicode_minus']=False#初始城市位置的散点图defGetDistanceMatrix(X,Y,CityCount):plt.figure(1)plt.plot(X,Y,'ro')plt.xlabel("横坐标")plt.ylabel("纵坐标")plt.title("城市分布散点图")#在每个点上标注编号和坐标foriinrange(CityCount):plt.text(X[i]+5,Y[i]+5,f'{i}({X[i]},{Y[i]})',fontsize=8)#生成一个方阵作为任意两城市之间的距离矩阵DistanceMatrix=np.zeros((CityCount,CityCount))forrowinrange(CityCount):forcolinrange(CityCount):DistanceMatrix[row,col]=((X[row]-X[col])**2+(Y[row]-Y[col])**2)**0.5returnDistanceMatrix#算法实现defACO_TSP(X,Y):#根据城市个数生成城市距离矩阵DistanceMatrix=GetDistanceMatrix(X,Y,CityCount)start=time.time()#根据蚂蚁的数量为每一只蚂蚁随机分配初始城市AntPlaceVector=np.random.randint(0,CityCount,(1,AntCount))#接着生成初始信息素矩阵#首先随机生成一条周游路线以初始化每条边上的信息素RandomRoute=np.random.permutation(np.arange(CityCount))TempLength=0foriinrange(CityCount-1):TempLength+=DistanceMatrix[RandomRoute[i],RandomRoute[i+1]]TempLength+=DistanceMatrix[RandomRoute[0],RandomRoute[CityCount-1]]PheromoneMatrix=np.full((CityCount,CityCount),1/TempLength)#对角线上的元素初始化为零foriinrange(CityCount):PheromoneMatrix[i,i]=0global_best=float('inf')global_best_route=Noneglobal_history=np.zeros(MaxIteration)foriterationinrange(MaxIteration):print("迭代次数:%s"%(iteration+1))#创建一个禁忌表,用双重列表的形式进行定义TabooList=[]#首先定义禁忌表中的每一个元素都是一个列表,表示某一只蚂蚁的禁忌表foriinrange(AntCount):TabooList.append([])foriinrange(AntCount):TabooList[i].append(AntPlaceVector[0,i])#首先求出每一轮迭代中每一只蚂蚁进行下一目的地选择的概率向量foriinrange(CityCount-1):forantinrange(AntCount):ProbilityVector=np.zeros((1,CityCount))forcityinrange(CityCount):ifcityinTabooList[ant]:continuecurrent=TabooList[ant][-1]TempPheromone=PheromoneMatrix[current,city]TempNegDistance=1/DistanceMatrix[current,city]ProbilityVector[0,city]=(TempPheromone**Alpha)*(TempNegDistance**Beta)Pro_Sum=np.sum(ProbilityVector)#ifPro_Sum<=0:#available=[cforcinrange(CityCount)ifcnotinTabooList[ant]]#ProbilityVector=np.zeros((1,CityCount))#ProbilityVector[0,available]=1/len(available)#else:#ProbilityVector=ProbilityVector/Pro_SumifPro_Sum==0:Pro_Sum=1e-10ProbilityVector=ProbilityVector/Pro_Sum#求出概率向量后使用逐次轮盘法进行抽签得到每只蚂蚁下一次所到达的城市Next_City=np.random.choice(CityCount,p=ProbilityVector[0,:])TabooList[ant].append(Next_City)#至此已经得到了某一轮迭代中每一只蚂蚁的行进路线,用一个列表表示,接下来分别计算每只蚂蚁的周游路线的长度RouteLengths=[]forantinrange(AntCount):TempRouteLength=0foriinrange(CityCount-1):TempRouteLength+=DistanceMatrix[TabooList[ant][i],TabooList[ant][i+1]]TempRouteLength+=DistanceMatrix[TabooList[ant][0],TabooList[ant][-1]]RouteLengths.append(TempRouteLength)#记录此时的局部最优解best_idx=RouteLengths.index(min(RouteLengths))BestRoute=TabooList[best_idx]current_best=min(RouteLengths)RouteRecordMin[0,iteration]=current_bestRouteRecordMax[0,iteration]=max(RouteLengths)RouteRecordAve[0,iteration]=np.mean(RouteLengths)#更新全局最优ifcurrent_best<global_best:global_best=current_bestglobal_best_route=BestRoute.copy()#记录到收敛曲线global_history[iteration]=global_best#更新信息素矩阵New_PheromoneMatrix=np.zeros((CityCount,CityCount))forrowinrange(CityCount):forcolinrange(CityCount):ifrow==col:continuenew_info=0#如果某只蚂蚁经过了该条路径,则会增加该路径上的信息素forantinrange(AntCount):path=TabooList[ant]foriinrange(CityCount-1):a,b=path[i],path[i+1]if(a==rowandb==col)or(a==colandb==row):new_info+=Q/RouteLengths[ant]a,b=path[-1],path[0]if(a==rowandb==col)or(a==colandb==row):new_info+=Q/RouteLengths[ant]New_PheromoneMatrix[row,col]=(1-VolatilizationRate)*PheromoneMatrix[row,col]+new_infoPheromoneMatrix=New_PheromoneMatrixend=time.time()Time_Gap=end-start#迭代完成后最优环游路线的示意图BestRoute=global_best_routestart_city=BestRoute[0]end_city=BestRoute[-1]x_route=[X[i]foriinBestRoute]+[X[start_city]]y_route=[Y[i]foriinBestRoute]+[Y[start_city]]plt.figure(3,figsize=(10,7))plt.plot(x_route,y_route,'r-',linewidth=2)#普通城市:蓝foriinrange(CityCount):ifi!=start_cityandi!=end_city:plt.plot(X[i],Y[i],'bo',markersize=10)#起点:红plt.plot(X[start_city],Y[start_city],'ro',markersize=12,label='起点')#终点:绿plt.plot(X[end_city],Y[end_city],'go',markersize=12,label='终点')#标注编号+坐标foriinrange(CityCount):plt.text(X[i]+5,Y[i]+5,f'{i}({X[i]},{Y[i]})',fontsize=8,color='blue')plt.title("蚁群算法TSP最优路径图",fontsize=14)#绘制最短路径收敛曲线plt.figure(4,figsize=(10,5))iter_range=np.arange(MaxIteration)plt.plot(iter_range,global_history,'b-',linewidth=2,label='最短路径长度')plt.xlabel("迭代次数",fontsize=12)plt.ylabel("最短路径长度",fontsize=12)plt.title("蚁群算法TSP最短路径长度收敛曲线",fontsize=14)plt.grid(True,linestyle='--',alpha=0.7)plt.legend()plt.show()print("算法运行时间:",Time_Gap,"秒")#print("本次迭代最短路径长度:",RouteRecordMin[0,-1])#print("本次迭代最长路径长度:",RouteRecordMax[0,-1])#print("本次迭代平均路径长度:",RouteRecordAve[0,-1])print("最短路径顺序:",BestRoute)print("最短路径长度:",global_best)defread_tsp_data(filename):withopen(filename,'r')asf:lines=f.readlines()n=int(lines[0])cities=[]foriinrange(1,n+1):x,y=map(int,lines[i].split())cities.append((x,y))returncitiesif__name__=='__main__':#读取城市坐标数据cities=read_tsp_data('city.txt')CityCount=len(cities)City_X,City_Y=zip(*cities)#转为列表,防止索引报错City_X=list(City_X)City_Y=list(City_Y)AntCount=50#定义蚂蚁数量MaxIteration=200#定义最大迭代次数Alpha=1#定义信息素因子Beta=10#定义启发函数因子Q=2#定义算法信息素常数VolatilizationRate=0.3#定义算法中的挥发率np.random.seed(2)#固定随机数种子,方便多次进行验证RouteRecordMin=np.zeros((1,MaxIteration))#用于记录每一次迭代中的局部最优解RouteRecordMax=np.zeros((1,MaxIteration))#用于记录每一次迭代中的最长回路长度RouteRecordAve=np.zeros((1,MaxIteration))#用于记录每一次迭代中的蚂蚁周游的平均路径长度BestRoute=[]#用于记录最优环游路线中城市的经过顺序#执行蚁群算法,绘制最优路径图ACO_TSP(City_X,City_Y)TSP问题城市分布散点图、经200次迭代后的最短路径图以及最短路径长度收敛曲线如下所示,其中红色表示起点城市,绿色表示最后一个城市。最短路径为[13,17,14,3,9,19,1,20,4,25,28,2,8,5,11,27,0,23,7,22,15,12,18,24,6,26,10,21,16],路径长度为9804.17。5.8利用粒子群算法编程求解四维Rosenbrock函数的优化问题。答:算法流程如下:步骤1:初始化粒子群体参数,包括粒子数量、随机位置和速度、最大迭代次数、阈值、惯性权重、个体学习因子和全局因子等;步骤2:根据适应度评估函数(四维Rosenbrock函数),评价每个粒子的适应度;步骤3:对每个粒子,将其当前适应值与其个体历史最佳位置(pbest)对应的适应值做比较,如果当前的适应值更高,则将用当前位置更新历史最佳位置pbest;步骤4:对每个粒子,将其当前适应值与全局最佳位置(gbest)对应的适应值做比较,如果当前的适应值更高,则将用当前粒子的位置更新全局最佳位置gbest;步骤5:更新每个粒子的速度与位置;步骤6:如未满足结束条件,则返回步骤2。通常算法达到最大迭代次数或者最佳适应度值的增量小于某个给定的阈值时算法停止。Python参考例程如下。importnumpyasnpimportmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=['MicrosoftYaHei']plt.rcParams['axes.unicode_minus']=False#4维Rosenbrock函数(理论最优:0,位置[1,1,1,1])defrosenbrock(x):returnnp.sum(100.0*(x[1:]-x[:-1]**2)**2+(1-x[:-1])**2)#=====================粒子群优化算法PSO=====================classPSO:def__init__(self,dim=4,pop_size=30,max_iter=1000,x_bound=30,v_bound=10,tol=1e-6):self.w=0.73#惯性权重self.c1=1.49#个体学习因子self.c2=1.49#全局学习因子self.dim=dim#维度=4self.pop_size=pop_sizeself.max_iter=max_iterself.x_bound=x_bound#位置范围self.v_bound=v_bound#速度范围self.tol=tol#停止精度np.random.seed(30)#固定随机数种子,方便多次进行验证#初始化粒子群self.x=np.random.uniform(-x_bound,x_bound,(pop_size,dim))self.v=np.random.uniform(-v_bound,v_bound,(pop_size,dim))#个体最优self.pbest_x=self.x.copy()self.pbest_val=np.array([rosenbrock(xi)forxiinself.x])#全局最优self.gbest_val=np.min(self.pbest_val)self.gbest_x=self.pbest_x[np.argmin(self.pbest_val)].copy()#收敛曲线self.history=[]defrun(self):print("PSO求解4维Rosenbrock函数")foriterinrange(self.max_iter):r1=np.random.rand(self.pop_size,self.dim)r2=np.random.rand(self.pop_size,self.dim)#更新速度self.v=self.w*self.v+self.c1*r1*(self.pbest_x-self.x)+self.c2*r2*(self.gbest_x-self.x)self.v=np.clip(self.v,-self.v_bound,self.v_bound)#更新位置self.x=self.x+self.vself

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论