?? hopfieldtsp.m
字號:
%連續Hopfield網絡解決TSP
function HopfieldTsp()
clc;
N=10; %城市數
A=1.5; %系數A
D=1; %系數D
u0=0.02; %神經元函數斜率
Step_t=0.1; %計算步長
MaxEpochs=20000;%迭代次數
%得到城市間距離矩陣
CityCood=rand(2,N); %城市坐標
DistanceMat=dist(CityCood',CityCood); %城市間距離矩陣
U=0.2*rand(N,N)-0.1;%神經元輸入初始值在0附近產生
for Count=1:MaxEpochs
V=(1+tansig(U/u0))/2;
E=CacuEnergy(V,DistanceMat,A,D);%計算能量
delta_U=CacuDeltaU(V,DistanceMat,A,D,Step_t);%計算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);%計算路徑的真實長度
PlotRoute(NewV,CityCood);%繪制路徑
else
disp('路徑無效!!');
end
%能量計算
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);
%計算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;
end
SC=sum(NewV);
SR=sum(NewV');
CheckRes=sumsqr(SC-SR);
%繪制路徑
function PlotRoute(V,CityCood)
figure;
title('連續Hopfield網絡解決TSP');
xlabel('X坐標');
ylabel('Y坐標');
axis([0,1,0,1]);
axis on;
[xxx,order]=max(V);
NewCood=CityCood(:,order);
NewCood=[NewCood NewCood(:,1)];
plot(NewCood(1,:),NewCood(2,:),'o-');
%計算路徑實際長度
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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -