?? hopfieldtsp.m
字號(hào):
%連續(xù)Hopfield網(wǎng)絡(luò)解決TSPfunction HopfieldTsp()clc;N=10; %城市數(shù)A=1.5; %系數(shù)AD=1; %系數(shù)Du0=0.02; %神經(jīng)元函數(shù)斜率Step_t=0.1; %計(jì)算步長(zhǎng)MaxEpochs=20000;%迭代次數(shù)%得到城市間距離矩陣CityCood=rand(2,N); %城市坐標(biāo)DistanceMat=dist(CityCood',CityCood); %城市間距離矩陣U=0.2*rand(N,N)-0.1;%神經(jīng)元輸入初始值在0附近產(chǎn)生for Count=1:MaxEpochs V=(1+tansig(U/u0))/2; E=CacuEnergy(V,DistanceMat,A,D);%計(jì)算能量 delta_U=CacuDeltaU(V,DistanceMat,A,D,Step_t);%計(jì)算U的增量 U=U+delta_U*Step_t;end[NewV,CheckRes]=RouteCheck(V);%檢查V是否是有效路徑if(CheckRes<1) FinalE=CacuEnergy(NewV,DistanceMat,A,D); RouteLen=TotalRouteLength(NewV,CityCood);%計(jì)算路徑的真實(shí)長(zhǎng)度 PlotRoute(NewV,CityCood);%繪制路徑else disp('路徑無(wú)效!!');end%能量計(jì)算function E=CacuEnergy(V,d,A,D)[n,n]=size(V);t1=sumsqr(sum(V,2)-1);t2=sumsqr(sum(V,1)-1);PermitV=V(:,2:n);PermitV=[PermitV V(:,1)];temp=d*PermitV;t3=sum(sum(V.*temp));E=0.5*(A*t1+A*t2+D+t3);%計(jì)算U的增量function d_U=CacuDeltaU(V,d,A,D,dt)[n,n]=size(V);t1=repmat(sum(V,2)-1,1,n);t2=repmat(sum(V,1)-1,n,1);PermitV=V(:,2:n);PermitV=[PermitV V(:,1)];t3=d*PermitV;d_U=-dt*(A*t1+A*t2+D*t3);%檢查V是否是有效路徑function [NewV,CheckRes]=RouteCheck(V)[rows,columns]=size(V);NewV=zeros(rows,columns);[XC,Order]=max(V);for j=1:columns NewV(Order(j),j)=1;endSC=sum(NewV);SR=sum(NewV');CheckRes=sumsqr(SC-SR);%繪制路徑function PlotRoute(V,CityCood)figure;title('連續(xù)Hopfield網(wǎng)絡(luò)解決TSP');xlabel('X坐標(biāo)');ylabel('Y坐標(biāo)');axis([0,1,0,1]);axis on;[xxx,order]=max(V);NewCood=CityCood(:,order);NewCood=[NewCood NewCood(:,1)];plot(NewCood(1,:),NewCood(2,:),'o-');%計(jì)算路徑實(shí)際長(zhǎng)度function Len=TotalRouteLength(V,CityCood)[xxx,order]=max(V);NewCood=CityCood(:,order);NewCood=[NewCood NewCood(:,1)];[rows,columns]=size(NewCood);Len=0;for i=2:columns Len=Len+dist(NewCood(:,i-1)',NewCood(:,i));end
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -