数学建模期末速成 最短路径

article/2025/7/2 11:15:30

关键词:Dijkstra算法 Floyd算法

例题

已知有6个村庄,各村的小学生人数如表所列,各村庄间的距离如图所示。现在计划建造一所医院和一所小学,问医院应建在哪个村庄才能使最远村庄的人到医院看病所走的路最短?又问小学建在哪个村庄使得所有学生上学走的总路程最短?

村庄 v 1 v_1 v1 v 2 v_2 v2 v 3 v_3 v3 v 4 v_4 v4 v 5 v_5 v5 v 6 v_6 v6
小学生人数/个504060207090

在这里插入图片描述

一、 问题重述

在6个村庄构成的交通网络中,已知各村小学生人数及村庄间道路距离。现需解决两个优化问题:
​​医院选址​​:确定一个村庄建立医院,使得离医院最远村庄的就医路径最短。
​​小学选址​​:确定一个村庄建立小学,使得全体学生上学总路程最短。

二、 问题分析

​​医院选址问题​​属于​​最小化最大距离​​问题,需计算各候选点到其他所有点的最短距离中的最大值,再选择使该值最小的位置。

​​小学选址问题​​属于​​加权最短路径和​​问题,需计算各候选点到所有生源村的加权距离和(权重为各村学生数),选择总和最小的位置。

三、 符号说明

符号含义单位
V V V村庄集合 { v 1 , . . . , v 6 v_1,...,v_6 v1,...,v6}-
E E E边集合(道路连接关系)-
W W W邻接矩阵(道路距离)-
d ( i , j ) d(i,j) d(i,j)村庄 v i v_i vi v j v_j vj 的最短距离-
s i s_i si村庄 v i v_i vi 的学生人数-

四、 模型假设

  1. 道路网络为无向图,距离对称
  2. 最短路径计算不考虑交通拥堵等动态因素
  3. 学生人数固定且全部就近入学

五、 模型建立与求解

模型建立:

1. 图论建模
构造赋权图 ,邻接矩阵为:
W = [ 0 2 7 ∞ ∞ ∞ 2 0 4 6 8 ∞ 7 4 0 1 3 ∞ ∞ 6 1 0 1 6 ∞ 8 3 1 0 3 ∞ ∞ ∞ 6 3 0 ] W=\begin{bmatrix}0&2&7&\infty&\infty&\infty\\2&0&4&6&8&\infty\\7&4&0&1&3&\infty\\\infty&6&1&0&1&6\\\infty&8&3&1&0&3\\\infty&\infty&\infty&6&3&0\end{bmatrix} W= 02720468740136101683103630

2. 最短路径计算
应用Floyd算法求得全源最短距离矩阵 :
d = [ 0 2 6 7 8 11 2 0 4 5 6 9 6 4 0 1 2 5 7 5 1 0 1 4 8 6 2 1 0 3 11 9 5 4 3 0 ] d=\begin{bmatrix}0&2&6&7&8&11\\2&0&4&5&6&9\\6&4&0&1&2&5\\7&5&1&0&1&4\\8&6&2&1&0&3\\11&9&5&4&3&0\end{bmatrix} d= 02678112045696401257510148621031195430
3. 医院选址分析
计算各列最大值:
最大值向量 = [ 11 , 9 , 6 , 7 , 8 , 11 ] [11,9,6,7,8,11] [11,9,6,7,8,11]
最小值6对应的 ​ v 3 v_3 v3 为最优选址。

4. 小学选址分析
计算加权总路程:
总路程向量 = [ 2130 , 1670 , 1070 , 1040 , 1050 , 1500 ] [2130,1670,1070,1040,1050,1500] [2130,1670,1070,1040,1050,1500]
最小值1040对应的 ​ v 4 v_4 v4 为最优选址。

例题求解代码

import numpy as np
import networkx as nx# 初始化参数
n = 6
node = ['v' + str(i) for i in range(1, n+1)]
students = [50, 40, 60, 20, 70, 90]# 构建邻接矩阵
A = np.zeros((n, n))
A[0, [1, 2]] = [2, 7]        # v1连接v2(2),v3(7)
A[1, [2, 3, 4]] = [4, 6, 8]  # v2连接v3(4),v4(6),v5(8)
A[2, [3, 4]] = [1, 3]        # v3连接v4(1),v5(3)
A[3, [4, 5]] = [1, 6]        # v4连接v5(1),v6(6)
A[4, 5] = 3                  # v5连接v6(3)
A = np.maximum(A, A.T)       # 保证对称性# 计算最短路径
G = nx.from_numpy_array(A)
d = nx.floyd_warshall_numpy(G)# 医院选址分析
max_distances = np.max(d, axis=0)
hospital = node[np.argmin(max_distances)]# 小学选址分析
weighted_dist = np.dot(d.T, students)
school = node[np.argmin(weighted_dist)]print(f"医院最佳选址: {hospital}")
print(f"小学最佳选址: {school}")

http://www.hkcw.cn/article/bBqQNiXCun.shtml

相关文章

MonitorSDK_监测用户行为(点击、页面路由变化、页面浏览量变化)

点击事件监测 为了实现用户点击事件的监控和数据埋点,可以通过监听全局的 mousedown 和 touchstart 事件,收集用户交互数据,并将其上报到服务器。 export default function onClick(){[mousedown, touchstart].forEach( eventType > { …

NE555输出PWM驱动NMOS控制灯光电路Multisim仿真

仿真电路: 遇到的一些问题: 1、NE555怎么产生PWM波形? 解: 555定时器频率计算器_555定时器频率在线计算_电路参数计算 - 电子发烧友(www.elecfans.com) 这个在线工具可以通过设定频率、占空比、电阻,从而求出电阻值…

ThinkPrune:在RL中引入长度限制,在保持性能一致或略有提升下,显著提升推理效率

摘要:我们提出了THINKPRUNE,这是一种简单而有效的方法,用于缩短长思考型大语言模型(LLMs)的思考长度。这些模型被发现常常会产生低效且冗余的思考过程。现有的关于减少思考长度的初步探索主要集中在迫使思考过程提前结…

重温经典算法——堆排序

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 基本原理 堆排序是一种基于二叉堆的排序算法,时间复杂度为O(n log n)。堆排序核心步骤包括构建最大堆和反复取出堆顶元素排序:首先从最后一个非叶子…

PyTorch——卷积层(3)

conv_arithmetic/README.md at master vdumoulin/conv_arithmetic GitHub out_channel1 out_channel2

5.29 自学测试 Linux基础 Day4

一、Linux操作系统介绍 1.操作系统介绍: 管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。 2.常见的操作系统 桌面操作系统:Windows系列、Linux、MacOS 嵌入式操作系统:Linux 服务器操作系统&#x…

推荐一款使用html开发桌面应用的工具——mixone

简介 mixone是开发桌面应用(Win、Mac、Linux)的一款工具、其基于electron实现。其拥有简单的工程结构。以为熟悉前端开发的程序员可以很轻松的开发出桌面应用,它比electron的其他框架更简单,因为那些框架基本上还需要了解electro…

leetcode hot100 二叉树(二)

书接上回:https://blog.csdn.net/weixin_74129837/article/details/148367615?spm1001.2014.3001.5501 8.验证二叉搜索树 维护一个min_val和max_val,限制当前结点的合法值范围。min_val和max_val动态变化。 class Solution { public:bool check(Tree…

【Linux】基础文件IO

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 前言 无论是日常使用还是系统管理,文件是Linux系统中最核心的概念之一。对于初学者来说,理解文件是如何被创建、读取、写入以及存储…

MYSQL MGR高可用

1,MYSQL MGR高可用是什么 简单来说,MySQL MGR 的核心目标就是:确保数据库服务在部分节点(服务器)发生故障时,整个数据库集群依然能够继续提供读写服务,最大限度地减少停机时间。 2. 核心优势 v…

【java面试】MySQL篇

MySQL篇 一、总体结构二、优化(一)定位慢查询1.1 开源工具1.2Mysql自带的慢日志查询1.3 总结 (二)定位后优化2.1 优化2.2 总结 (三)索引3.1 索引3.2 索引底层数据结构——B树3.3 总结 (四&#…

头像预览和上传

在写一个项目的时候,遇到了头像修改这个功能的需求,在最开始的学习中发现可以通过type为file的input文件读取图片,然后将其转换为DataUrl格式,最终作为Ima元素的src即可在页面上展示图片。但到后面开始写交互的时候发现DataUrl格式…

解锁效率新高度:Agent Zero智能助手框架

探索Agent Zero AI框架:您的个性化智能助手 在迅速发展的科技世界,Agent Zero AI框架为我们揭开了一个全新的大门。被设计成能够与用户同步成长与学习的智能助手,Agent Zero展现了它作为个性化使用工具的非凡潜力。在本篇文章中,…

第43节:Vision Transformer (ViT)视觉领域的革命性架构

1. ViT的诞生背景与核心思想 Vision Transformer (ViT) 是2020年由Google Research团队提出的一种革命性计算机视觉架构,它将自然语言处理(NLP)领域中大获成功的Transformer模型引入到计算机视觉任务中。这一创新彻底改变了传统卷积神经网络(CNN)在视觉任务中的主导地位,为图…

leetcode0513. 找树左下角的值-meidum

1 题目:找树左下角的值 官方标定难度:中 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 示例 2: 输入: [1,2,3,4,null,5,6,null,null,7]…

从webshell管理工具(蚁剑 冰蝎 哥斯拉 菜刀 哥斯拉等)程控制主机后,再将这个控制能力上线到MSF 为什么要这么做了?一篇文章告诉你

目录 一、为什么Webshell管理工具需要上线到Metasploit? 什么情况下需要上线到Metasploit? 二、常见Webshell管理工具及上线Metasploit的步骤 1. 蚁剑(AntSword)上线到Metasploit 上线步骤: 实际案例&#xff1a…

【Ragflow】24.Ragflow-plus开发日志:增加分词逻辑,修复关键词检索失效问题

概述 在RagflowPlus v0.3.0 版本推出之后,反馈比较多的问题是:检索时,召回块显著变少了。 如上图所示,进行检索测试时,关键词相似度得分为0,导致混合相似度(加权相加得到)也被大幅拉低,低于设定…

YOLOv5 :训练自己的数据集

- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/rnFa-IeY93EpjVu0yzzjkw) 中的学习记录博客** - **🍖 原作者:[K同学啊](https://mtyjkh.blog.csdn.net/)** 我们接着上一篇文章配置完YOLOv5需要的环境后&#…

【Unity】云渲染

1 前言 最近在搞Unity云渲染的东西,所以研究了下官方提供的云渲染方案Unity Renderstreaming。注:本文使用的Unity渲染管线是URP。 2 文档 本文也只是介绍基本的使用方法,更详细内容参阅官方文档。官方文档:Unity Renderstreamin…

每日一道面试题---ArrayList的自动扩容机制(口述版本)

首先,ArrayList是基于动态数组实现的,它的容量是可以动态增长的,ArrayList的默认容量是10,当我们向ArrayList中插入一个数据时,第一步,会先进行一个条件的校验操作,先去判断ArrayList是不是一个…