simulink与遗传算法结合求解TSP问题

news2024/9/28 11:19:15

前言:刚开始入门学习simulink,了解了基本的模块功能后想尝试从自己熟悉的领域入手,自己出题使用simulink搭建模型。选择的是TSP问题的遗传算法,考虑如何用simulink建模思想来实现一个简单TSP问题的遗传算法。

TSP问题描述

一个配送中心,8个需求点,各个需求点间的距离以及需求点离配送中心的距离已知,车辆从配送中心出发遍历每个需求点有且仅有一次,最后又回到配送中心,求最短的配送路线。

在这里插入图片描述

处理输入数据

万事开头难,从输入参数的配置开始吧。

主要是处理各个节点(配送中心+需求点)间的距离矩阵。

第一种方案:直接在查表模块中填写数据

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

第二种方案:也可以将excel表格中记录距离矩阵的数据导入.m文件,最后生成可以供查表模块使用的.mat文件数据

参考文章:Simulink仿真中将工作空间中的数据变量保存成.mat文件
https://blog.csdn.net/jk_101/article/details/120019475

在这里插入图片描述

本人采用的是第二种方案实现输入距离矩阵的处理。

用.m文件存储数据

clc;
clear;

%% 处理各节点间的路线距离输入数据
%读取excel中,第一个sheet,B2-J10之间的内容
distance_data_file = 'distance_data.xlsx';
curr_path = matlab.desktop.editor.getActiveFilename;  % 获取当前.m脚本的工作路径
[pathstr, name, suffix] = fileparts(curr_path);  % 获取文件的上层父节点路径、文件名称、文件后缀
full_distance_path = fullfile(pathstr, distance_data_file);  % 拼接文件路径
distance_cube = xlsread(full_distance_path, 1, 'B2:J10');
save('distance_cube.mat', 'distance_cube');

9个节点(包括配送中心节点0)的距离数据存储在一个9*9的矩阵中,命名为distance_cube,使用save(‘distance_cube.mat’, ‘distance_cube’); 这条语句将从excel读取的距离矩阵存入distance_cube.mat供Simulink模型使用。

生成单条染色体

染色体编码方式采用整数编码方式,每一条染色体代表一种可行解,染色体中的每个基因位数字代表一个节点。

首先思考一条染色体在simulink中应该怎么表示?
假设:染色体A:0 1 2 3 4 5 6 7 8 0,可以直接使用constant模块表示

在这里插入图片描述

也可以使用Constant模块随机产生1-8的一维数组。

在这里插入图片描述

再使用Mux模块合并输入数据,得到一个以配送中心编号0开头和结尾的序列,这个序列就表示问题的一个可行解。

在这里插入图片描述

计算可行解的适应度函数

假设可行解为[0,1,2,3,4,5,6,7,8,0]

从基本单元“基因”开始处理

在这里插入图片描述

按照上面两个基因(节点)查表确认距离的思想,将基因使用Constant模块重组为一条染色体,计算单条染色体的适应度函数(总配送路线长度),备注:本博客提到的适应度函数不是真正意义上遗传算法要求的总运输距离的倒数,Simulink建模计算的染色体的适应度就是指代的总运输距离(车辆从配送中心出发依次经过8个需求点再返回配送中心的总路线长度)。

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

确定种群结构

假设染色体种群规模为10,采用Constant产生1-8个需求节点的随机序列,使用自定义的模块封装车辆从配送中心出发依次经过8个需求节点最后返回配送中心的过程。

自定义封装好的模块如下:

在这里插入图片描述

使用Mux模块合并输入数据(即10条染色体)组成形式上的种群,将输出结果采用To File模块存入initpopout.mat。

在这里插入图片描述

计算种群的适应度函数

将上一章节“确定种群结构”得到的输出序列存入Simulink的.mat文件,使用From File模块从initpopout.mat提取生成的种群结构作为输入,计算种群适应度函数的基本思想:使用Demux模块将1010的矩阵拆解成一维的110的列表,使用已经封装好的计算单条染色体的功能模块计算这个一维的1*10的列表,得到所有10条染色体的适应度函数(总运输距离的倒数)之后,再使用Mux模块合并列表作为一个输出信号,并且使用Min模块计算此时种群的最小运输距离。

在这里插入图片描述

主函数

本博客针对TSP问题只进行到种群生成及种群染色体的适应度函数计算,不涉及遗传算法进化迭代的选择、交叉及变异算子。

总结以上求解TSP问题的分解步骤,可以得到下图所示的总的模型:

在这里插入图片描述

参考文献:

1.Matlab读取excel文件中的数据
https://blog.csdn.net/qq_38826019/article/details/81184811
2.MATLAB-获取正在执行的m文件路径的方法
https://blog.csdn.net/qq_43278043/article/details/115922597
3.matlab函数-fullfile-将字符合并成路径
https://blog.csdn.net/weixin_37724055/article/details/109952562
4.matlab的输出(命令窗口、fprint函数、disp函数)
https://blog.csdn.net/caomin1hao/article/details/83996365
5.matlab 分割字符串、提取文件路径及文件名
https://blog.csdn.net/u012189747/article/details/86504693

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

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

相关文章

注解和反射04--类加载

类加载 Java内存分析了解类的加载过程类的加载与ClassLoader的理解什么时候会发生类的初始化 类加载器类加载器的作用 Java内存分析 了解类的加载过程 当程序主动使用某个类是,如果该类害未被加载到内存中,啧系统会通过下面三个步骤来对该类进行初始化 …

数字信号处理中的基本运算——加法运算

1. 一位全加器 2. 二进制加法原理 两个N位二进制补码相加,为防止溢出时导致计算结果错误,可将这两个加数先进行符号位扩展,变为N1位二进制数,然后相加,结果亦取N1位,可保证运算结果正确。 根据多位加法器…

互联网医院申办|线上问诊系统|互联网医院系统功能

随着互联网的快速发展,各行各业都在积极探索如何将互联网与自身服务相结合,实现数字化转型。互联网医院建设分院内与院外建设,院内建设是业务流程的优化过程,是系统改造的过程,是医院精细化运营的一部分,也…

基于Java+SpringBoot+vue前后端分离美容院管理系统设计实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

跑步适合戴什么样的耳机、最好的跑步耳机推荐

每个人对于运动的方式都不尽相同,但大多数热爱运动的朋友都离不开音乐的陪伴。运动和带有节奏感的音乐能够激发我们更多的热情和动力。特别是在夏日的时候,我非常喜欢跑步。在酷热的天气里,如果没有音乐的伴随,跑步会变得单调乏味…

【Vue3】BEM 架构和 Sass 语法

1. BEM 架构 BEM(Block, Element, Modifier)是一种命名约定,用于在编写 CSS 和 HTML 类名时创建可维护和可重用的样式。BEM 是一种常用的 CSS 命名规范,它的目的是减少样式之间的耦合,增加样式的可读性,并…

多目标优化:NSGA(Ⅱ)

多目标优化的基本概念 习多目标优化的过程中&#xff0c;其中涉及相关概念如下&#xff1a; Pareto 支配关系 (Pareto Dominance)&#xff1a;支配&#xff1a;对于多个目标值&#xff0c;随机自变量x1、x2&#xff0c;对于任意一个目标函数都存在f(x1)<f(x2)&#xff0c;则…

Vue 3:玩一下web前端技术(三)

前言 本章内容为VUE工作过程与相关使用讨论。 上一篇文章地址&#xff1a; Vue 3&#xff1a;玩一下web前端技术&#xff08;二&#xff09;_Lion King的博客-CSDN博客 下一篇文章地址&#xff1a; Vue 3&#xff1a;玩一下web前端技术&#xff08;四&#xff09;_Lion Ki…

视频监控综合管理平台EasyCVR向上级联时,上级一直回复401是什么原因?

视频监控管理EasyCVR视频融合平台基于云边端一体化架构&#xff0c;可支持多协议、多类型设备接入&#xff0c;具体包括&#xff1a;NVR、IPC、视频编码器、无人机、车载设备、智能手持终端、移动执法仪等。平台具有强大的数据接入、处理及分发能力&#xff0c;可在复杂的网络环…

SSM 书籍借阅管理系统【纯干货分享,免费领源码04770】

摘 要 随着科学技术的告诉发展&#xff0c;我们已经步入数字化、网络化的时代。图书馆是学校的文献信息中心&#xff0c;是为全校教学和科学研究服务的学术性机构&#xff0c;是学校信息化的重要基地。图书馆的工作是学校和科学研究工作的重要组成部分&#xff0c;是全校师生学…

向量距离度量中的几种计算公式

距离度量 衡量两条向量之间的距离&#xff0c;可以将某一张图片通过特征提取来转换为一个特征向量。衡量两张图片的相似度就可以通过衡量这两张图片对应的两个特征向量之间的距离来判断了。 1.欧式距离 欧式距离可以简单理解为两点之间的直线距离。对于两个n维空间点 a ( x…

实景三维在智慧矿山中的应用

项目背景 智慧矿山是以矿山数字化、信息化为前提和基础&#xff0c;对矿山生产、职业健康与安全、技术支持与后勤保障等进行主动感知、自动分析、快速处理&#xff0c;建设智慧矿山&#xff0c;最终实现安全矿山、无人矿山、高效矿山、清洁矿山的建设。 智慧矿山的可视化管理…

解决新版 Idea 中 SpringBoot 热部署不生效

标题 依赖中添加 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <opt…

组件开发系列--Apache Commons Chain

一、前言 Commons-chain是apache commons中的一个子项目,主要被使用在"责任链"的场景中,struts中action的调用过程,就是使用了"chain"框架做支撑.如果你的项目中,也有基于此种场景的需求,可以考虑使用它. 在责任链模式里&#xff0c;很多对象由每一个对象对…

纯nginx制作文件上传下载服务器

什么是webdav webdav 是一组超文本传输协议的技术集合&#xff0c;有利于用户键协同编辑和管理存储在万维网服务器文档。同时来说就是&#xff0c;webdav可以让用户直接存储&#xff0c;下载&#xff0c;编辑文件&#xff0c;操作文件需要进行用户认证 基于nginx快速搭建webdav…

ORA-00923: FROM keyword not found where expected

举个栗子呗&#xff0c;就是语法错误找不到“FROM”&#xff0c;也是少了逗号 数据库提示不精确 ERROR 1064 - You have an error in your SQL syntax&#xff1b;_spencer_tseng的博客-CSDN博客

倒立摆控制(SMART PLC串级PID控制)

专栏有好几篇倒立摆相关的文章,大家可以自行参考阅读,包括编码器角度测量以及一些模型介绍,这篇博客我们记录、介绍S7-200 SMART PLC进行倒立摆控制采用串级PID的调试过程。 1、倒立摆的串级PID控制 2、设置摆杆PID作用区域 角度作用区域,在其它文章有详细图示,大家可以…

文心一言 VS 讯飞星火 VS chatgpt (67)-- 算法导论6.5 6题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;67&#xff09;-- 算法导论6.5 6题 六、在 HEAP-INCREASE-KEY 的第 5 行的交换操作中&#xff0c;一般需要通过三次赋值来完成。想一想如何利用INSERTION-SORT 内循环部分的思想&#xff0c;只用一次赋值就完成这一交换操作? 文…

获取Bean的两种方法

简单获取Bean的两种方法 简单获取Bean的两种方法那么对于调用Bean对象时需要注意什么&#xff1f; 五大类注解自定义名称三种bean注入 简单获取Bean的两种方法 在之前使用spring时我们都是使用xml语句进行对象注入&#xff0c;而如果对于一个大型项目采用这种方法&#xff0c;…

Python_使用requests获取当当网榜单中的图书数据

使用requests获取当当网榜单中的图书数据 使用到的库概述发送请求xpath解析提取数据tips 完整代码 使用到的库 requestsetree 概述 主要抓取目标为 当当网图书畅销榜中近24小时畅销的图书信息 主要提取的数据为 排名、书名、评论数、推荐度、作者信息、出版时间、出版社、折扣…