神经网络(三) 用Hopfield 网络求解TSP问题
来源:互联网 发布:中性笔成分知乎 编辑:程序博客网 时间:2024/05/29 09:14
# -*- coding: utf-8 -*-"""Created on Wed Nov 9 17:07:49 2016This file is using the Hopfield Nerual Network to solve the TSP problem@author: Hansyang"""import numpy as npimport matplotlib.pyplot as pltdef Distance(Data): N=len(Data) Dis=np.zeros([N,N]) for i in range(N): for j in range(N): Dis[i,j]=np.sqrt((Data[i,0]-Data[j,0])**2+(Data[i,1]-Data[j,1])**2) return Disdef delta(i,j): if i==j: return 1 else: return 0def CalcuW(A,B,C,D,Dis): N=len(Dis) W=np.zeros([N,N,N,N]); for x in range(N): for i in range(N): for y in range(N): for j in range(N): #W[x,i,y,j]=-A*delta(x,y)*(1-delta(i,j))-D*Dis[x,y]*delta(j,x+1) W[x,i,y,j]=-A*delta(x,y)*(1-delta(i,j))-B*delta(i,j)*(1-delta(x,y))-C-D*Dis[x,y]*(delta(j,i+1)+delta(j,i-1)) return Wdef CalcuDeltaU(U,V,A,B,C,D,dis): N=len(V) deltaU=np.zeros([N,N]) for x in range(N): for i in range(N): t1=0 for j in range(N): if j!=i: t1+=V[x,j] t1=A*t1 t2=0 for y in range(N): if y!=x: t2+=V[y,i] #t2 += V[x, y] t2=B*t2 ''' t3=0 for j in range(N): for y in range(N): t3+=V[j,y] t3=t3-N t3=C*t3 ''' t3 = 0 for j in range(N): t3+=V[x,j] for y in range(N): t3 += V[y, i] t3 = t3 - 2*N t3 = C * t3 t4=0 for y in range(N): if y!=x: i1=i+1 i2=i-1 if i1==N: i1=0 if i2==-1: i2=N-1 t4+=dis[x,y]*(V[y,i1]+V[y,i2]) t4=D*t4 deltaU[x,i]=-t1-t2-t3-t4#-U[x,i] return deltaUdef tanh(x): #print(x) if x>5: return 0.99995 if x<-5: return -0.99995 res=(np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x)) return resdef CalcuV(U,U0): N=len(U) V=np.zeros([N,N]) for x in range(N): for i in range(N): #print(U[x,i]) V[x,i]=0.5*(1+tanh(U[x,i]/U0)) if np.isnan(V[x,i]): #print(x,i) #print(U) break return Vdef CalcuU(U,deltaU,step): for x in range(N): for i in range(N): U[x,i]+=deltaU[x,i]*step return Udef CacuEnergy( V,Dis,A,B,C,D,N): V=np.matrix(V) t1 = np.sum(np.power(np.sum(V, 1) - 1,2)) t2 = np.sum(np.power(np.sum(V, 0) - 1,2)) idx = [i for i in range(1, N)] idx = idx + [0] Vt = V[:, idx] t3 = Dis* Vt t3=np.sum(np.sum(np.multiply(V,t3))) E=0.5*(A*t1+B*t2+D*t3) return Edef isOK(V): N=len(V) NewV=np.zeros([N,N]) Route=[] for i in range(N): mm=np.max(V[:,i]) for j in range(N): if V[j,i]==mm: NewV[j,i]=1 Route+=[j] break return Route,NewVdef CheckValue(V): N=len(V) for i in range(N): for j in range(N): if V[i,j]>0.3 and V[i,j]<0.7: return 0 return 1def CheckPosition(V): N=len(V) V1=np.zeros([N,N]) for i in range(N): row_sum=0; clomn_sum=0; for j in range(N): if V[i,j]>=0.9: V1[i,j]=1 if V[j,i]>=0.9: V1[j,i]=1 row_sum+=V1[i,j] clomn_sum+=V1[j,i] if row_sum!=N: return 0 if clomn_sum!=N: return 0 return 1def CalcuDis(Route,Dis): distance=0 for i in range(N-1): distance+=Dis[Route[i],Route[i+1]] distance+=Dis[Route[N-1],Route[0]] return distancedef Plot(Route,Data): Route+=[Route[0]] Points=Data[Route,:] plt.figure(3) plt.scatter(Points[:,0],Points[:,1]) plt.plot(Points[:,0],Points[:,1],linestyle="--") plt.xlim(0,5) plt.ylim(0,5)#Data=np.random.rand(8,2)Data=np.matrix([[1,2],[2,1],[1,3],[2,4],[3,1],[4,2],[3,4],[4,3]]);Dis=Distance(Data)N=len(Dis)A=N*ND=N/2U0=0.0009step=0.0001B=N*NC=N/4maxecho=10W=CalcuW(A,B,C,D,Dis)U=0.002*(2*np.random.rand(N,N)-1)V=1/N*(2*np.random.rand(N,N)-1)Dis_best=np.sum(Dis)Route_final="No answear"E_all=[]Dis_all=[]Route_all=[]for r in range(maxecho): count=0 flag=1 while count<500: #print(r*1000+count)S E_all+=[CacuEnergy( V,Dis,A,B,C,D,N)] count+=1 deltaU=CalcuDeltaU(U,V,A,B,C,D,Dis) U=CalcuU(U,deltaU,step) V=CalcuV(U,U0) Route, NewV = isOK(V) #print(r) #print(NewV) #print(Route) if len(np.unique(Route))==8: print(r,"Route found:",Route) Dis_r=CalcuDis(Route,Dis) Dis_all+=[Dis_r] Route_all+=[Route] print("Distance is",Dis_r) #Plot(Route,Data) if Dis_r<Dis_best: Dis_best=Dis_r Route_final=Route #V=V+2*(2*np.random.rand(N,N)-1) U=0.002*(2*np.random.rand(N,N)-1) V= 1 / N * (2 * np.random.rand(N, N) - 1) A+=10*(2*np.random.rand(1,1)-1) B=A C+=10*(2*np.random.rand(1,1)-1) D+=10*(2*np.random.rand(1,1)-1)plt.figure(1)plt.plot(E_all)plt.figure(2)plt.plot(Dis_all)if Route_final!="No answear": Plot(Route_final,Data)print(V)Route,NewV=isOK(V)print(NewV)#plt.show()print("The final best Route is :",Route_final)print("The distance of the Route is:",Dis_best)
0 0
- 神经网络(三) 用Hopfield 网络求解TSP问题
- hopfield 方法求解TSP问题
- HopField神经网络求解水质问题 实例
- 反馈神经网络Hopfield网络
- MATLAB神经网络编程(九)——Hopfield网络
- 系统学习机器学习之神经网络(九) --Hopfield网络
- 使用蚁群算法(ACO)、遗传算法(GA)、霍普菲尔德网络(Hopfield)解决旅行商问题(TSP)
- 用遗传算法求解TSP问题
- 用模拟退火算法求解TSP问题
- DP求解TSP问题
- 贪心求解TSP问题
- TSP问题求解方法
- Hopfield神经网络
- Hopfield神经网络
- hopfield神经网络
- Hopfield神经网络
- 基于蚁群算法求解求解TSP问题(JAVA)
- 基于蚁群算法求解求解TSP问题(JAVA)
- MIPS寻址方式
- Ajax获取XML格式的数据
- ThinkPHP + Discuz 整合方法
- 7. Reverse Integer
- C语言 大小写字符转换输出
- 神经网络(三) 用Hopfield 网络求解TSP问题
- 崔希凡JavaWeb笔记day25-day27(2016年11月11日22:08:04)
- Android图形处理基本api(缩放,旋转,平移)
- 引水入城 洛谷 1514 bfs 贪心
- JS-cache-control
- Log4j日志组件解析
- 空间域图像处理
- C语言 判断一个字符串是否为另外一个字符串旋转之后的字符串
- Windows上运行Caffe自带的mnist例子