数模练习题:关于某市的乡村建设问题
发现了一道较为入门的练习题,分享给大家:

【腾讯文档】某市乡村数据
https://docs.qq.com/sheet/DWVJqRHZZUmNvSURl
部分数据如下图:

下面是花了不到三个小时编写的代码(运行环境:MATLAB2021b,低版本请自行测试),仅大致做了一遍,解题思路和最终计算出来的答案仅供大家参考,可能有错误之处大家自行甄别:
(1)第一问绘制图形,这里首先需要导入excel的数据,由于数据为表格形式,且数值型和文本型夹杂,因此这里导入为table类型。由于有三类不同的村庄,因此这里分别将这三类村庄的坐标以及名称保存为单独的变量。画图的难点在于如何将相邻的两个村庄进行连线,这里的代码大家可以仔细阅读。

(2)第二问实际上是图论中一个非常经典的问题:最小生成树问题,没学过的同学可以自行百度。这里我们需要先生成MATLAB中的无向图对象,然后直接调用内置的minspantree函数就能得到最小生成树。
下图红色的即为管道的铺设路线



(3)第三问问的有点奇怪:确定医院建设在哪个村庄使得所有居民去医院走的总路程最短。。。不难看出,这是一个规划问题,且可能性是有限的,我们就是把所有的村庄枚举一遍,即让医院分别在每个村庄建设,看哪种情况下是最优解。问题是这里的目标函数,这里给出我对于目标函数的定义:求出各村庄到医院的最短路径乘以这个村子的人数,将这个结果进行求和。
在这种定义下,我给出一种很简单的代码写法,只有四行,这种写法能避免循环加快运行速度,如果你能看懂那说明你的MATLAB基础很扎实:

这里的核心是distances函数:
返回矩阵 d
= distances(G
)d
,其中 d(i,j)
是节点 i
和节点 j
之间的最短路径的长度。
大家可以查看MATLAB官网的帮助文档:https://ww2.mathworks.cn/help/matlab/ref/graph.distances.html
结果表明,当医院设立在V1时,能够使目标函数最小(事实上V1也在图中的中心位置,这也暗示我们的结果应该没太大问题)