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

题目

题目条件

  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 >= distance
            Shortest_distance = distance;
            abab= j;
            grade = i;
            end
        end
    end
 hold 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 >= distance
            Shortest_distance = distance;
            abab= j;
            grade = i;
            end
        end
    end
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,:) = [];
end

I_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

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风铃子加油

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值