广州大学学生实验报告开课学院及实验室:计算机科学与工程实验室2022年11月8日学院计算机科学与网络工程学院年级/专业/班姓名学号实验课程名称人工智能导论实验成绩实验项目名称实验TSP问题的遗传算法实现指导老师实验内容问题描述:旅行商问题,即TSP问题又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。内容提要:以N个节点的TSP问题为例,应用遗传算法并用选定的编程语言,设计简单的遗传优化系统对问题进行求解,求出问题的最优解,通过实验培养学生利用遗传算法进行问题求解的基本技能。实验设备实验设备:计算机;平台:Windows操作系统,VisualC++0/PythonAnaconda实验步骤随机生成N个二维坐标节点。应用遗传算法并用选定的编程语言,设计简单的遗传优化系统对问题进行求解,求出问题的最优解。选择适当可视化方法显示结果。分析适应度函数对启发式搜索算法的影响。*扩展选做题:考虑不同数值N对最终结果和求解性能的影响。对于比较大的N,是否设计更快速的近似方法代替原有算法。分析说明程序包含两个界面,一个是参数输入界面,一个是路线及适应度曲线展示界面。首先输入各参数信息,程序随机初始化城市坐标。参数输入界面root=Tkroot.titleroot.geometryLabel.placecity_量化接口,num_text=Entrycity_量化接口,num_text.insertcity_num_text.placeLabel.placeinpidual_num_text=Entryinpidual_num_text.insertinpidual_num_text.placeLabel.placegen_num_text=Entrygen_num_text.insertgen_num_text.placeLabel.placecross_prob_text=Entrycross_prob_text.insertcross_prob_text.placeLabel.placemutate_prob_text=Entrymutate_prob_text.insertmutate_prob_text.placeButton.placeroot.mainloop城市坐标结果像和适应度曲线实时刷新,当前路径在路线下方展示,当前适应度在适应度曲线下方展示。定义参数city_num=5#城市数量inpidual_num=20#种群中个体数量generation_num=20#迭代轮数cross_prob=0.9#交叉概率mutate_prob=0.25#变异概率返回城市间距离的矩阵提前将每两个城市之间距离计算至一个list中,方便后续适应度的计算。defcau_city_dist:n=city_numout_list=np.zerosforiinrange:forjinrange:x=in_list[i,:]-in_list[j,:]out_list[i,j]=np.dotout_list[j,i]=out_list[i,j]returnout_listgo函数通过GA类的构造函数将城市坐标矩阵,城市间距离矩阵,各参数传到work2py中,从而开始进行遗传算法的运行。defgo:city_list=np.random.randcity_dist=cau_city_distprintprintga=GAresult_list,fitness_list=ga.trainresult=result_list[-1]result_pos_list=city_list[result,:]get_data函数通过此函数接受文本框的输入的各参数值,并调用go函数。defget_data:globalcity_num,inpidual_num,generation_num,cross_prob,mutate_probcity_num=int)inpidual_num=int)generation_num=int)cross_prob=float)mutate_prob=float)goroot.quit个体类构造函数个体类构造函数中包含了个体的编码方式。如果基因为空,则初始化一个..city_num的基因,然后打乱,代表访问序列。classInpidual:def__init__:ifgenesisNone:genes=[iforiinrange]random.shuffleself.genes=genesself.fitness=self.get_fitness计算适应度函数产生个体的时候,在构造函数里会调用此函数进行适应度的计算。适应度是通过编码的城市序列和城市间距离矩阵,将相邻序列的距离相加作为个体适度。defget_fitness:fitness=0.0foriinrange:x=self.genes[i]y=self.genes[i+1]fitness+=city_dist[x,y]fitness+=city_dist[self.genes[0],self.genes[-1]]returnfitness算法类构造函数def__init__:globalgene_len,inpidual_num,generation_num,mutate_probgene_len=ainpidual_num=bgeneration_num=ccross_prob=dmutate_prob=eglobalcity_distglobalcity_listcity_list=input_city_listcity_dist=input_city_distself.best=None#每一代中最佳个体self.inpidual_list=[]#每一代的个体类列表self.result_list=[]#每一代对应的解最佳个体基因self.fitness_list=[]#每一代对应的适应度交叉运算因为TSP中要求城市只能访问一次,故采取如下的交叉策略:随机选择种群中的两个个体,再随机选择两个体相同下标的序列片段,通过逐点进行交换。defcross:new_generation=[]random.shuffleforiinrange:genes1=copy_list#父基因genes2=copy_list#母基因index1=random.randintindex2=random.randint#选取的基因片段pos1_recorder={value:idxforidx,valueinenumerate}pos2_recorder={value:idxforidx,valueinenumerate}#交叉操作forjinrange:value1,value2=genes1[j],genes2[j]pos1,pos2=pos1_recorder[value2],pos2_recorder[value1]genes1[j],genes1[pos1]=genes1[pos1],genes1[j]genes2[j],genes2[pos2]=genes2[pos2],genes2[j]pos1_recorder[value1],pos1_recorder[value2]=pos1,jpos2_recorder[value1],pos2_recorder[value2]=j,pos2new_generation.append)new_generation.append)returnnew_generation变异运算产生一个0到1之间的随机数,若小于变异概率则进行变异操作。选取个体中一段基因,进行翻转操作,比如选取片段为23则变为43defmutate:forinpidualinnew_generation:ifrandom.random 文章为作者独立观点,不代表 股票程序化软件自动交易接口观点