數(shù)模練習(xí)題:關(guān)于某市的鄉(xiāng)村建設(shè)問題
發(fā)現(xiàn)了一道較為入門的練習(xí)題,分享給大家:

【騰訊文檔】某市鄉(xiāng)村數(shù)據(jù)
https://docs.qq.com/sheet/DWVJqRHZZUmNvSURl
部分?jǐn)?shù)據(jù)如下圖:

下面是花了不到三個小時編寫的代碼(運(yùn)行環(huán)境:MATLAB2021b,低版本請自行測試),僅大致做了一遍,解題思路和最終計算出來的答案僅供大家參考,可能有錯誤之處大家自行甄別:
(1)第一問繪制圖形,這里首先需要導(dǎo)入excel的數(shù)據(jù),由于數(shù)據(jù)為表格形式,且數(shù)值型和文本型夾雜,因此這里導(dǎo)入為table類型。由于有三類不同的村莊,因此這里分別將這三類村莊的坐標(biāo)以及名稱保存為單獨(dú)的變量。畫圖的難點(diǎn)在于如何將相鄰的兩個村莊進(jìn)行連線,這里的代碼大家可以仔細(xì)閱讀。

(2)第二問實(shí)際上是圖論中一個非常經(jīng)典的問題:最小生成樹問題,沒學(xué)過的同學(xué)可以自行百度。這里我們需要先生成MATLAB中的無向圖對象,然后直接調(diào)用內(nèi)置的minspantree函數(shù)就能得到最小生成樹。
下圖紅色的即為管道的鋪設(shè)路線



(3)第三問問的有點(diǎn)奇怪:確定醫(yī)院建設(shè)在哪個村莊使得所有居民去醫(yī)院走的總路程最短。。。不難看出,這是一個規(guī)劃問題,且可能性是有限的,我們就是把所有的村莊枚舉一遍,即讓醫(yī)院分別在每個村莊建設(shè),看哪種情況下是最優(yōu)解。問題是這里的目標(biāo)函數(shù),這里給出我對于目標(biāo)函數(shù)的定義:求出各村莊到醫(yī)院的最短路徑乘以這個村子的人數(shù),將這個結(jié)果進(jìn)行求和。
在這種定義下,我給出一種很簡單的代碼寫法,只有四行,這種寫法能避免循環(huán)加快運(yùn)行速度,如果你能看懂那說明你的MATLAB基礎(chǔ)很扎實(shí):

這里的核心是distances函數(shù):
?返回矩陣?d
?= distances(G
)d
,其中?d(i,j)
?是節(jié)點(diǎn)?i
?和節(jié)點(diǎn)?j
?之間的最短路徑的長度。
大家可以查看MATLAB官網(wǎng)的幫助文檔:https://ww2.mathworks.cn/help/matlab/ref/graph.distances.html
結(jié)果表明,當(dāng)醫(yī)院設(shè)立在V1時,能夠使目標(biāo)函數(shù)最?。ㄊ聦?shí)上V1也在圖中的中心位置,這也暗示我們的結(jié)果應(yīng)該沒太大問題)