Hopfield神经网络求解旅行商(TSP)问题matlab代码

news2024/11/18 1:27:01

1案例背景

1.1连续Hopfield神经网络概述

        1.网络结构
        连续Hopfield神经网络(Continuous Hopfield Neural Network,CHNN)的拓扑结构和离散Hopfield神经网络的结构类似,如图11-1所示。连续Hopfield网络和离散Hopfield 网络的不同点在于其传递函数不是阶跃函数,而是连续函数。

        与离散型Hopfield神经网络不同,由于连续型Hopfield神经网络在时间上的连续性,其工作方式为并行(同步)方式。
        J.J. Hopfield利用模拟电路(电阻、电容和运算放大器)实现了对网络的神经元的描述,如图11-1所示。假设神经元jj=1,2,…,n)的内部膜电位状态用U,表示,细胞膜输入电容为C,,细胞膜的传递电阻为R,,输出电压为V,,外部输入电流用I,表示。其中,R,和C,的并联模拟了生物神经元的时间常数,w;模拟了神经元间的突触特性,运算放大器模拟了神经元的非线性特性,Ij相当于阙值。由基尔霍夫电流定律(Kirchhoff's Current Law,KCL)可以得出:

        2.网络稳定性
        关于连续型Hopfield神经网络的稳定性,J.J.Hopfield利用定义的能量函数进行了详细的推导和证明,具体证明过程如下。能量函数E(t)定义为:

        从上述证明过程可以看出:
        ①当网络神经元的传递函数单调递增且网络权系数矩阵对称时,网络的能量会随着时间变化下降或保持不变;
        ②当且仅当神经元的输出不再随时间变化而变化时,网络的能量才会不变。
        3.优化计算
        在实际应用中,如果将一个最优化问题的目标函数转换成连续Hopfield神经网络的能量函数,把问题的变量对应于网络中神经元的状态,那么Hopfield神经网络就能够用于解决优化组合问题。即当网络的神经元状态趋于平衡点时,网络的能量函数也趋于最小值,网络由初态向稳态收敛的过程就是目标函数优化计算的过程。

1.2组合优化问题概述

        组合优化(combinatorial optimization)问题的目标是从组合问题的可行解集中求出最优解组合优化往往涉及排序、分类、筛选等问题,是运筹学的一个重要分支。典型的组合优化问题有旅行商问题(Traveling Salesman Problem,TSP)、加工调度问题(scheduling problem,如 Flow - Shop,job-shop),0-1背包问题(knapsackproblem)、装箱问题(bin packing problem),图着色问题(graph coloring problem)、聚类问题(clustering prob-lem)等。这些问题描述非常简单,并且有很强的工程代表性,但最优化求解很困难,其主要原因是求解这些问题的算法运行时,需要极长的运行时间与极大的存储空间,以致根本不可能在现有的计算机上实现,即会产生所谓的“组合爆炸”问题。正是这些问题的代表性和复杂性激起了人们对组合优化理论与算法的研究兴趣。

        利用神经网络解决组合优化问题是神经网络应用的一个重要方面。将Hopfield网络应用于求解组合优化问题,把目标函数转化为网络的能量函数,把问题的变量对应到网络的神经元的状态,这样,当网络的能量函数收敛于极小值时,问题的最优解也随之求出。由于神经网络是并行计算的,其计算量不会随着维数的增加而发生指数性“爆炸”,因而对于优化问题的高速计算特别有效。

1.3问题描述

        旅行商(TSP)问题的描述是:在N个城市中各经历一次后再回到出发点,使所经过的路程最短。若不考虑方向性和周期性,在给定N的条件下,可能存在的闭合路径数目为0.5×(N-1)!。当N较大时,枚举法的计算量之大难以想象。现对于一个城市数量为10的TSP问题,要求设计一个可以对其进行组合优化的连续型 Hopfield神经网络模型,利用该模型可以快速地找到最优(或近似最优)的一条路线。

2模型建立

2.1设计思路

        由于连续型Hopfield神经网络具有优化计算的特性,因此将TSP问题的目标函数(即最短路径)与网络的能量函数相对应,将经过的城市顺序与网络的神经元状态相对应。这样,由连续型 Hopfield神经网络的稳定性理论可知,当网络的能量函数趋于最小值时,网络的神经元状态也趋于平衡点,此时对应的城市顺序即为待求的最佳路线。

2.2设计步骤

        依据设计思路,将TSP问题映射为一个连续型Hopfield神经网络主要分为以下几个步骤,如图11-2所示。

        1.模型映射
        为了将TSP问题映射为一个神经网络的动态过程,Hopfield采取了换位矩阵的表示方法,用 NXN矩阵表示商人访问N个城市。例如,有5个城市A,B,C,D,E,访问路线是A→C→E→D→B,则 Hopfield网络输出所代表的有效解对应的二维矩阵如表11-1所列。

        对于N个城市 TSP问题,需用NXN个神经元来实现,而每行每列都只能有一个1,其余为0,矩阵中1的和为N,该矩阵称为换位矩阵。
        2.构造网络能量函数和动态方程
        如前文所述,设计的 Hopfield神经网络的能量函数是与目标函数(即最短路径)相对应的。同时,应该考虑到有效解(路线)的实际意义,即换位矩阵的每行每列都只能有一个1。因此,网络的能量函数包含目标项(目标函数)和约束项(换位矩阵)两部分。这里,将网络的能量函数定义为:

        3. 初始化网络
        H op ield 神经网络迭代过程对网络的能量函 及动态方程的系数十分敏感,在总结前人 经验及多次实验的基础上,网络输入初始化选取如下:

        在式(11-7)、式(11-8)中,取A=200,D=100;采样时间设置为step=0.000 1,迭代次数为10000.
        4.优化计算
        当网络的结构及参数设计完成后,迭代优化计算的过程就变得非常简单,具体步骤如下。

 

3MATLAB 实现

        主函数如下:

%% 连续Hopfield神经网络的优化—旅行商问题优化计算

%% 清空环境变量、定义全局变量
clear all
clc
global A D

%% 导入城市位置
load city_location

%% 计算相互城市间距离
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

        图11-3所示为随机产生的初始路径,所经过的路径长度为5.3616。


        经过连续型Hopfield神经网络优化后,寻找到的优化路径长度为3.0383,如图11-4所示。

        能量函数随迭代过程变化的曲线如图11-5所示,从图中可以看出,网络的能量随着迭代过程不断减少。当网络的能量变化很小时,网络的神经元状态也趋于平衡点,此时对应的城市顺序即为待求的优化路径。
        结果表明,利用连续型Hopfield神经网络,可以快速准确地解决 TSP问题。同理,对于其他利用枚举法会产生“组合爆炸”的组合优化问题,利用连续型Hopfield神经网络也可以进行优化计算。

4案例扩展

4.1结果比较

        图11-6列出了在进行100次的实验中,寻找到有效路径的次数与城市数量和迭代次数的关系。从表中可以看出,随着城市数量的增加,Hopfield 神经网络寻优的效果越来越差,增加迭代次数,可以改善寻优的效果,但并非迭代次数越多越好,还得结合实际问题进行具体分析,

4.2 案例扩展

        利用连续型Hopfield神经网络,将待优化的目标函数及相对应的约束条件转化为能量函数,将问题的变量对应神经网络神经元的状态。当Hopfield神经网络的输出状态趋于平衡点时,能量函数对应的便是待优化问题的最优解。利用此思路,可以快速,准确地解决各种优化问题,如选址优化、轴承设计优化等。另外,能量函数,网络参数会对优化结果产生很大的影响,许多专家学者对这些问题进行了广泛深入的研究。

5.完整matlab代码

https://download.csdn.net/download/weixin_44209907/88168579
 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/837798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 用vector创建数组对象

C标准库提供了被封装的动态数组——vector&#xff0c;而且这种被封装的数组可以具有各种类型&#xff0c;这就使我们免去了一些重复性工作。 vector不是一类&#xff0c;而是一个类模板。 1. vector定义动态数组的形式为 vector<元素类型>数组对象名(数组长度);尖括号…

Windows下QT Creator安装MinGW 32bit编译器

前言 注&#xff1a;本作者是基于FFmpeg开发需要&#xff0c;故在Windows下QT Creator中安装MinGW 32bit编译器&#xff01;其它型号编译器参照此文章基本可以实现&#xff01; 一、下载需要的编译器 1、下载链接 链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/…

sql 关联了2张表的 update 语句(转)

转自&#xff1a;SQL Update&#xff1a;使用一个表的数据更新另一张表 、update 关联两个表 基本上 select 能支持的关联和子查询操作&#xff0c;都能在 update 语句中使用。 在 where 条件中使用子查询 update a set a.age 1 where id in (select device_id from b) 在 wher…

Django调研

1. Django 简介 基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 使用 Django&#xff0c;只要很少的代码&#xff0c;Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容&#xff0c;并进一步开发出全功能的 Web 服务 Django 本…

【Spring练习项目】博客系统

目录 1.项目展示2.项目结构设计3.项目功能设计4 数据库准备4.1 建表4.2 DB相关数据 5.项目模块6.添加项目公共模块6.1 common6.2 实现前端界面 7.功能实现7.1实现博客列表约定前后端交互接口实现服务器代码实现客户端代码 7.2实现博客详情约定前后端交互接口实现服务器代码实现…

电影《封神》如何应用3D人脸扫描设备进行影视制作?

在电影《封神》中伐纣大战的魔家四将的四个角色在影片中一出现&#xff0c;便吸引了观众的所有目光&#xff0c;这逼真的魔家四将的制作前期是从寺庙、文献中收集了四大天王众多的造型和画像&#xff0c;并且还会依据演员的面貌、面部特征适当地优化。 因此在制作中还需要通过扫…

WAF绕过-AWVS+Xray+Goby+sqlmap-绕过宝塔防火墙

WAF绕过主要集中在信息收集&#xff0c;漏洞发现&#xff0c;漏洞利用&#xff0c;权限控制四个阶段。 1、什么是WAF&#xff1f; Web Application Firewall&#xff08;web应用防火墙&#xff09;&#xff0c;一种公认的说法是“web应用防火墙通过执行一系列针对HTTP/HTTPS的安…

【1++的C++进阶】之多态

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的C进阶】 文章目录 一&#xff0c;什么是多态&#xff1f;二&#xff0c;剖析多态的调用原理三&#xff0c;抽象类四&#xff0c;多继承中的虚函数表 一&#xff0c;什么是多态&#xff1f; …

【LeetCode 75】第十九题(724)寻找数组的中心下标

目录 题目: 示例: ​分析: 代码运行结果: 题目: 示例: 分析: 给一个数组,让我们找出一个下标,在这个下标左边的元素总和等于这个下标右边的元素总和. 我们可以把整个数组的总和求出来,然后再从左往右遍历一次数组,遍历的同时将遍历过的数累加记录到一个变量中.若遍历到一…

【C语言进阶】数据的存储----整型篇

​ &#x1f341; 博客主页:江池俊的博客 &#x1f4ab;收录专栏&#xff1a;C语言——探索高效编程的基石 &#x1f4bb; 其他专栏&#xff1a;数据结构探索 ​&#x1f4a1;代码仓库&#xff1a;江池俊的代码仓库 &#x1f3aa; 社区&#xff1a;GeekHub &#x1f341; 如果觉…

数据库索引失效的情况

1.对添加了索引的字段进行函数运算 2.如果是字符串类型的字段&#xff0c;如果不加单引号也会导致索引失效 3.如果最索引字段使用模糊查询&#xff0c;如果是头部模糊索引将失效&#xff0c;如果是尾部模糊索引则正常 4.如果使用or分割符&#xff0c;如果or前面的条件中的列有…

JUC并发编程(二)ForkJoinPool、Future、CompletableFuture、CAS

文章目录 ForkJoin分治工作窃取ForkJoinPool与ThreadPoolExecutor使用案例不带返回值的计算--RecursiveAction带返回值的计算--RecursiveTask Future 异步回调烧水案例join实现FutureTask实现 CompletableFuture为什么叫CompletableFuture?创建异步任务supplyAsyncrunAsync获取…

Vue插槽 、自定义指令、render函数、过滤器和插件

目录 插槽 自定义指令 directive 全局注册 局部注册 钩子函数 render渲染函数 过滤器 插件 plugin 插槽 普通插槽&#xff0c;具名插槽&#xff0c;作用域插槽 插槽允许我们在调用子组件的时候为子组件传递模板。 <slot> 元素作为承载分发内容的出口。 一个不带…

双链表(带哨兵位头节点)

目录 ​编辑 双链表的初始化&#xff1a; 双链表的打印&#xff1a; 双链表的尾插&#xff1a; 双链表的头插&#xff1a; 双链表的尾删&#xff1a; 双链表的头删&#xff1a; 双链表pos位置之前的插入&#xff1a; 双链表pos位置的删除&#xff1a; 关于顺序表和链表…

MyBatis-Plus实现分页查询

目录 MyBatis-Plus实现分页查询 代码 定义一个MyBatis-Plus拦截器 在连接数据库的配置文件中添加MyBatis-Plus日志查看MyBatis-Plus的SQL语句 测试 运行结果 MyBatis-Plus实现分页查询 代码 定义一个MyBatis-Plus拦截器 package com.dong.config;import com.baomidou.my…

windows下mysql的下载与安装

文章目录 1 下载2 安装目录下新建data文件夹和my.ini3 安装4设置密码与远程连接5 配置环境变量6 navicate连接成功 1 下载 官网地址 https://www.mysql.com/点击下载 社区下载 社区服务 选择版本下载 2 安装目录下新建data文件夹和my.ini my.ini 内容如下 [mysql] # 设置my…

iphone内存不足导致白苹果?可以使用这2种办法解决!

因为iPhone内存不足没及时清理导致打开任何软件闪退&#xff0c;这时很多小伙伴会重启手机来解决闪退问题&#xff0c;但就会出现白苹果问题&#xff0c;无法正常进入手机系统、实现任何操作的一种状态。 内存不足导致iPhone白苹果的问题很常见&#xff0c;可以说是苹果最常见…

linux 文件的权限

修改文件的权限 我这里有一个test.txt 文件&#xff0c;我们ll 查看一下该文件相应的属性信息 其中&#xff0c;权限的位置是相对固定的即&#xff1a; 第一个位置是r 权限&#xff0c;代表可读权限。 第二个位置是w权限&#xff0c;代表可修改权限。 第三个位置是x权限&…

【腾讯云 Cloud Studio 实战训练营】从零开始搭建一个数据大屏

文章目录 前言得到什么?使用Cloud Studio登录Cloud Studio登录方式Cloud Studio 功能介绍项目创建配置描述新建工作空间绑定Coding创建仓库绑定coding创建项目项目空间 项目搭建nuxt 脚手架Cloud Studio 安装插件nuxt初始项目预览问题描述 下载Datav 并体验页面结构展示 获取基…

【项目 线程2】3.5 线程的分离 3.6线程取消 3.7线程属性

3.5 线程的分离 #include <stdio.h> #include <pthread.h> #include <string.h> #include <unistd.h>void * callback(void * arg) {printf("chid thread id : %ld\n", pthread_self());return NULL; }int main() {// 创建一个子线程pthread…