⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hopfieldexperiment.m

📁 该程序运行多次
💻 M
字号:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
% 该程序运行多次,并输出合法解及其图形 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
clear;clc; 

> 
A=500; 
B=500; 
C=1000; 
D=500; 
u0=0.002; 
lamda=0.0001; 

N=10; %城市数 
MaxTrn=1000; %每次实验的最大训练(迭代)次数 
MaxTst=100; 

%城市坐标和距离 
PosX=[0.4,0.2439,0.1707,0.2293,0.5171,0.8732,0.6878,0.8488,0.6683,0.6195,0.9125]; 
PosY=[0.4439,0.1463,0.2293,0.761,0.9414,0.6536,0.5219,0.3609,0.2536,0.2634, 0.9568]; 
for i=1:N 
for j=1:N 
Dist(i,j)=sqrt((PosX(i)-PosX(j))^2+(PosY(i)-PosY(j))^2); 
end; 
end; 

frslt=fopen('rslt.txt','w+'); 
Legal=0; 
for tst=1:MaxTst 
tst 
%计算 
%初始化 
V=rand(N,N); 
U=atanh(2*V-1)*u0; 

for g=1:MaxTrn 

for ux=1:N 
for ui=1:N 
m1=0; m2=0; m3=0; m4=0; 
%求导公式第一项 
for j=1:N 
if j~=ui 
m1=m1+V(ux,j); 
end; 
end; 
m1=-A*m1; 
% 求导公式第二项 
for y=1:N 
if y~=ux 
m2=m2+V(y,ui); 
end; 
end; 
m2=-B*m2; 
% 求导公式第三项 
for x=1:N 
for j=1:N 
m3=m3+V(x,j); 
end; 
end; 
m3=-C*(m3-N); 
% 求导公式第四项 
for y=1:N 
if y~=ux 
if ui==1 
m4=m4+Dist(ux,y)*(V(y,ui+1)+V(y,N)); 
elseif ui==N 
m4=m4+Dist(ux,y)*(V(y,ui-1)+V(y,1)); 
else 
m4=m4+Dist(ux,y)*(V(y,ui+1)+V(y,ui-1)); 
end; 
end; 
end; 
m4=-D*m4; 
DU(ux,ui)=-U(ux,ui)+m1+m2+m3+m4; 
end; 
end; 
> 
U=U+lamda*DU; 
V=(1+tanh(U/u0))/2; 
for ux=1:N 
for ui=1:N 
if V(ux,ui)<0.3 
V(ux,ui)=0; 
end; 
if V(ux,ui)>0.7 
V(ux,ui)=1; 
end; 
end; 
end; 
end; 

% 输出矩阵 
V 

%判断是否为合法解 
Cond1=0; %矩阵约束条件,要求共有N个1 
for ux=1:N 
for ui=1:N 
Cond1=Cond1+V(ux,ui); 
end; 
end; 
Cond2=0; %行约束条件,每行不多于一个1 
for x=1:N 
for i=1:N-1 
for j=i+1:N 
Cond2=Cond2+V(x,i)*V(x,j); 
end; 
end; 
end; 
Cond3=0; %列约束条件,每列不多于一个1 
for i=1:N 
for x=1:N-1 
for y=x+1:N 
Cond3=Cond3+V(x,i)*V(y,i); 
end; 
end; 
end; 
if (Cond1==N)&amt;&amt;(Cond2==0)&amt;&amt;(Cond3==0) %合法解 
%旅行路线 
for j=1:N 
for i=1:N 
if V(i,j)==1 
PosXX(j)=PosX(i); 
PosYY(j)=PosY(i); 
end; 
end; 
end; 
PosXX(N+1)=PosXX(1); 
PosYY(N+1)=PosYY(1); 
PosXX 
PosYY 
fprintf(frslt,'\nTest:>d\n',tst); 
for i=1:N 
for j=1:N 
fprintf(frslt,'>.4f ',V(i,j)); 
end; 
fprintf(frslt,'\n'); 
end; 
for i=1:(N+1) 
fprintf(frslt,'>.4f ',PosXX(i)); 
end; 
fprintf(frslt,'\n'); 
for i=1:(N+1) 
fprintf(frslt,'>.4f ',PosYY(i)); 
end; 
fprintf(frslt,'\n'); 

%计算并输出总路程长度 
TourDist=0; 
for i=1:N-1 
TourDist=TourDist+sqrt((PosXX(i)-PosXX(i+1))^2+(PosYY(i)-PosYY(i+1))^2); 
end; 
TourDist=TourDist+sqrt((PosXX(N)-PosXX(1))^2+(PosYY(N)-PosYY(1))^2) 

%图形输出 
if mod(Legal,8)==0 
figure(floor(Legal/8)+1); 
end; 
subplot(4,2,mod(Legal,8)+1); 
plot(PosXX,PosYY,'o-'); 
title(TourDist); 
> 
Legal=Legal+1; 
LegalRslt(Legal)=TourDist; 
end; 

end; 

fclose(frslt); 

> 
LegalRslt 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -