《智能系统 实验核心代码汇总 电子 第2--10章.docx》由会员分享,可在线阅读,更多相关《智能系统 实验核心代码汇总 电子 第2--10章.docx(25页珍藏版)》请在第一文库网上搜索。
1、第2章实验代码1、主程序numpynpmatp1ot1ib.pyp1otpitrun():1、输入节点个数N2、node_factory(N):生成N个节点的列表3、c1assify(nodes,f1ag,k=10):进行k轮簇分类,f1ag已标记的节点不再成为簇头,返回所有簇的列表4、show_p1t(C1aSSes):迭代每次聚类结果,显示连线图:return:N=IOO#N=int(input(”请输入节点个数:“)机获取初始节点列表,选择标志列表nodes/f1agnode_factory(N)书对节点列表进行簇分类,k为迭代轮数iter_c1assesc1assify(nodes,f
2、1ag,k=10)c1assesiter_c1asses:#显示分类结果show_p1t(c1asses)2、判断距离函数#判断距离函数dist(V_A,v_B):V1IVM判断两个节点之间的一维距离:paramv_A:A二维向量:paramv_B:B二维向量:return:-维距离V1IVVBnp.sqrt(np.power(vA0-v_B0),2)np.power(vA1-v_B1)2)3、生成随机节点集node_factory(N):生成N个节点的集合:paramN:节点的数目:paramnodes:节点的集合:Paramse1ected-f1ag:标志:是否被选择为簇首-初始化为0:r
3、eturn:节点集合nodes=x,yx,y.+标志fa1gnodesse1ected_f1agirange(OzN):# 在1*1矩阵生成x,y坐标nodenp.random.random(),np.random.random()# Print(生成的节点为:node)nodes.append(node)# 对应的选择标志初始化为0se1ected_f1ag.append(0)# Print(生成:,Ien(nodes),个节点”)# print(初始化标志列表为,se1ected_f1ag)nodeszSeIeCted_f1ag4、根据1EACH算法选择簇头节点se1_heads(r,no
4、des,f1ags):# 1IfV1根据阈值选取簇头节点:paramr:轮数:paramnodes:节点歹U表:paramf1ags:选择标志:paramP:比例因子:return:簇头歹IJ表heads,簇成员歹IJ表membersf1HV1# 阈值函数Tn使用IeaCh计算P0.05*(100/Ien(nodes)TnP/(1-P*(r(1/P)# Print(“阈值为:,Tn)# 簇头列表heads# 簇成员列表members# 本轮簇头数n_head=0# 对每个节点生成对应的随机数randsnp.random.random()_range(1en(nodes)# Print(随机数为
5、:rands)# 遍历随机数列表,选取簇头irange(1en(nodes):#若此节点未被选择为簇头f1agsi0:#随机数低于阈值一选为簇头randsi:Tn:f1agsi=1heads.append(nodesi)n_head+=1#print(nodesi,被选为第,n_headz个簇头)#随机数高于阈值e1se:members.append(nodesi)#若此节点已经被选择过members.append(nodesi)Print(“簇头为:“,Ien(heads)z“个“)Print(簇成员为:Ien(members)z个)heads,members5、节点分簇算法.c1assif
6、y(nodes,f1ag,k1):# 1IfVV进行簇分类:paramnodes:节点歹J表:paramf1ag:节点标记:paramk:轮数:return:簇分类结果列表c1asses类1.,类2.类1.簇头.簇成员# 1I1f1# k轮的集合iter_c1asses# 迭代r轮forrrange(k):# 获取簇头列表,簇成员列表heads,membersse1_heads(rnodes,f1ag)# 建立簇类的列表c1asses()_range(1en(heads)# 将簇头作为头节点添加到聚类列表中irange(1en(heads):# print(zi+1,个簇头为,headsi)c
7、1asses(i.append(headsi)# Print(簇头集合:c1asses)# 簇分类:遍历节点nodenrange(1en(members):#选取距离最小的节点dist_min1irange(1en(heads):dist_headsdist(membersnzheadsi)#找到距离最小的簇头对应的heads下标idist_heads簇头,成员,成员.:return:V1ItVVfigpit.figure()ax1pit.gca()# 设置标题ax1.set_tit1e(,WSN1)# 设置X轴标签pit.x1abe1(,X,)# 设置Y轴标签p1t.y1abe1(,Y,)i
8、con,o,z,*z,.,x,z,+,r,s,co1or,r,b,z,g,z,c,y,zm#对每个簇分类列表进行showirange(1en(c1asses):centorc1assesi0pointc1asses(i):ax1.p1ot(centor0,point0,centor1,point1,co1ori6,marker=iconi5,a1pha-0.4)#显示所画的图pit.show()第3章实验核心代码用遗传算法求解函数的最大值:y=10*sin(5x)+7*cos(4x)步骤如下:1 .初始化种群,我们采用十位二进制进行编码代表X的值,产生n个个体,代码如下:importrando
9、mdefgeneEncoding(pop_size,ChromJength):pop=foriinrange(pop_size):temp=forjinrange(chrom_1ength):temp.append(random.randint(0,1)pop.apend(temp)returnpop1:2 .对染色体解码,也就是二进制转化为十进制,并计算适应度,在这个问题中也就是函数值的大小,代码如下:importmathdefdecodechrom(pop,ChromJength):temp=foriinrange(1en(pop):t=0forjinrange(chromjength):
10、t+=popij*(math.pow(2J)temp.append(t)returntempdefca1objVa1ue(pop,chrom_1ength,max_va1ue):tempi=obj_va1ue=tempi=decodechrom(pop,chrom_1ength)foriinrange(1en(temp1):x=tempii*max_va1ue/(math.pow(2,chrom_1ength)-1)obj_va1ue.append(10*math.sin(5*x)+7*math.cos(4*x)returnobj_va1ue3 .对于值为负数的个体进行淘汰,代码如下:defc
11、a1fitVa1ue(obj_va1ue):fit_va1ue=c_min=0foriinrange(1en(obj_va1ue):if(obj_va1uei+c_min0):temp=c_min+obj_va1ueie1se:temp=0.0fit_va1ue.append(temp)returnfit_va1ue4 .找出当前种群的最优解,也就是最大值,保存在IiSt中,代码如下:defbest(pop,fit_va1ue):px=1en(pop)best_individua1=best_fit=fit_va1ue0foriinrange(1,px):if(fit_va1ueibest_f
12、it):best_fit=fit_va1ue1ibest_individua1=popireturnIbestJndividua1,best_fit5 .计算每个个体被选中的概率,这里就是用个体的函数朱除以总群全体值得到,然后利用轮盘法进行选择,代码如下:importrandomdefsum(fit_va1ue):tota1=0foriinrange(1en(fit_va1ue):tota1+=fit_va1ueireturntota1defcumsum(fit_va1ue):foriinrange(1en(fit_va1ue)-2,-1,-1):t=0j=whi1e(j=i):t+=fit_
13、va1ue|jj=1fit_va1uei=tfit_va1ue1en(fit_va1ue)-1=1defse1ection(pop,fit_va1ue):newfit_va1ue=tota1_fit=sum(fit_va1ue)foriinrange(1en(fit_va1ue):newfit_va1ue.append(fit_va1uei/tota1_fit)cumsum(newfit_va1ue)ms=pop_1en=1en(po)foriinrange(pop_1en):ms.append(random.random()ms.sort()fitin=0newin=Onewpop=pop#转轮盘选择法whi1enewinpop_1en:if(msnewinnewfit_va1uefitin):newpopnewin=popfitinnewin=newin+1e1se:fitin=fitin+1pop=newpop6 .进行交叉和变异操作,代码如下:importrandomdefcrossover(pop,pc):