system: [SYSTEM]

user: 2. 优化设计数学模型 假设有一个自来水厂为周边的城市进行供水，自来水厂净化的水足够多，完全可以供应周边城市，那我们如何进行管道的铺设可以将自来水厂生产的自来水供应给周边的城市又保证所铺设的管道路线最短呢？下面我们给出两种思路的管道铺设优化方案。 2.1. 单条线路的管道铺设方案(附录1) 假设自来水厂的位置是固定的，它要供给给周边n个城市的自来水，并且我们已知任何一个城市之间的距离以及任何一个城市和自来水厂的距离。因为我们建造的是单条线路的管道，即管道由自来水厂出发经过所有的城市，最终到达最后一个城市，所以我们先固定自来水厂找到和自来水厂距离最近的城市，然后再以该城市为起点找到和它距离最近的城市，进行迭代，每次都选取最近的距离，最终所形成的路线也是最短的。 例如，在图1所示中，1表示自来水厂，2~6表示自来水厂要供给自来水的五个城市，采用单条线路进行管道铺设，每段路线长度如图1所示，问如何才能使得铺设管道的总路线最短？ 通过计算得知，从自来水厂开始铺设管道先到达3号城市，由3号城市再铺到5号城市，再到2号城市，再由2号城市到4号城市，最后铺到6号城市结束。即：1→3→5→2→4→6。图中红线部分即为 图1. 单条线路管道铺设图 管道铺设的分布图(长度单位为km)，总长度为11.3 km。 下面我们通过矩阵的形式进行解释： 第一步，构造自来水厂与各个城市之间的距离以及各个城市之间的距离，设 a 1 j 为自来水厂和第j个城市之间的距离， b i j ( i = 1 ， 2 ， ⋯ ， n ; j = 1 ， 2 ， ⋯ ， n ) 表示为第i个城市与第j个城市之间的距离，这样就可以建立一个 n × n 的矩阵A。 A = ( a 11 a 12 ⋅ ⋅ ⋅ a 1 n b 11 b 12 ⋅ ⋅ ⋅ b 1 n ⋮ ⋮ ⋱ ⋮ b n 1 b n 2 ⋅ ⋅ ⋅ b n n ) 其中，在矩阵A中当 i = j 时， b i j 表示的为自身之间的距离，为避免对数据准确性造成影响，故设为无穷大数。 第二步，比较矩阵A的第一列，得出第一列的最小值，设为 a 1 k ，其含义为自来水厂与第k个城市之间的距离最短。 第三步，以第k个城市为起点，找与第k个城市距离最短的城市。我们需要先找到矩阵A的第 k + 1 行，因为第 k + 1 行表示的是第k个城市与其他城市之间的距离。所以我们比较第 k + 1 行中各个元素的大小，可得第 k + 1 行中最小的元素为 b ( k + 1 ) m ，其含义为第k个城市与第m个城市之间距离最短。输出城市m后，将元素 b ( k + 1 ) m 所在的列上所有的元素都变为无穷大值，得到矩阵B。 B = ( a 11 ⋅ ⋅ ⋅ a 1 ( m − 1 ) ∞ a 1 ( m + 1 ) ⋅ ⋅ ⋅ a 1 n ⋮ ⋱ ⋮ ⋱ ⋮ ⋱ ⋮ b ( k + 1 ) 1 ⋅ ⋅ ⋅ b ( k + 1 ) ( m − 1 ) ∞ b ( k + 1 ) ( m + 1 ) ⋅ ⋅ ⋅ b ( k + 1 ) n ⋮ ⋱ ⋮ ⋱ ⋮ ⋱ ⋮ b n 1 ⋅ ⋅ ⋅ b n ( m − 1 ) ∞ b n ( m + 1 ) ⋅ ⋅ ⋅ b n n ) 第四步，以城市m为起点，找到与城市m距离最近的城市。先找到矩阵B的第 m + 1 行，比较 m + 1 行中所有元素的大小，得出 b ( m + 1 ) p 为最小值。按照第三步的做法将p输出，并将 b ( m + 1 ) p 所在列的所有元素变为无穷大值，得到矩阵C。 C = ( a 11 ⋅ ⋅ ⋅ a 1 ( p − 1 ) ∞ a 1 ( p + 1 ) ⋅ ⋅ ⋅ a 1 n ⋮ ⋱ ⋮ ⋱ ⋮ ⋱ ⋮ b ( m + 1 ) 1 ⋅ ⋅ ⋅ b ( m + 1 ) ( p − 1 ) ∞ b ( m + 1 ) ( p + 1 ) ⋅ ⋅ ⋅ b ( m + 1 ) n ⋮ ⋱ ⋮ ⋱ ⋮ ⋱ ⋮ b n 1 ⋅ ⋅ ⋅ b n ( p − 1 ) ∞ b n ( p + 1 ) ⋅ ⋅ ⋅ b n n ) 第五步，每次都按照第三步的方法依次进行迭代，每次输出一个值，直到最后输出完所有值，进行完n次迭代，根据依次输出的值就可以知道从自来水厂经过各个城市的最短单条线路的顺序。 本题是基于迭代思想并且运用矩阵给出的算最短路径的方法，该方法简单易懂，过程相对简单，不过对于计算机要求较高，运算起来较为麻烦，对前期数据要求较为具体，但是也从迭代的方面提出了最短路径的算法。 2.2. 树状的管道铺设方案(附录2) 我们下面运用Dijkstra算法的思想对上述问题进行进一步的优化求解，在我们的日常生活中自来水厂给周围城市进行供水一般来说不会采用单线路的管道运水方案，因为这样来说不能够做到铺设管道总路线最短，现在一般都采用树状形式的管道输水路线，这样既可以做到铺设管道总路线最短，又可以保证使用的管材最省。通过Dijkstra算法求解管道铺设总路线最短的主要思想是每次找到离源点最近的一个点，然后将该点看做源点再寻找离它最近点，通过层层迭代，最终就可以找到铺设管道的最短路线。 例如，在图2所示中，1表示自来水厂，2~6表示自来水厂要供给自来水的五个城市，现在采用树状的管道铺设方案对管道进行铺设，每段路线长度如图1所示，问如何才能使得铺设管道的总路线最短？ 同样是上面的问题，如果我们采用树状的管道铺设方案，其管道铺设方案如下图所示。 下面我们具体的进行解释： 第一步，我们先将源点到各个城市之间的距离和各个城市之间的距离用矩阵的形式表示出来。用0表示自来水厂， 1 − n 表示n个城市， a 0 j ( j = 1 ， 2 ， ⋅ ⋅ ⋅ ， n ) 表示自来水厂到n个城市之间的距离， a i j ( i = 1 ， 2 ， ⋅ ⋅ ⋅ ， n ; j = 1 ， 2 ， ⋅ ⋅ ⋅ ， n ) 表示第i个城市到第j个城市之间的距离， a i 0 ( i = 1 ， 2 ， ⋅ ⋅ ⋅ ， n ) 表示n个城市到自来水厂的距离，则表示上述距离的矩阵A可表示为： A = ( a 00 a 01 ⋅ ⋅ ⋅ a 0 n a 10 a 11 ⋅ ⋅ ⋅ a 1 n ⋮ ⋮ ⋱ ⋮ a n 0 a n 1 ⋅ ⋅ ⋅ a n n ) 其中矩阵A中 a i j ( i = j ) 时表示的是自身之间的距离，为避免对数据准确性造成影响，故设为无穷大数。 第二步，先对矩阵第一行自来水厂与各个城市之间的距离大小进行比较，假设自来水厂和城市k之间的距离最小，即 a 0 k 是第一行所有元素中最小的。先输出k值，然后将矩阵中的 a 0 k 和第 k + 1 行的元素 a k 0 都用无穷大值替换，得到矩阵B。 B = ( a 00 ⋅ ⋅ ⋅ a 0 ( k − 1 ) ∞ a 0 ( k + 1 ) ⋅ ⋅ ⋅ a 0 n ⋮ ⋱ ⋮ ⋮ ⋮ ⋱ ⋮ a ( k − 1 ) 0 ⋅ ⋅ ⋅ a ( k − 1 ) ( k − 1 ) a ( k − 1 ) k a ( k − 1 ) ( k + 1 ) ⋅ ⋅ ⋅ a ( k − 1 ) n ∞ ⋅ ⋅ ⋅ a k ( k − 1 ) a k k a k ( k + 1 ) ⋅ ⋅ ⋅ a k n a ( k + 1 ) 0 ⋅ ⋅ ⋅ a ( k + 1 ) ( k − 1 ) a ( k + 1 ) k a ( k + 1 ) ( k + 1 ) ⋅ ⋅ ⋅ a ( k + 1 ) n ⋮ ⋱ ⋮ ⋮ ⋮ ⋱ ⋮ a n 0 ⋅ ⋅ ⋅ a n ( k − 1 ) a n k a n ( k + 1 ) ⋅ ⋅ ⋅ a n n ) 图2. 树状管道铺设图 第三步，比较第1行和第 k + 1 行中所有的元素求出最小值，下面假设几种不同的情况： ① 若 a 0 m 是其中的最小值，那么表示从自来水厂直接到城市m距离最小； ② 若 a k p 是其中的最小值，那么表示从第k个城市到第p个城市之间距离最小，我们就可以从城市k直接铺设管道到达城市p，这样就会减少管道铺设的总线路，达到最节约管材。 第四步，先假设第三步中的②成立，然后将 a k p 以及矩阵B中第 p + 1 行元素 a p k 变为无穷大值，得到新的矩阵C，按照上述的方法再比较矩阵C中的第1行、第 k + 1 行和第 p + 1 行中的所有元素得出最小的元素，下面对最小的元素进行分情况讨论： ① 若 a 0 q 是最小的元素，即从自来水厂直接铺设管道到城市q会使得总路线最短； ② 若 a k w 是最小的元素，即从城市k铺设管道到城市w会使得总路线最短； ③ 若 a p r 是最小的元素，即从城市p铺设管道到城市r会使得总路线最短。 第五步，根据上述的做法进行层层迭代，就可以求出铺设管道到所有城市总路线最短的方案。 该方法较为贴合实际，对现实的生活中管道铺设方案有较为重要的指导意义，本算法是基于Dijkstra算法，在此基础上进行的进一步的改进，Dijkstra算法研究的是源点到各个顶点之间的路程最短，而我们这个算法是在保证经过所有顶点的前提下，使得总的路线最短，这样就可以达到铺设管道所用管材最省，节约社会资源。