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

下载本文档

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

文档简介

第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.v

温馨提示

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

最新文档

评论

0/150

提交评论