数学建模——最优管道分级铺设问题

2023-10-22 09:59

本文主要是介绍数学建模——最优管道分级铺设问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

题目条件

  1. 中心供水站只能和一级供水站连接(铺设I型管道),不能和二级供水站直接相连,但一级供水站之间可以连接(铺设I型管道)。I型管道使用1.6Mpa的DN250(10寸管),价格为571元/米,每米I型管道的铺设费用为720元。
  2. 一级供水站可以与二级供水站相连(铺设II型管道),且二级供水站之间也可以连接(铺设II型管道),II型管道使用1.6Mpa的DN125(5寸管),价格为235元/米,每米II型管道的铺设费用为210元。
  3. 各级供水站之间的连接管道必须从上一级供水站或同一级供水站的位置坐标出发,不能从管道中间的任意一点进行连接。
  4. 相邻两个供水站之间(如果有管道相连)所需管道长度可简化为欧氏距离。
  5. 受到一级供水站设备功率的影响,从一级供水站出发铺设的二级管道最多只能供水30公里,这条管道可以经过多个二级供水点,即按照该一级供水站管道输送的总里程计算。

问题求解

请您结合上述管道铺设要求建立模型讨论该地区最优输水管道建设方案,包括一级供水站的地址,I级管道和II级管道长度和分布,及最小费用等。

在这里,我将他们分为三个问题

问题一:选址问题,将180个点选出合适的一级点与二级点

问题二:一级管道与二级管道的长度和分布

问题三:最小费用

其实也可以分为两个问题,因为问题二求解出后,问题三就迎刃而解了。

问题一分析

首先,我们需要在180个点中找出一级供水站的数量和位置,因此我们先通过相关的选址模型进行筛选,在选址模型中,我们使用了覆盖模型,进而,我们使用了K-means聚类算法,将相关中心点确立为我们所需要的一级供水站的位置

问题二分析

问题二要求给出使管道总里程最小的铺设方案并且计算铺设管道的最小费用,这是一个最小生成树问题,可以分为三个步骤进行建模求解。步骤一是利用prim算法构造最小生成树模型求解管道的最小里程;步骤二是用Matlab软件编写代码,用欧式距离公式检验步骤一求出的管道是否符合“管道总里程最小”这一条件;步骤三是根据步骤一所求的I型管道、II级管道的最小里程和题目所给的管道信息求出铺设管道所用的总的最小费用。本问题的问题分析思路如下图所示:

思路

问题一思路

一开始用了三四种思路,比如p-中值选址,覆盖选址,遗传选址,最后还是用了聚类算法,进行聚点,比对了选取10,13,17,20个中心点的数据,发现在选取的这些数据中,17个中心点时能够有最优解,所以选用了17个中心点,这里的中心点即是一级供水站选点。

我们需要解决的问题是求解出一级供水站和二级供水站的分布情况,由于题目未给出一级供水站和二级供水站的具体数量和分布,我们首先应该将一级供水点与二级供水点的位置区分出来,并且确定各自的数量。这属于典型的选址问题,我们可以采用集合覆盖模型进行求解。

%先将181个点的散点图画出
V1=[5 8 10 13 17 20 25 31 35 36 41 45 41  40 38 38 33 31 33 28 24 21 22 28 43 44 25 21 22 24 37 38 37 14 16 14 18 12 15 20 13 16 21 26 28 27 29 29 36 41 39 27 23  20 6 22 40 42 37 35 35 35 34 26 27 31 31 31 28 27 24 26 13 17 21 18 21 13 14 12   10 16 18 24 25 24 24 21 17 10 9 7 4 5 2 7 7 1 2 3 2 4 5 6 9 2 7 3 3 10 17 20 24 22 21 27 26 9 12 14 19 14 13 9 2 6 7 6 5 5 16 26 29 31 28 20 17 15 21 24 26 25 15 15 10 38 37 33 40 44 41 33 32 40 42 45 29 31 30 31 35 40 40 37 35 43 45 37 35 33 37 39 41 43 47 46 42 48 42 43];  
V2=[33 9 24 34 23 10 47 18 42 25 31 38 35 34 35 37 37 36 35 32 30 31 27 29 37 39 27 29 30 32 33 33 36 13 9 7 14 6 14 13 46 39 39 44 40 42 38 44 44 40 52 49 46 46 46 44 44 40 42 49 51 52 55 53 51 51 45 41 45 35 38 39 37 36 41 41 43 39 43 43 44 44 44 44 49 49 51 48 51 34 35 37 37 42 44 32 30 24 16 18 20 24 28 24 29 33 34 30 41 36 34 22 21 17 16 19 16 16 17 15 26 28 25 19 1 6 8 14 17 16 19 13 11 14 17 19 22 23 23 23 23 25 31 29 28 26 25 21 24 44 31 24 27 14 26 33 23 30 25 23 15 16 20 20 24 23 26 28 28 29 30 30 29 31 34 43 43 45 44 50];
scatter(V1,V2,'.')     %画出180个点,以"'"表示
title('原始数据散点图')
hold on;
scatter(26,31,'*')     %画出中心点,以"*"表示
hold on;

%建立第一级、第二级最小树
%完成第一问
%最短里程是562.4008,第一级183.6268,第二级378.7740
clear;%清除工作区变量
clc;%清屏
close all;%关闭所有图形窗口%P139和V11重叠
A_x = 26;%中心点
A_y = 31;%中心点V_x = [27 2 8 2 13 40 20 48 29 37 2 2 47 39 17 10 42];%一级点
V_y = [35 44 9 33 37 14 10 45 23 42 20 1 34 52 51 28 26];%一级点P_x=[26 5 10 13 17 25 31 35 36 41 45 41 40 38 38 33 31 33 28 24 21 22 28 43 44 25 21 22 24 37 38 37 14 16 14 18 12 15 20 13 16 21 26 28 27 29 29 35 41 27 23 20 16 22 40 42 35 35 35 34 26 27 31 31 31 28 25 26 17 21 18 21 13 14 12 10 16 18 24 25 24 24 21 10 9 7 4 5 7 7 1 2 3 4 5 6 9 7 3 3 10 17 20 24 22 21 27 26 9 12 14 19 14 13 9 6 7 6 5 5 16 26 29 31 28 20 17 15 21 24 26 25 15 15 38 37 33 40 44 42 33 32 45 31 30 31 35 40 40 37 35 43 45 37 35 33 37 39 41 43 46 42 42 43];%二级点P_y=[31 33 24 34 23 47 18 42 25 31 38 35 34 35 37 37 36 35 32 30 31 27 29 37 39 27 29 30 32 33 33 36 13 9 7 14 6 14 13 46 39 39 44 40 42 38 44 43 40 49 46 46 46 44 44 40 49 51 52 55 53 51 51 45 41 45 38 39 36 41 41 43 39 43 43 44 44 44 44 49 49 51 48 34 35 37 37 42 32 30 24 16 18 24 28 24 29 34 30 41 36 34 22 21 17 16 19 16 16 17 15 26 28 25 19 6 8 14 17 16 19 13 11 14 17 19 22 23 23 23 23 25 31 29 26 25 21 24 44 31 24 27 33 30 25 23 15 16 20 20 24 23 26 28 28 29 30 30 29 31 43 43 44 50];%二级点
W = [A_x,A_y];          %中心供水站
V_point = [V_x' V_y'];  %一级供水站
P_point = [P_x' P_y'];  %二级供水站

问题二思路

选取了中心点后,问题二的计算就比较简单了,用图论中的最小生成树,结合MATLAB,即可画图求解,算出最终结果。

1)建立带权的邻接矩阵

建立一个181行181列的矩阵z,其中第i行第j列的数值表示第i个供水站到第j个供水站的距离,由于中心供水站不能与二级供水站直接相连,每个供水站也不能与自身相连,故将此矩阵第一行的第 14 至第 181 列,第一列的第14至第181行和此矩阵主对角线上的所有元素置零。

2)建立中心供水站到所有一级供水站的最小生成树

建立最小生成树有两种算法——Prim算法和Cruskal算法,在此处我们选择 Prim算法实现中心供水站到所有一级供水站的最小生成树,建立好的最小生成树如图5所示:

问题三思路

在问题二基础上,进行简单求解计算,得出结果

Num_I = 0;          %I型管数目
Num_II = 0;         %II型管数目
I_mileage = 0;      %I型管里程
II_mileage = 0;     %II型管里程
Total_mileage = 0;  %总里程distance = 0;               %两点距离
Shortest_distance = inf;    %最短距离
abab = 0;           %标号暂存
grade = 0;          %标号暂存scatter(A_x,A_y,'ko')   %画出散点图,中心点
hold on;
scatter(V_x,V_y,'r*')   %一级点
hold on;
scatter(P_x,P_y,'k.')   %二级点while size(V_point,1)           %I型管道连接方式
Shortest_distance = inf;
for j = 1:1:size(W,1)for i = 1:1:size(V_point,1)distance = (W(j,1)-V_point(i,1))^2 + (W(j,2)-V_point(i,2))^2;distance = sqrt(distance);if Shortest_distance >= distanceShortest_distance = distance;abab= j;grade = i;endendendhold on;
plot([W(abab,1),V_point(grade,1)],[W(abab,2),V_point(grade,2)],'r');
Total_mileage = Total_mileage + Shortest_distance;
I_mileage = I_mileage + Shortest_distance;Num_I = Num_I+1;W = [W;V_point(grade,1),V_point(grade,2)];
V_point(grade,:) = [];
end W(1,:) = [];   % 去掉中心供水站
WQ = W;        % WQ和最初的V_point一样,但顺序不同while size(P_point,1)           %II型管道连接方式Shortest_distance = inf;
for j = 1:1:size(WQ,1)for i = 1:1:size(P_point,1)distance = (WQ(j,1)-P_point(i,1))^2 + (WQ(j,2)-P_point(i,2))^2;distance = sqrt(distance);if Shortest_distance >= distanceShortest_distance = distance;abab= j;grade = i;endendend
hold on;
plot([WQ(abab,1),P_point(grade,1)],[WQ(abab,2),P_point(grade,2)],'k');
Total_mileage = Total_mileage + Shortest_distance;
II_mileage = II_mileage + Shortest_distance; 
Num_II = Num_II+1;
WQ = [WQ;P_point(grade,1),P_point(grade,2)];
P_point(grade,:) = [];
endI_mileage          %I型管总里程数
II_mileage         %II型管总里程数
Total_mileage      %管道总里程数

优化

后来发现,选取聚点可能还是跨度过大了,用15个聚点时结果可能会更好。

附件

序号

类型

X坐标

Y坐标

序号

类型

X坐标

Y坐标

0

A

26

31

91

P91

9

35

1

P1

5

33

92

P92

7

37

2

P2

8

9

93

P93

4

37

3

P3

10

24

94

P94

5

42

4

P4

13

34

95

P95

2

44

5

P5

17

23

96

P96

7

32

6

P6

20

10

97

P97

7

30

7

P7

25

47

98

P98

1

24

8

P8

31

18

99

P99

2

16

9

P9

35

42

100

P100

3

18

10

P10

36

25

101

P101

2

20

11

P11

41

31

102

P102

4

24

12

P12

45

38

103

P103

5

28

13

P13

41

35

104

P104

6

24

14

P14

40

34

105

P105

9

29

15

P15

38

35

106

P106

2

33

16

P16

38

37

107

P107

7

34

17

P17

33

37

108

P108

3

30

18

P18

31

36

109

P109

3

41

19

P19

33

35

110

P110

10

36

20

P20

28

32

111

P111

17

34

21

P21

24

30

112

P112

20

22

22

P22

21

31

113

P113

24

21

23

P23

22

27

114

P114

22

17

24

P24

28

29

115

P115

21

16

25

P25

43

37

116

P116

27

19

26

P26

44

39

117

P117

26

16

27

P27

25

27

118

P118

9

16

28

P28

21

29

119

P119

12

17

29

P29

22

30

120

P120

14

15

30

P30

24

32

121

P121

19

26

31

P31

37

33

122

P122

14

28

32

P32

38

33

123

P123

13

25

33

P33

37

36

124

P124

9

19

34

P34

14

13

125

P125

2

1

35

P35

16

9

126

P126

6

6

36

P36

14

7

127

P127

7

8

37

P37

18

14

128

P128

6

14

38

P38

12

6

129

P129

5

17

39

P39

15

14

130

P130

5

16

40

P40

20

13

131

P131

16

19

41

P41

13

46

132

P132

26

13

42

P42

16

39

133

P133

29

11

43

P43

21

39

134

P134

31

14

44

P44

26

44

135

P135

28

17

45

P45

28

40

136

P136

20

19

46

P46

27

42

137

P137

17

22

47

P47

29

38

138

P138

15

23

48

P48

29

44

139

P139

21

23

49

P49

35

43

140

P140

24

23

50

P50

41

40

141

P141

26

23

51

P51

39

52

142

P142

25

25

52

P52

27

49

143

P143

15

31

53

P53

23

46

144

P144

15

29

54

P54

20

46

145

P145

10

28

55

P55

16

46

146

P146

38

26

56

P56

22

44

147

P147

37

25

57

P57

40

44

148

P148

33

21

58

P58

42

40

149

P149

40

24

59

P59

37

42

150

P150

44

44

60

P60

35

49

151

P151

42

31

61

P61

35

51

152

P152

33

24

62

P62

35

52

153

P153

32

27

63

P63

34

55

154

P154

40

14

64

P64

26

53

155

P155

42

26

65

P65

27

51

156

P156

45

33

66

P66

31

51

157

P157

29

23

67

P67

31

45

158

P158

31

30

68

P68

31

41

159

P159

30

25

69

P69

28

45

160

P160

31

23

70

P70

27

35

161

P161

35

15

71

P71

25

38

162

P162

40

16

72

P72

26

39

163

P163

40

20

73

P73

13

37

164

P164

37

20

74

P74

17

36

165

P165

35

24

75

P75

21

41

166

P166

43

23

76

P76

18

41

167

P167

45

26

77

P77

21

43

168

P168

37

28

78

P78

13

39

169

P169

35

28

79

P79

14

43

170

P170

33

29

80

P80

12

43

171

P171

37

30

81

P81

10

44

172

P172

39

30

82

P82

16

44

173

P173

41

29

83

P83

18

44

174

P174

43

31

84

P84

24

44

175

P175

47

34

85

P85

25

49

176

P176

46

43

86

P86

24

49

177

P177

42

43

87

P87

24

51

178

P178

48

45

88

P88

21

48

179

P179

42

44

89

P89

17

51

180

P180

43

50

90

P90

10

34

这篇关于数学建模——最优管道分级铺设问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/260706

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

uva 11044 Searching for Nessy(小学数学)

题意是给出一个n*m的格子,求出里面有多少个不重合的九宫格。 (rows / 3) * (columns / 3) K.o 代码: #include <stdio.h>int main(){int ncase;scanf("%d", &ncase);while (ncase--){int rows, columns;scanf("%d%d", &rows, &col

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG