Skip to content

Latest commit

 

History

History
57 lines (53 loc) · 3.51 KB

最小生成树模型.md

File metadata and controls

57 lines (53 loc) · 3.51 KB

第一部分--最小生成树(Kruskal)模型建立 $(1)$数据初始化: 构建邻接矩阵来表示各城市之间经过距离和需求匹配后边权; $(2)$排序: 将每两个顶点之间的边权$u_i$按照从小到大的顺序排列,并记录每条边$u_i$所连接的两点$v_k$和$v_m$ $(3)$选边: 按照排序出来的结果从小到大选边$u_i$并记录所连接的两点$v_p$和$v_q$,当且仅当以下三种情况出现停止选边或者跳过该条边: 第一:若新加入的这条边$e$可以和原来的树$T'$形成连通块,则跳过该条边; 第二:若无边可选,且所记录已连接的顶点不是全部顶点数量,则退出,不能构建最小生成树; 第三:若所选顶点数量已经达到全部顶点数量,则退出,最小生成树$T$已构建; $(4)$构建树: 假如可以形成一颗树,那么就必然为一棵最小生成树$T$,并将其在地图上投影出来,以供后续模型比较,在这里不对$Kruskal$算法进行证明。 第二部分--城市边权模型的建立 $(1)$数据初始化: 输入城市距离的邻接矩阵$G_1(u,v)$,输入各个城市的信息需求量矩阵$G_2$: $$G_1 = \begin{bmatrix} 0 & u_{12} &u_{13}&\ldots&u_{1k}\ u_{21} & 0 &u_{23}&\ldots&u_{2k}\ \vdots & \vdots & \vdots & \ddots &\vdots\ u_{k1} &u_{k2}& u_{k3}& \ldots &0 \end{bmatrix}$$

$$G_2=\begin{bmatrix} N_1&N_2&N_3 &\ldots &N_k\end{bmatrix}$$

其中$N_i$表示第$i$个城市的信息需求量,$u_{ij}$表示第$i$个点到第$j$个点的距离。 $(2)$边权配重: 对于任意两点$v_p$,$v_q$我们取出其距离$u_i$,两个城市的需求$N_p$,$N_q$,则新的边权$u_{i}'$为: $$u_{i}' = \frac {u_i}{N_p+N_q}$$

随着边两点的需求之和越大,则此边权越小;同理,当两点间距离越大时,此边权亦越小。特别的,当某两点的距离之和超过200km时,我们将$u_{i}'$置为-1,使其不被考虑,因为所铺设的线路最远只能到200km。 至此,我们可以得到新的边权图$G_{0}(u',v)$: $$G_0 = \begin{bmatrix} 0 & u_{12}' &u_{13} '&\ldots&u_{1k}'\ u_{21}' & 0 &u_{23}'&\ldots&u_{2k}'\ \vdots & \vdots & \vdots & \ddots &\vdots\ u_{k1}' &u_{k2}'& u_{k3}'& \ldots &0 \end{bmatrix}$$ 第三部分--求解最小生成树 $(1)$数据初始化: 经过讨论,我们将城市边权模型代入最小生成树中,求解该模型下的树$T$,数据如下: 首先是城市距离的邻接矩阵$G_1(u,v)$: (插入excel表格) 接下来是城市的需求矩阵$G_2$: (插入excel表格) 最后根据城市边权模型建立矩阵$G_{0}(u',v)$: (插入excel表格-最小生成树模型城市数据) $(2)$代入模型计算: 经过程序计算,我们得出以下结果: (插入图片--最小生成树广州图?) 第四部分--模型缺点 $(1)$边权模型的配重有可能不太符合实际,导致求出来的最小生成树所对应现实中的成本不是最优解,调整距离和两城市之间的需求配重是其主要的难点,这也意味着其预测结果精确值不是特别理想; $(2)$有可能出现环来分流城市之间的流量,最小生成树不能判断这种情况; 第五部分--参考资料 https://www.cnblogs.com/nbalive2001/p/4979667.html [贪心经典算法]Kruskal算法 https://www.cnblogs.com/skywang12345/p/3711496.html Kruskal算法(一)之 c语言详解 https://github.com/wangkuiwu/datastructs_and_algorithm/blob/master/source/graph/kruskal/udg/c/matrix_udg.c C: Kruskal算法生成最小生成树(邻接矩阵)