首页 > 其他分享 >霍普菲尔德(Hopfield)神经网络求解旅行商问题TSP,提供完整MATLAB代码,复制粘贴即可运行

霍普菲尔德(Hopfield)神经网络求解旅行商问题TSP,提供完整MATLAB代码,复制粘贴即可运行

时间:2024-10-09 17:47:32浏览次数:10  
标签:rand Hopfield end 霍普菲 路径 复制粘贴 citys sum 神经元

Hopfield神经网络是以美国物理学家约翰·霍普菲尔德(John Hopfield)的名字命名的。他在1982年提出了这种类型的神经网络模型,因此通常被称为Hopfield网络。旅行商问题(Traveling Salesman Problem,TSP)是一个经典的组合优化问题,即在给定一组城市及城市之间的距离,找到一条遍历所有城市且每个城市仅被访问一次的最短路径。Holified 神经网络是一种用于解决 TSP 的方法,其原理如下:

一、神经网络模型结构

Holified 神经网络通常由神经元组成的二维网格构成。每个神经元对应一个城市和一个旅行顺序位置。例如,如果有个城市,那么就有个神经元,分别表示每个城市在不同位置的可能性。

二、神经元的激活状态

神经元的激活值表示当前城市在特定位置的可能性。初始时,激活值可以随机设置或根据一些启发式方法初始化。
随着网络的运行,激活值会不断调整,以趋向于表示最优的旅行路径。

三、能量函数

定义一个能量函数来衡量当前网络状态与最优解的差距。这个能量函数通常考虑以下几个因素:
路径长度:即旅行商走过的总距离。这是最重要的因素之一,因为 TSP 的目标就是最小化路径长度。
城市的唯## 标题一性:确保每个城市在路径中只出现一次。
顺序的合理性:保证旅行路径的连续性和合理性。
能量函数的值越低,表示网络状态越接近最优解。通过不断调整神经元的激活值,使能量函数逐渐减小。

四、更新规则

使用一些更新规则来调整神经元的激活值。常见的更新规则包括:
基于梯度下降的方法:根据能量函数的梯度来更新激活值,使网络朝着能量降低的方向发展。
竞争机制:神经元之间相互竞争,激活值高的神经元会抑制激活值低的神经元,以突出更有可能的路径。
更新过程通常是迭代进行的,直到满足一定的收敛条件,例如能量函数的值不再显著变化或达到预设的迭代次数。

五、求解过程

初始化网络:设置神经元的初始激活值和参数。
迭代更新:根据更新规则不断调整神经元的激活值,同时计算能量函数的值。
收敛判断:检查能量函数是否满足收敛条件。如果满足,则停止迭代;否则,继续更新。
提取解:从最终的神经元激活状态中提取出旅行商的路径。通常选择激活值最高的神经元组合作为最优路径。
总之,Holified 神经网络通过构建一个神经元网络模型,利用能量函数和更新规则来不断调整神经元的激活值,以找到旅行商问题的最优解或近似最优解。这种方法在一定程度上可以有效地解决 TSP 问题,但可能需要较长的计算时间和适当的参数调整。

六、完整MATLAB代码

复制粘贴到MATLAB运行即可得出结果图

%% 连续Hopfield神经网络的优化—旅行商问题优化计算
 
%% 清空环境变量、定义全局变量
clear all
clc
global A D
 
%% 城市位置
citys=rand(10,2);
%% 计算相互城市间距离
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));
%  flag=1;
%% 结果显示
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-','LineWidth',2);
   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('最优路径矩阵');
   % 绘制最优路径
   figure(2)
   plot([citys_end(:,1);citys_end(1,1)],...
       [citys_end(:,2);citys_end(1,2)],'o-','LineWidth',2);
   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,'LineWidth',2);
   ylim([0 2000])
   title(['能量函数变化曲线(最优能量:' num2str(E(end)) ')']);
   xlabel('迭代次数');
   ylabel('能量函数');
else
   disp('寻优路径无效');
end
function du=diff_u(V,d)
global A D
n=size(V,1);
sum_x=repmat(sum(V,2)-1,1,n);
sum_i=repmat(sum(V,1)-1,n,1);
V_temp=V(:,2:n);
V_temp=[V_temp V(:,1)];
sum_d=d*V_temp;
du=-A*sum_x-A*sum_i-D*sum_d;
end
function E=energy(V,d)
global A D
n=size(V,1);
sum_x=sumsqr(sum(V,2)-1);
sum_i=sumsqr(sum(V,1)-1);
V_temp=V(:,2:n);
V_temp=[V_temp V(:,1)];
sum_d=d*V_temp;
sum_d=sum(sum(V.*sum_d));
E=0.5*(A*sum_x+A*sum_i+D*sum_d);
end


七、部分效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

标签:rand,Hopfield,end,霍普菲,路径,复制粘贴,citys,sum,神经元
From: https://blog.csdn.net/weixin_46204734/article/details/142792533

相关文章

  • 富文本编辑器UEDITOR支持从WORD复制粘贴保留格式和图片的插件
    编辑器:百度ueditor前端:vue2,vue3,vue-cli,html5需求:复制粘贴word内容图片,word图片转存交互,导入pdf,导入PowerPoint(PPT)要求:开源,免费,技术支持用户体验:Ctrl+V快捷键操作该说不说,最近这块应该也是挻火的,今天早上又有网友加我微信私聊,说是想了解一下这块的技术和方案。实......
  • 2024诺贝尔物理学奖获奖者John J. Hopfield和Geoffrey E. Hinton的贡献
    更多优质内容,请关注公众号:智驾机器人技术前线JohnJ.HopfieldJohnJ.Hopfield是一位著名的理论物理学家和神经科学家,以其在物理学、化学、生物学和神经科学等跨学科领域的贡献而闻名。他的研究涵盖了从固体物理到生物物理的多个领域,尤其在神经网络和分子生物学方面的工作......
  • 复制粘贴,快速将Python程序打包成exe
    为了将Python程序发送给不懂代码和没有安装Python的同事、朋友使用,最好的方式就是将Python程序打包成exe可执行文件,再发送给他们。我之前曾经打包过几次,操作并没有难度,但不会记打包命令,每次打包时都需要重新查命令。所以本文记录打包过程,需要打包时可以直接复制粘贴,快速完成,......
  • 网页无法复制粘贴?Force Copy插件帮你解决难题
    当我们浏览网页的时候,看到感兴趣的内容就特别想把它复制下来。但经常是有的网站复制要强制登录,有的复制需要付费,甚至有的网站都没有复制这一选项。这时,我们可以用到这个插件。如何使用操作方法,打开Chrome后,点击右上角的插件,再点击第一栏的开关,就可以在网页中复制。软件界......
  • 富文本编辑器CKEDITOR支持从WORD复制粘贴保留格式和图片的插件
    编辑器:ckeditor前端:vue2,vue3.vue-cli后端:asp,jsp,php,asp.net,.netcore功能:复制粘贴word内容图片该说不说最近这个需求挻火的,今天早上又有网友加我QQ,实际上之前QQ号码就已经在网上公开了,但是还是有很多网友找不到,这个说实话就真没办法了,除了公布QQ号码以外我还公开了微信号码......
  • 复合Simpson求积算法-C++【可直接复制粘贴/欢迎评论点赞】
    背景复合Simpson求积算法是基于Simpson1/3法则的推广。Simpson1/3法则是一种数值积分方法,它通过将积分区间划分为多个小区间,并在每个小区间上采用一个二次多项式来逼近原函数,进而求得积分的近似值。复合Simpson求积算法则是将这种方法应用于整个积分区间,即将整个区间划分为......
  • Gauss列主元素消去法-C++【可直接复制粘贴/欢迎评论点赞】
    Gauss列主元素消去法(也称为列主元Gauss消去法)是Gauss消去法的一种改进版本,主要用于求解线性方程组。在C++中实现时,它具有一些显著的优点和缺点,并且有着深厚的数学和计算背景。优点提高数值稳定性:列主元Gauss消去法通过在每一列中选择绝对值最大的元素作为主元,从而避免了在消......
  • 牛顿插值法-C++【可直接复制粘贴/欢迎评论点赞】
    牛顿插值法是一种基于给定数据点集构造插值多项式的方法,用于近似未知函数的值。该方法通过构造差商表并利用该表逐步构建插值多项式。相较于拉格朗日插值法,牛顿插值法的一个显著优势是,当需要增加插值点时,只需重附上一项即可,无需重新计算所有插值点的值。基本概念牛顿插值法的......
  • 基于matlab的黄金搜索法【开源/可直接复制粘贴】
    黄金搜索法是一种无须函数导数的数值优化方法。它基于黄金分割比例来选择新的搜索区间,以逐步缩小搜索范围并逼近极值点。在每次迭代中,算法会根据当前搜索区间的长度和黄金分割比例来计算两个新的点,并在这两个点处评估函数值。然后,根据这两个点的函数值比较结果,选择包含更优解(......
  • Linux操作中遇到的复制粘贴问题
    今天在gitclone的时候发现Linux和Windows之间的复制粘贴并不同步,也就是说Linux和Windows只能在各自的界面进行复制粘贴操作。我从VirtualBox管理器界面入手,右键虚拟机,点击设置在常规——高级项里,可以看到共享粘贴板和拖放,默认的是已禁用,我就直接将它们全部改为双向了。另外,......