本文为 “备战数模——Matlab学习打卡活动第三讲”公开课 的课件资料(2020 / 03 / 29)
主要内容:Matlab软件在数模竞赛中的应用经验分享 TSP问题 Floyd算法
B站录播链接:【MATLAB】备战数模—MATLAB公开课第三讲
课程资料、程序源代码链接: 点击获得百度网盘链接 提取码:1cds
欢迎关注我的B站账号:MayShrimp (bili_47198139034) 一只热爱航空的小虾米~
Part 1:MATLAB及其在数学建模中的应用简介
MATLAB简介
MATLAB 是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB是Matrix & Laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国Mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C/C++、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。
MATLAB使用体验(My Personal)
解释型语言(Interpreter),类似Python,语法自由,入门简单~
(与C/C++,Fortran等高级语言形成鲜明对比,不是编译器Compiler,但调试相对麻烦一些)
界面风格简约,用户交互友好,人性化设计
(Windows界面,经典舒服~提示、报错、信息交互功能齐全)
严格上是一款工程数学软件——数值计算强,矩阵、符号计算独特
(对高等数学、线性代数课后习题也是很好的验证工具~)
拥有极为丰富的函数库与Toolbox工具箱,“一行MATLAB代码顶一页其他语言代码”,一劳永逸~
(只有你想不到,没有MATLAB的APPs做不到:航空航天、生物医学、数学统计、计算机图像视觉、系统控制…… 以及二次开发,如谢菲尔德大学遗传算法工具箱等)
数据可视化能力极强,方便快捷
(绘图出图,句柄操作——海纳百川,傲视群雄)
The King of 数模软件,数模编程选手几乎必备技能
MATLAB在数学建模中的主要应用方面、应用方式与编程思想
主要应用方面
数据建模(常用,数据读写,数据拟合,数据可视化,……)
规划问题(线性规划,非线性规划,0-1整数规划,……)
预测模型(经典GM灰色预测模型,……)
评价模型(AHP算法,PCA主成分分析,模糊评价,……)
智能算法(遗传算法,模拟退火算法,人工神经网络算法,……)
系统仿真与图像处理(较少用到,如Simulink,GUI,……)
主要应用方式
编写代码脚本(函数).m文件,运行调试(最常用)
直接在命令行窗口编辑指令(用于数值计算和代码调试)
应用自带的Toolbox工具箱
常用编程思想
算法实现、计算机模拟与仿真优先;
能用内置函数,尽量使用,避免不必要的麻烦与浪费;
基于成熟源代码的二次应用与开发;
良好的编程习惯与风格,勤注释;
数据结构较为淡化,但不代表不重要。
Part 2:分析MATLAB在一道数模竞赛题中的应用
送货线路设计问题
问题的背景
随着社会的发展,网络的普及率越来越高,网购成为一种新兴的消费方式。随之物流行业也渐渐兴盛,每个送货员需要以最快的速度及时将货物送达,而且他们往往一人送多个地方,请设计方案使其耗时最少。
问题的相关信息
现有一快递公司,库房在图1的O点,一送货员需将货物送至城市内多处,请设计送货方案,使所用时间最少。假定送货员只能沿这些连通线路行走,而不能走其它任何路线。该地形图的示意图见图1,各点连通信息见表3,各件货物的相关信息见表1,50个送货点的坐标见表2。
假定送货员最大载重50公斤,所带货物最大体积1立方米。送货员的平均速度为24公里/小时。假定每件货物交接花费3分钟,为简化起见,同一地点有多件货物也简单按照每件3分钟交接计算。
现在送货员要将100件货物送到50个地点,如图1所示。

图1 快递公司送货地点示意图 需要解决的问题
问题一:将1~30号货物送到指定地点并返回。要求设计最快完成路线与方式,给出结果并标出送货线路。
问题二:假定该送货员从早上8点上班开始送货,且1~30号货物的送达时间不能超过它们的指定送达时间。要求设计最快完成路线与方式并标出送货线路。
问题三:若不需要考虑所有货物送达时间限制(包括前30件货物),现在要将100件货物全部送到指定地点并返回。要求设计最快完成路线与方式,标出送货线路并给出送完所有快件的时间。由于受重量和体积限制,送货员可中途返回取货。不考虑送货员中午休息的时间。
以上问题求解尽可能给出模型与算法。
题目思路分析
整体思路分析
这是一道结合图论与优化策略相结合的经典数学建模问题。问题设置层层递进,从最基本的NP-Hard旅行商问题(详见[注1])出发,分别增加时间限制与扩大问题规模,需要综合考虑各类送货情形。合理的分组,图论基本模型以及优化算法是解决问题的关键。
(注1:旅行推销员问题(英语:Travelling Salesman Problem, TSP)是这样一个问题:给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。它是组合优化中的一个NP难问题,在运筹学和理论计算机科学中非常重要。最早的旅行商问题的数学规划是由Dantzig(1959)等人提出,并且是在最优化领域中进行了深入研究。许多优化方法都用它作为一个测试基准。尽管问题在计算上很困难,但已经有了大量的启发式算法和精确方法来求解数量上万的实例,并且能将误差控制在1%内。)
问题一分析
关键词:TSP问题(旅行商问题);Floyed最短路算法;0-1规划。本问要求送货员以最快的速度将1~30号货物送到指定地点并返回,需要送货达到的位置标注如图2所示。在行驶速度一定的情况下,要求送货的最短时间,即要求行驶的最短距离。为了求得最快完成的路线,由于此题只涉及到30件货物,规模较小,故可建立基于TSP问题的0-1规划模型。首先根据表2所给数据,利用MATLAB计算出所给指定路线中任两点之间的距离,构建矩阵 \(d_{ij}\) , *表示\(i\)点和\(j\)点之间的距离,若\(i\)点和\(j\)点不连通,则将 \(d_{ij}\) 设定为无穷大(INF)。接着,用Floyd算法算得任意两点间的最短路径,并构建出包含O点在内的51个送货点的完全图 \(G = (V,E)\) ,即将该问题转化成用图论描述的TSP问题。然后采用0-1规划的方法,并利用LINGO软件进行求解。最终得到最快完成路线,并利用MATLAB绘制最优路线图,如图3所示。
问题一:结果展示

图2 问题一:21个送货点示意图 
图3 问题一:最优送货路线示意图 问题二分析
关键词:增加时间约束;分组策略;贪心算法。本问假定该送货员从早上8点上班开始送货,且1~30号货物的送达时间不能超过它们的指定送达时间,在问题一中建立的模型上添加了对时间的约束。首先按照配送时间的先后,将1~30号货物分为四组,并根据这些货物的送达地点,将配送路线分为四段,依次进行配送,如图4所示。接着以行驶总路程最短为目标,设置了每段路线的起点和终点。以第一段路线为例,将离快递公司O点最近的点设为起点,将离第二段路线所在区域最近的点设为终点,并画出配送路线图。然后,考虑到第四段路线涉及到的送货点较多,采用贪心算法来求解该段的最优配送路径,并用MATLAB实现,最终得到最快完成路线,如图5所示。
问题二:结果展示

图4 问题二:区域划分示意图 
图5 问题二:最优送货路线示意图 问题三分析
关键词:最小生成树;分组策略;蚁群算法。本问不考虑所有货物送达时间限制(包括前30件货物),将100件货物全部送到指定地点并返回。由于所有货物的总重量为148公斤,总体积为2.8立方米,需要考虑将货物分若干次运送,但采取一般方法寻找最快的完成路线较为困难。考虑将问题三分解为问题一来求解。在问题一中,不考虑货物的重量和体积的限制,可将其看作是问题三的极限情况。首先,用没有重量和体积限制的近似最优解和图G的最小生成树来进行分组(如图6所示),分组后每组都满足体积和重量的约束,即每组都一次性送完,中途不再回去取货。接着,由于问题规模增大,考虑采用对组合统筹优化问题处理非常有效的智能算法,可利用MATLAB实现蚁群算法,对每一组送货路线分别进行TSP问题求解,且大幅提升计算效率。最终得出每组的最快送货时间,并绘制送货线路如图7所示。
问题三:结果展示

图6 问题三:区域最小生成树示意图

图7 问题三:最优送货路线示意图 本题中MATLAB使用技巧(结合演示+依次介绍)
数据导入策略 (怎样导入题设数据,Excel?.txt文本文档?)
基本算法实现 (图论最短路Floyed算法,Trim/Kruskal最小生成树)
智能算法应用 (抽象出模型后,如何使用蚁群算法)
结果可视化操作 (怎样绘制美观、整洁的图片,导出技巧)
源代码分析与展示(结合MATLAB软件实际操作)
注意编程方法,注释技巧
灵活使用MATLAB函数
调试、查错技巧
Part 3:分享有关MATLAB其他有趣的小技巧与心得
Tip 1:不懂就“问”——help, doc, lookfor, demo指令
Tip 2:无用就“删”——clear all, clf, clc指令
Tip 3:神奇的“右除”——“\”运算符(Ax=B ; x=A\B)
Tip 4:矩阵运算留意“点”——“.*”“./”点乘、点除指令
Tip 5:调试聚焦“波浪号”——快速发现代码Bug
Tip 6:调试代码,工作区(Workspace)作用很大
Tip 7:叠加作图需要“hold on”
Tip 8:善用绘图工具“修饰”图形
Tip 9:导出代码,中文乱码怎么办?
Tip 10:官网教程,权威全面
Part 4:推荐教材 & 答疑
MATLAB软件内容包罗万象,我也仍在学习阶段,如有不足之处请大家指正!推荐几本我觉得比较不错的MATLAB教材与比较好的学习资源,大家可以参考一下啦。
MATLAB 学习教程推荐
《MATLAB教程》——MATLAB入门推荐
张志涌, 杨祖樱. MATLAB教程[M]. 北京: 北京航空航天大学出版社, 2010: 202-216.
Mathworks官方推荐理由:
本书以MATLAB R2014a中、英文版为编写基础,系统讲解MATLAB基本环境和操作要旨;分章阐述符号计算、数值计算、计算结果可视化及编程精要;选例展现MATLAB净化工具Simulink的功能级和元器件级仿真能力;范例剖析MATLAB版面编辑器的用法和图形用户界面(GUI)的制作要领;简扼勾画MATLAB和Word集成一体的Notebook环境。
本书是专为理工科院校本科生系统学习MATLAB而撰写的,也可供部分研究生使用;既可用做教材、课程设计和毕业设计参考书,也可作为自学用书。
个人推荐理由:
内容全面,例题丰富,语言凝练,通俗易懂~
非常适合刚刚接触MATLAB的初学者
可供编程参考,推荐将书后例题都做一下,非常有用!
《MATLAB在数学建模中的应用》——适合进阶选手
卓金武. MATLAB在数学建模中的应用 [M].2版. 北京:北京航天航空大学出版社, 2014.
Mathworks官方推荐理由:
全书内容分上下两篇。上篇介绍了数学建模中常规方法(拟合、AHP)、规划模型、数据建模(云模型、logistic、主成分分析、支持向量机、K均值、 朴素贝叶斯)、灰色预测的MATLAB实现,还介绍了各种高级方法的MATLAB实现,包括遗传算法、模拟退火算法、人工神经网络、粒子群算法、蚁群算法、小波和计算机仿真。下篇以数学建模赛题为案例,介绍如何用MATLAB求解实际的数学建模问题,给出了详细的建模过程和MATLAB源程序。书中的附件部分介绍了作者在建模竞赛中屡获大奖的经验。
本书特别适合作为数学建模竞赛的培训教材或参考用书,也可作为大学“数学实验”和“数学建模”以及“数据挖掘”课程的参考用书,还可作为广大科研人员、学者、工程技术人员的参考用书。
个人推荐理由:
代码丰富,案例典型,适合二次开发
关于智能算法应用介绍全面
适合对MATLAB比较熟悉的同学使用,进阶版教程
《实用数学建模与软件应用》
肖华勇. 实用数学建模与软件应用 [M]. 西安:西北工业大学出版社, 2014.
个人推荐理由:
西工大肖老师编写,内容层层深入,案例非常丰富
肖老师作为数学建模竞赛教练,长时间的经验与心得结晶
对优化和规划方法介绍地特别详细!
其他书籍
《数学建模算法与应用》司守奎著,国防工业出版社
推荐理由:案例详实,大量源代码可供参考
《MATLAB智能算法30个案例分析(第2版)》,北京航空航天大学出版社
推荐理由:智能算法案例丰富,大量源代码可供参考
Mathworks图书计划系列,清华大学出版社
推荐理由:MATLAB丛书系列,比较专业权威
MATLAB 学习资源推荐
MathWorks Home 官方网站,官方指南(可下载)
Link: MathWorks Home
中国大学MOOC课程
Link: 数学建模
Up主在线公开课资源
优质公众号与论坛