数学建模----单源最短路径模型建立和求解

目录

1.引言和声明

2.单源最短路径

3.建立模型

4.代码求解


1.引言和声明

(1)最近又在准备学习matlab,有了一些新的理解和体会,记录一下;

(2)这个首先要声明两个符号,这两个符号也是今天才知道两者之间的区别;

就是在Matlab里面,我们经常使用%作为标记,一个百分号就是普通的注释,两个百分号就是表示的对于这个编辑器的文本分割,把这个代码分割成为不同的部分,这个其实是有快捷键的,但是我之前尝试过,不是很好记,我觉得这个输入两个百分号之后,使用这个enter之后就可以自动实现这个区域的划分,还是很方便的;

2.单源最短路径

(1)任意单元最短路径的子路径还是最短路径,这个原理就是迪杰斯特拉算法的贪心算法原理;

(2)单元最短路径的赛题介绍:这个本质上就是单元最短路径,但是实际应用的时候这个不仅仅局限于求这个路径问题,像我们下面展示的这个设备的更新问题,本质上就是进行求解这个单源最短路径,两者的思路和方法是一致的,可能初学者体会不到这一点,但是我们可以慢慢理解;

 

(3) 这个题干上面的要求就是这个有一台设备,这个设备在年初的时候需要决定是买新的还是维修之后继续使用,目标函数就是五年之后的这个总的费用最小;

买新的设备需要支付钱,但是维修旧的设备也是需要花钱的,而且随着这个设备的使用时间的增加,这个设备的维修成本就会越来越高,这个费用就会越来越多,但是每一年这个购买新的设备的成本是波动不大的,这个时候我们就需要进行考虑支付的费用的问题,这个如何进行这个选择,是维修还是购买新的设备,才可以让这个支付的费用最少;

3.建立模型

(1)要想让这个最小费用的问题和我们前面介绍的这个单源最短路径问题结合起来,这个时候我们就要把这个条件之间相互匹配,如何进行这个匹配,首先就是我们的这个单源最短路径上面有的是这个路径的长度和路径的权重,我们在计算这个问题的时候,就是用这个权重,这个模型里面的最短路径肯定就是我们求解时候的这个最小的支付费用,这个是毋庸置疑的;

(2)但是这个设备的维修以及这个重新购买如何与这个模型里面的已知的直观量建立联系,这个是我们遇到的比较棘手的问题;

我们把这个实际问题抽象成一个数学问题,使用这个图表示这个关系,如下图所示:

(3)这个图里面的顶点就代表着年,这里一共是6个顶点,分别代表着第一年年初,第二年年初,第三年年初,第四年年初,第五年年初,第五年年末,一条边链接两个顶点,这个意义就是其实顶点年份买,终止顶点结束使用(就是一直用到这个时间停止),这个我们在第五年的时候也在使用,因此我们设置了第六个顶点代表我们的第五年年末,如果只有5个顶点的话,这个第五年的使用没有办法显示,因此我们设计了六个顶点;

(4)这个邻接矩阵也需要我们仔细的理解,为什么主对角线下面的元素都是无穷,上面的元素有具体的值,主对角线元素是0,这个就和这个问题的实际意义相关,因为这个我们这个矩阵元素表示的意义就是第i年买进设备,第j年停止使用,我们举一个例子,例如这个矩阵里面的第三行元素,表示我们使第三年买的设备,这一行的第一个元素表示的就是第一年结束使用,这个肯定是不存在的,同理第二个也是不存在的,这个数值表示的就是购买费用和维修费用的和,这两个不存在,我们使用无穷表示 ,自己到自己 就是使用0进行表示的,那么我们第三年购买,就只能使用到第四年,第五年,第六年,所以第三行上面只有这个三个位置元素有具体的数值;

(5)这个数值是怎么进行计算的,

以这个第三行第六个数据为例,这个表示的就是第三年购买,使用到第六年,购买费用加上这个维修费用表示的就是这个位置的数值,这个费用是28,就是第三年购买费用费用12,加上维修费用,使用第一年,也就是第三年(因为是第三年购买的)需要费用4,使用第二年,就是第四年,需要费用5,使用第三年,也就是第六年,维修费用7,这个加起来就是28,同理可以得到其他的这个费用;

(6)需要注意的就是,在amtalb里面写代码的时候,这个正无穷是使用0进行写进代码的,这个里面我们只是写无穷给读者们看的,我们写0是给这个matlab看的,这个针对不同的对象,我们的这个数字的表现形式也是不一样的;

4.代码求解

(1)这个部分,我们就要使用相关的函数把这个数学语言转化为代码,让这个计算机帮助我们进行这个模型的求解,首先我们肯定是要把这个邻接矩阵表示出来的 ,我们的方法就是

我们上面已经说过,在这个matlab里面,我们把所有的无穷使用0表示,使用无穷反而影响这个matlab的运算;

这个我们现实生成了一个6行6列的邻接矩阵,全部是0,我们再去进行相应的修改,把不是0位置元素修改为指定的数值,这个里面的修改方法简体提一下,这个中括号里面就是一个索引,表示的就是从第几个到第几个的意思;

(2)接下来就是调用函数做出图形

这个18行里面的两个参数也可以写一个,第二个就是为了表示这个顶点(对于顶点的修饰);

cellstr就是把这个顶点的名字放到一个元胞里面去,s可以作为digraph函数的一个参数,digraph函数就是生成一个图论里面的有向图,结果会显示出来;

 

plot就是作图的指令,里面的参数就是修饰作用,只传递进去一个G也是可以的,感兴趣可以自己查阅后面的其它参数,G就是上面我们的有向图;

highlight就是对于这个图里面的点和线之间突出一下显示而已,这个也是可以复用的,感兴趣可以自行查阅,最后把这个d,path打印出来, d就是这个全部的费用,path就是路径;

(3)问题回答

这个结果表示1 3 6就是路径,说明实际里面就是第一年购买,第三年再换新设备,6表示的就是第五年的年末,就是使用到第五年的年末,这个时候费用最少,为48万元,这个就是这个实际问题的解答,我们需要把这个代码计算结果转换为我们这个题目的已知量信息表示说明;

(4)matlab代码

感兴趣可以自测:

a=zeros(6);
a(1,[2:6])=[15 20 27 37 54];
a(2,[3:6])=[15 20 27 37];
a(3,[4:6])=[16 21 28];
a(4,[5:6])=[16 21];
a(5,6)=17%给每个顶点设置名称,放到这个元胞s里面去;%int2str函数表示的就是把这个数字转换为字符;
% 这个函数我们会使用,也存在这个str2int函数,作用相反%strcat函数就是把这个字符串水平的串联起来s=cellstr(strcat('顶点',int2str([1:6]')));%这个代码就是让这个顶点和1~6数字串联起来%这里进行转置,不转置v1 2 3 4 5 6这个效果G=digraph(a,s);%调用函数生成有向图,第一个参数是矩阵,就是边的权重,第二个参数就是顶点p=plot(G,'layout','force','EdgeColor','k','NodeFontSize',12);[path,d]=shortestpath(G,1,6);highlight(p,path,"EdgeColor","red","LineWidth",2.5);d,path

 

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

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

相关文章

网络安全筑基篇——CSRF、SSRF

前言 本篇文章相对于来说比较水,大家看不懂的话,多去百度,去了解相关的知识 大家一定要多去理解这个原理,理解的同时去打打靶场,就能很快上手啦 什么是CSRF? CSRF(即跨站请求伪造)是指利用受…

conda下安装32位版本python

前言:当前主流的系统为64bit系统,conda软件为64bit软件,因此使用conda创建虚拟环境安装python时默认安装的python为64bit版本,但部分研发场景需要调用32bit依赖,只能使用32bit的python,因此需要安装32bit的…

在 Ubuntu 下使用 rabbitmq-c 库进行 RabbitMQ 消息收发的完整示例代码如下

在 Ubuntu 下使用 rabbitmq-c 库进行 RabbitMQ 消息收发的完整示例代码如下。这个示例将包括声明队列、绑定路由键、发送消息、消费消息等步骤,并且会包含错误处理。 安装 rabbitmq-c 库 首先确保已经安装了 rabbitmq-c 库。可以通过以下命令在 Ubuntu 上安装: sudo apt-get …

git创建子模块

有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。 也许是第三方库,或者你独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。 Git …

【因果推断python】44_评估因果模型2

目录 累积弹性曲线 累积增益曲线 考虑差异 关键思想 累积弹性曲线 再次考虑将价格转换为二元处理的说明性示例。我们会从我们离开的地方拿走它,所以我们有弹性处理带。我们接下来可以做的是根据乐队的敏感程度对乐队进行排序。也就是说,我们把最敏感…

spring中@Conditional

多环境切换 java配置使用profile Profile设置在某个环境下,spring注入对应的bean public class JavaConfig {BeanProfile("dev")DataSource devDs(){DataSource ds new DataSource();ds.setUrl("dev");ds.setUsername("dev");ret…

2024年了,C++还值得学吗?6个C++的就业方向打消你的疑虑

C语言是一种广泛应用于计算机编程的高级编程语言,自从其首次问世以来,就在软件开发领域取得了广泛的应用和成功。作为一种强大的编程语言,C语言不断发展和改进,也在不断地适应新的技术和需求。在未来几年,C语言将继续保…

计算机视觉全系列实战教程:(十一)边缘检测(差分、Roberts、Sobel、Prewitt、LoG、基于形态学的边缘检测等)

1.边缘检测概述 (1)What 边缘检测:找到有差异的相邻像素锐度:边缘的对比度图像锐化:增加边缘的对比度边缘点:图像中灰度显著变化的点边缘段:边缘点坐标及方向的总和,边缘的方向可以是梯度角轮廓&#xff…

手把手!从头构建LLaMA3大模型(Python)

1. 前期准备 让我们先来想一想大概需要做什么。 首先是模型架构的选择。原工作用的是 GPT Neo 架构(可以看他们的 config),这个算是很老的模型了,最初是 EleutherAI 用来复现追踪 GPT-3 的工作的,现在用的也比较少了…

洛谷 P1726:上白泽慧音 ← Tarjan算法

【题目来源】https://www.luogu.com.cn/problem/P1726【题目描述】 在幻想乡,上白泽慧音是以知识渊博闻名的老师。春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄。因此慧音决定换一个能够聚集最多人数的村庄作为新…

鸿蒙开发组件:【创建DataAbility】

创建DataAbility 实现DataAbility中Insert、Query、Update、Delete接口的业务内容。保证能够满足数据库存储业务的基本需求。BatchInsert与ExecuteBatch接口已经在系统中实现遍历逻辑,依赖Insert、Query、Update、Delete接口逻辑,来实现数据的批量处理。…

redis复习

redis知识点 redis持久化redis 订阅发布模式redis主从复制哨兵模式redis雪崩,穿透缓存击穿(请求太多,缓存过期)缓存雪崩 redis持久化 redis是内存数据库,持久化有两种方式,一种是RDB(redis dat…

【计算机网络】[第4章 网络层][自用]

1 概述 (1)因特网使用的TCP/IP协议体系(四层)的网际层,提供的是无连接、不可靠的数据报服务; (2)ATM、帧中继、X.25的OSI体系(七层)中的网络层,提供的是面向连接的、可靠的虚电路服务。 (3)路由选择分两种: 一种是由用户or管理员人工进行配置(只适用于规…

图解Linux内核(基于6.x):解读Linux内存反向映射之匿名映射

文章目录 📑前言一、匿名映射的mapping二、推荐阅读2.1 一图速览2.2 内容简介 📑前言 内存映射中,我们经常讨论的是由虚拟内存定位物理内存(也就是folio或者page),实际上在很多场景中(比如内存回…

linux写代码环境和工具

基础指令 目录 前言 二、yum工具的使用 1.yum是什么? 2.查看软件包 3.配置sudo 4.如何卸载软件 三、vim的使用 1. vim的基本概念 2. vim的基本操作 3. vim正常模式命令集 4.简单vim配置 四、Linux编译器-gcc/g使用 1、格式 2、gcc选项 3.gcc/g工作和…

浅谈Java23种设计模式之11种行为型模式的使用场景(第三部分)

前言 行为型设计模式实际使用场景第三部分; 1.状态模式(State) 概念: 它允许对象在其内部状态改变时改变它的行为,对象看起来好像修改了它的类。这种模式主要用于当一个对象的行为依赖于它的状态(对象的状态改变,行…

专业技能篇--算法

文章目录 前言经典算法思想总结一、贪心算法二、动态规划三、回溯算法四、分治算法 前言 这篇简单理解一些常见的算法。如果面试的时候问到相关的算法,能够应付一二。 经典算法思想总结 一、贪心算法 思想:贪心算法是一种在每一步选择中都采取在当前状…

Python——Gradio

什么是 Gradio? Gradio 是一个开源的 Python 库,用于创建用户友好的、交互式的网页界面。这个界面可以用来展示和测试机器学习模型,或者任何需要用户输入的 Python 应用程序。Gradio 的目标是让开发者快速地将他们的机器学习模型部署为可供他…

Vue CLI,Vue Router,Vuex

前言 Vue CLI、Vue Router 和 Vuex 都是 Vue.js 生态系统中的重要组成部分,它们在构建 Vue 应用程序时扮演着关键角色。 Vue CLI Vue CLI 介绍 Vue CLI 是 Vue.js 的官方命令行工具,用于快速搭建 Vue.js 项目。它提供了一个图形界面(通过…

Effective C++ 改善程序与设计的55个具体做法笔记与心得 1

一. 让自己习惯C 1. 视C为一个语言联邦 2. 尽量以const, enum, inline替换#define #define CALL_WITH_MAX(a,b) f((a) > (b) ? (a) : (b))int a 5 , b 0;CALL_WITH_MAX(a,b); // a 6, b 0 CALL_WITH_MAX(a,b10); // a 8, b 0你观察到的这个现象是由于宏替换(C prep…