连 续 Hopfield 神 经 网 络(continuous hopfield neural network, CHNN)解决组合优化问题是神经网络应用的重要方面,在实际应用中将优化问题的 目标函数转换为连续 Hopfield 神经网络的能量函 数,优化变量对应于网络中神经元的状态,当神经 元状态趋于平衡点时,网络的能量函数趋于最小,最终达到稳定状态,问题的最优解也随之求出, 网络由初始值向稳态收敛的过程即目标函数优化 计算的过程。由于神经网络是并行计算的,计算量 不会随维度的增大而指数性增加,能有效进行快速优化计算。
理论
连续 Hopfield 神经网络是单层结构的反馈网 络,由n个神经元(N1,N2,⋯,Nn)组成,每个神经元 既是输出单元也是输入单元,其输出作为其他神经元的输入,如下图所示。
Hopfield 网络优化计算的 步骤描述如下:1)选择合适的问题表示方法,使神 经元输出与问题的解对应;2)构造能量函数,使其 最小值对应问题的最优解;3)由能量函数求得对应 的权重和偏置参数;4)构造网络的动态方程;5)初始化网络,优化计算求解。
2、 连续Hopfield神经网络的优化旅行商问题
代码实现
%% 清空环境变量、定义全局变量
clear all
clc
global A D
%% 导入城市位置
load city_location %10个城市的横纵坐标
%% 计算相互城市间距离
distance=dist(citys,citys');
%% 初始化网络
N=size(citys,1);
A=200;
D=100;
U0=0.1;
step=0.0001;
delta=2*rand(N,N)-1;
U=U0*log(N-1)+delta;
V=(1+tansig(U/U0))/2;
iter_num=10000;
E=zeros(1,iter_num);
%% 寻优迭代
for k=1:iter_num
% 动态方程计算
dU=diff_u(V,distance);
% 输入神经元 状态更新
U=U+dU*step;
% 输出神经元 状态更新
V=(1+tansig(U/U0))/2;
% 能量函数计算
e=energy(V,distance);
E(k)=e;
end
%% 判断路径有效性
[rows,cols]=size(V);
V1=zeros(rows,cols);
[V_max,V_ind]=max(V);
for j=1:cols
V1(V_ind(j),j)=1;
end
C=sum(V1,1);
R=sum(V1,2);
flag=isequal(C,ones(1,N)) & isequal(R',ones(1,N));
%% 结果显示
if flag==1
%% 计算初始路径长度
sort_rand=randperm(N);
citys_rand=citys(sort_rand,:);
Length_init=dist(citys_rand(1,:),citys_rand(end,:)');
for i=2:size(citys_rand,1)
Length_init=Length_init+dist(citys_rand(i-1,:),citys_rand(i,:)');
end
%% 绘制初始路径
figure(1)
plot([citys_rand(:,1);citys_rand(1,1)],[citys_rand(:,2);citys_rand(1,2)],'o-')
for i=1:length(citys)
text(citys(i,1),citys(i,2),[' ' num2str(i)])
end
text(citys_rand(1,1),citys_rand(1,2),[' 起点' ])
text(citys_rand(end,1),citys_rand(end,2),[' 终点' ])
title(['优化前路径(长度:' num2str(Length_init) ')'])
axis([0 1 0 1])
grid on
xlabel('城市位置横坐标')
ylabel('城市位置纵坐标')
%% 计算最优路径长度
[V1_max,V1_ind]=max(V1);
citys_end=citys(V1_ind,:);
Length_end=dist(citys_end(1,:),citys_end(end,:)');
for i=2:size(citys_end,1)
Length_end=Length_end+dist(citys_end(i-1,:),citys_end(i,:)');
end
disp('最优路径矩阵');V1
%% 绘制最优路径
figure(2)
plot([citys_end(:,1);citys_end(1,1)],...
[citys_end(:,2);citys_end(1,2)],'o-')
for i=1:length(citys)
text(citys(i,1),citys(i,2),[' ' num2str(i)])
end
text(citys_end(1,1),citys_end(1,2),[' 起点' ])
text(citys_end(end,1),citys_end(end,2),[' 终点' ])
title(['优化后路径(长度:' num2str(Length_end) ')'])
axis([0 1 0 1])
grid on
xlabel('城市位置横坐标')
ylabel('城市位置纵坐标')
%% 绘制能量函数变化曲线
figure(3)
plot(1:iter_num,E);
ylim([0 2000])
title(['能量函数变化曲线(最优能量:' num2str(E(end)) ')']);
xlabel('迭代次数');
ylabel('能量函数');
else
disp('寻优路径无效');
end
结果展示