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

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

相关文章

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

maven异常Invalid bound statement(not found)的问题解决

《maven异常Invalidboundstatement(notfound)的问题解决》本文详细介绍了Maven项目中常见的Invalidboundstatement异常及其解决方案,文中通过... 目录Maven异常:Invalid bound statement (not found) 详解问题描述可

idea粘贴空格时显示NBSP的问题及解决方案

《idea粘贴空格时显示NBSP的问题及解决方案》在IDEA中粘贴代码时出现大量空格占位符NBSP,可以通过取消勾选AdvancedSettings中的相应选项来解决... 目录1、背景介绍2、解决办法3、处理完成总结1、背景介绍python在idehttp://www.chinasem.cna粘贴代码,出

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

SpringSecurity中的跨域问题处理方案

《SpringSecurity中的跨域问题处理方案》本文介绍了跨域资源共享(CORS)技术在JavaEE开发中的应用,详细讲解了CORS的工作原理,包括简单请求和非简单请求的处理方式,本文结合实例代码... 目录1.什么是CORS2.简单请求3.非简单请求4.Spring跨域解决方案4.1.@CrossOr

nacos服务无法注册到nacos服务中心问题及解决

《nacos服务无法注册到nacos服务中心问题及解决》本文详细描述了在Linux服务器上使用Tomcat启动Java程序时,服务无法注册到Nacos的排查过程,通过一系列排查步骤,发现问题出在Tom... 目录简介依赖异常情况排查断点调试原因解决NacosRegisterOnWar结果总结简介1、程序在

解决java.util.RandomAccessSubList cannot be cast to java.util.ArrayList错误的问题

《解决java.util.RandomAccessSubListcannotbecasttojava.util.ArrayList错误的问题》当你尝试将RandomAccessSubList... 目录Java.util.RandomAccessSubList cannot be cast to java.

Apache服务器IP自动跳转域名的问题及解决方案

《Apache服务器IP自动跳转域名的问题及解决方案》本教程将详细介绍如何通过Apache虚拟主机配置实现这一功能,并解决常见问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录​​问题背景​​解决方案​​方法 1:修改 httpd-vhosts.conf(推荐)​​步骤

java反序列化serialVersionUID不一致问题及解决

《java反序列化serialVersionUID不一致问题及解决》文章主要讨论了在Java中序列化和反序列化过程中遇到的问题,特别是当实体类的`serialVersionUID`发生变化或未设置时,... 目录前言一、序列化、反序列化二、解决方法总结前言serialVersionUID变化后,反序列化失

C++ 多态性实战之何时使用 virtual 和 override的问题解析

《C++多态性实战之何时使用virtual和override的问题解析》在面向对象编程中,多态是一个核心概念,很多开发者在遇到override编译错误时,不清楚是否需要将基类函数声明为virt... 目录C++ 多态性实战:何时使用 virtual 和 override?引言问题场景判断是否需要多态的三个关